<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: cucoleadan</title>
    <description>The latest articles on DEV Community by cucoleadan (@cucoleadan).</description>
    <link>https://dev.to/cucoleadan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1392305%2Fb8e28d8c-8302-4fe8-86e5-d09186c09b75.png</url>
      <title>DEV Community: cucoleadan</title>
      <link>https://dev.to/cucoleadan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cucoleadan"/>
    <language>en</language>
    <item>
      <title>OpenClaw vs Claude Cowork vs Perplexity Computer - Which AI Agent Actually Fits Your Life</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 17 Mar 2026 13:11:58 +0000</pubDate>
      <link>https://dev.to/cucoleadan/openclaw-vs-claude-cowork-vs-perplexity-computer-which-ai-agent-actually-fits-your-life-3008</link>
      <guid>https://dev.to/cucoleadan/openclaw-vs-claude-cowork-vs-perplexity-computer-which-ai-agent-actually-fits-your-life-3008</guid>
      <description>&lt;p&gt;You have a rare opportunity.&lt;/p&gt;

&lt;p&gt;Both Anthropic and OpenAI are running 2x usage limits on their paid plans right now. Claude Pro subscribers get double the capacity across Claude AI, Cowork, and Claude Code. ChatGPT Plus subscribers get the same bump across ChatGPT and Codex, which is awesome since you can use your ChatGPT Pro account in OpenClaw.&lt;/p&gt;

&lt;p&gt;Same price, twice the output. These promos won't last, and they've given me the perfect excuse to push all of these tools harder than I normally would.&lt;/p&gt;

&lt;p&gt;And I needed that, because three weeks ago the AI agent space exploded.&lt;/p&gt;

&lt;p&gt;In late February, the AI agent space stacked up fast. OpenClaw shipped a major security and reliability update. Days later, Anthropic launched scheduled tasks for Claude Cowork and Perplexity dropped their Computer product on the same day. Three different companies, three different visions of what an AI agent should be, all landing within the same few weeks.&lt;/p&gt;

&lt;p&gt;I've been running OpenClaw on a cloud server for months now. Claude Cowork is my daily driver for local work. I've spent a week with OpenAI's Codex after it launched its Windows app. And I've done a ton of research on Perplexity Computer, watching head-to-head comparisons, reading reviews, and studying how it stacks up against the tools I use daily.&lt;/p&gt;

&lt;p&gt;Based on all of that, I wrote this so you can make an informed decision and pick the right tool for your specific use case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sbm6jth7tugi4yw7ge2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sbm6jth7tugi4yw7ge2.png" alt="OpenClaw vs Claude Cowork vs Perplexity Computer - Which AI Agent Fits Your Life - 1" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If this kind of breakdown saves you time, &lt;strong&gt;&lt;a href="https://x.com/dann_pvn" rel="noopener noreferrer"&gt;follow me X&lt;/a&gt; for more like it.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;In this article:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Lineup&lt;/li&gt;
&lt;li&gt;Where It Runs&lt;/li&gt;
&lt;li&gt;Head to Head&lt;/li&gt;
&lt;li&gt;What It Costs&lt;/li&gt;
&lt;li&gt;Who Sees Your Data&lt;/li&gt;
&lt;li&gt;Pick Yours&lt;/li&gt;
&lt;li&gt;Where This Is Going&lt;/li&gt;
&lt;li&gt;One More: Codex&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Lineup
&lt;/h2&gt;

&lt;p&gt;Here's the 30-second version of each tool. They look similar on paper but they're built on fundamentally different philosophies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; is a self-hosted, always-on AI agent. Open-source, 319,000+ GitHub stars, recently "&lt;em&gt;acquired&lt;/em&gt;" by OpenAI. You install it on a VPS or a Mac Mini, and it runs 24/7. You talk to it over Telegram, WhatsApp, Discord, or whatever messaging platform you prefer. Think of it as a remote employee who never clocks out. You bring your own API keys, your own models, your own rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Cowork&lt;/strong&gt; is a local co-pilot that lives inside Claude Desktop. $20/month on any paid Claude plan. Best UI of the three by a wide margin. The recently added scheduled tasks feature turned it into a lightweight automation tool, letting you set up daily briefings, weekly reports, and recurring workflows. The catch: it only runs while your computer is awake and the app is open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perplexity Computer&lt;/strong&gt; is a cloud-based multi-model orchestrator. It takes your task, breaks it into subtasks, and dispatches them across 19 specialized AI models: Claude Opus for reasoning, Gemini for research, GPT-5.4 for long-context work, Grok for quick tasks. It was locked behind the $200/month Max plan at launch, but it's now available to Pro users ($20/month) through usage credits. Over 400 app integrations including Gmail, Notion, Slack, and Salesforce.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgy9zy2l8eao61d7s1rsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgy9zy2l8eao61d7s1rsy.png" alt="OpenClaw vs Claude Cowork vs Perplexity Computer - Which AI Agent Fits Your Life - 2" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Runs
&lt;/h2&gt;

&lt;p&gt;Every comparison I've read focuses on features, pricing tiers, model benchmarks. None of those tell you as much as one thing: &lt;strong&gt;where the agent runs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the fork in the road. Security, reliability, cost structure, and what the tool does for you all flow from this single architectural decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On your machine.&lt;/strong&gt; That's Claude Cowork. Easiest to start. Most polished experience. You install the desktop app, point it at a folder, and you're working. But it dies when your laptop sleeps. Scheduled tasks only fire while the app is open. If you close your lid at 6 PM, your "daily overnight report" never runs. Great for working-hours automation. Terrible for overnight agent dreams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On your server.&lt;/strong&gt; That's OpenClaw. True autonomy. It runs while you sleep, eat, and go on vacation. I've had mine running on a Hetzner VPS for months and it processes tasks at 3 AM without me lifting a finger. But you're now a sysadmin. Updates break things. Security is your responsibility. In independent testing it scored a 4 out of 10 for ease of setup. That number feels generous on a bad day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In someone else's cloud.&lt;/strong&gt; That's Perplexity Computer. Always on, zero maintenance, no servers to manage. But you're paying a premium for that convenience, and your data flows through Perplexity's infrastructure. With Pro credits now available, the entry barrier dropped significantly. Heavy users will still feel the cost.&lt;/p&gt;

&lt;p&gt;I chose to run OpenClaw and Cowork together because I need both modes. If I had to pick only one, the answer depends entirely on whether I need an agent that works while I don't. If you need something running overnight, it's OpenClaw or Perplexity. If your AI work happens during business hours, Cowork is more than enough.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faakyymsc1i3ahl5i9c2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faakyymsc1i3ahl5i9c2n.png" alt="OpenClaw vs Claude Cowork vs Perplexity Computer - Which AI Agent Fits Your Life - 3" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Head to Head
&lt;/h2&gt;

&lt;p&gt;Enough architecture. Here's how they perform across the three categories that matter most.&lt;/p&gt;

&lt;h3&gt;
  
  
  Research and Reports
&lt;/h3&gt;

&lt;p&gt;Perplexity Computer wins here, and it's not particularly close. The multi-model orchestration means it cross-references sources across different AI systems, and every output includes clickable citations with links in the footer. In one head-to-head test I studied, both tools were asked to research AI invoice automation tools and compile a one-page PDF comparison. Perplexity came back with precise pricing data, clean formatting, and source URLs you could verify in seconds.&lt;/p&gt;

&lt;p&gt;Cowork produced a solid report but broke the one-page constraint, got a team plan price wrong, and listed sources by name without linking them. Still usable, about 90% as good, but that missing 10% is the part that matters when you're sending deliverables to a client.&lt;/p&gt;

&lt;p&gt;OpenClaw handles research, but it's manual. You prompt, it fetches, you verify. There's no orchestration layer coordinating multiple models behind the scenes. It works. It's slower and requires more hand-holding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; If research is your main job, Perplexity Computer earns its price tag. For everyone else, Cowork is good enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working With Your Own Files
&lt;/h3&gt;

&lt;p&gt;Cowork dominates this category. It reads your local filesystem directly. Point it at a folder and it references, reviews, or builds on anything inside it. No uploads, no API overhead, no friction.&lt;/p&gt;

&lt;p&gt;I tested Cowork with messy client intake notes: 10 inconsistent text files with different formats, missing fields, and contradictory information. Cowork parsed them all, identified the real business bottleneck for each client, and output a clean structured spreadsheet. In the same test run by a reviewer, Perplexity handled the task but required manual file uploads for each one. It also made a weaker recommendation, suggesting ChatGPT for a client whose real problem was a bad website.&lt;/p&gt;

&lt;p&gt;OpenClaw can access server files natively, and if you've built the Nextcloud bridge I wrote about previously, it can reach anything your local AI can reach too. Different path to the same destination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; If your work lives in local files, Cowork. If it lives on a server, OpenClaw. If it lives in cloud apps like Gmail, Notion, or Google Sheets, Perplexity Computer's 400+ integrations give it the edge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation and Scheduled Tasks
&lt;/h3&gt;

&lt;p&gt;This is where the "where does it run" question hits hardest.&lt;/p&gt;

&lt;p&gt;OpenClaw was built for this. Heartbeats, cron jobs, always-on triggers, multi-platform messaging. It runs whether you're awake or not. I have mine sending me a Telegram summary of my project pipeline every morning at 9 AM. I don't touch anything. It shows up.&lt;/p&gt;

&lt;p&gt;Cowork now has scheduled tasks and they work well when they work. Daily, weekly, hourly, on-demand. The UI for managing them is cleaner than anything OpenClaw offers. But the limitation is real: they only execute while your computer is on and the app is open. If your laptop is closed, the task simply doesn't run.&lt;/p&gt;

&lt;p&gt;Perplexity Computer can handle multi-hour and even multi-day workflows autonomously in the cloud. For long-running research or complex multi-step tasks, the results are strong. But you're paying cloud prices for that always-on capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; True 24/7 automation means OpenClaw or Perplexity. For business-hours automation, Cowork handles that well.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Know someone choosing between these tools? Share this with them.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Costs
&lt;/h2&gt;

&lt;p&gt;Sticker prices lie. Here's what each tool costs when you're using it daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Cowork: $20/month.&lt;/strong&gt; Simplest math of the bunch. One subscription, everything included. No API keys, no hosting bills, no infrastructure to maintain. This is the "I want it to work, no setup" option. And right now, Anthropic is running 2x usage limits on all paid plans. Double the Cowork capacity for the same $20. If you've been waiting to try it, this is the window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw: $0 software + $6-50/month real cost.&lt;/strong&gt; The software is free and open-source. But you need somewhere to run it. A VPS costs $6-24/month depending on specs. API calls for models like Opus, Gemini Pro, or GPT-5.4 add another $10-200/month depending on how heavily you use it. Light users land under $20 total. Power users blow past $200 easily.&lt;/p&gt;

&lt;p&gt;The hidden cost is your time. Setup, maintenance, debugging when an update breaks something. OpenClaw is free in dollars but expensive in hours. I spent an entire evening once debugging a permissions conflict between OpenClaw and Nextcloud on the same server. That evening had a price even if my credit card didn't see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perplexity Computer: $20/month (Pro with credits) or $200/month (Max).&lt;/strong&gt; The Pro credits path is new and it changes the equation. You get access to the full multi-model orchestrator without the $200 commitment. But heavy workflows eat through credits fast. Max at $200/month is aimed at professionals whose time is worth more than the subscription: consultants, researchers, analysts working on problems where a single good report saves hours of manual work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The value verdict.&lt;/strong&gt; Cowork wins on pure value for most people. OpenClaw wins if you already have a VPS and enjoy tinkering. Perplexity Computer's Pro tier makes it worth trying, but Max is only justified if it saves you measurable hours every week. And with both Claude and Codex running 2x promos simultaneously, mid-March 2026 is the cheapest stress-test window you're going to get. Take advantage before it ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Sees Your Data
&lt;/h2&gt;

&lt;p&gt;This is the part that nobody wants to talk about but everybody should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; has full system access by design. It can read, write, and execute anything on the host machine. In independent testing it scored a 3 out of 10 on security. The low score comes from the architecture itself. &lt;/p&gt;

&lt;p&gt;The tool works precisely because it's unconstrained. But if you misconfigure it, everything on that machine is exposed. Your business plans, client files, API keys, all accessible. &lt;/p&gt;

&lt;p&gt;Self-hosting means you own the risk and the control.&lt;/p&gt;

&lt;p&gt;This is why I run OpenClaw behind my own server with a Nextcloud layer on top. Full control over every file, every model, every connection. But I wouldn't recommend that setup to someone who isn't comfortable managing a VPS and thinking about access control lists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Cowork&lt;/strong&gt; is sandboxed to your working folder. It scored a 9 out of 10 on security in the same evaluation. Anthropic handles the model infrastructure, you handle your files. It's the safest option out of the box by a wide margin. If security keeps you up at night, this is your tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perplexity Computer&lt;/strong&gt; is cloud-based with 400+ integrations. Your data flows through Perplexity's infrastructure and gets routed across multiple model providers. If you trust them, great. If you've built your workflow around data sovereignty and self-hosting, this is going to feel uncomfortable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfoxgo6dfzs04fam9qon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfoxgo6dfzs04fam9qon.png" alt="OpenClaw vs Claude Cowork vs Perplexity Computer - Which AI Agent Fits Your Life - 1" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick Yours
&lt;/h2&gt;

&lt;p&gt;Find yourself in 10 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Claude Cowork if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're non-technical or want zero setup friction&lt;/li&gt;
&lt;li&gt;You already pay for Claude Pro, Max, or Team&lt;/li&gt;
&lt;li&gt;Your work is mostly local files, writing, and brainstorming&lt;/li&gt;
&lt;li&gt;You want scheduled tasks that run during working hours&lt;/li&gt;
&lt;li&gt;Budget matters and $20/month all-in sounds right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose OpenClaw if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a 24/7 agent that works while you sleep&lt;/li&gt;
&lt;li&gt;You're comfortable with a VPS and basic server management&lt;/li&gt;
&lt;li&gt;You need mobile access via Telegram or WhatsApp&lt;/li&gt;
&lt;li&gt;You want full control over which models you use, where your data lives, and how everything connects&lt;/li&gt;
&lt;li&gt;You like open-source and building your own stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose Perplexity Computer if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your work is research-heavy and citation quality matters&lt;/li&gt;
&lt;li&gt;You need multi-model orchestration across providers&lt;/li&gt;
&lt;li&gt;Your workflow already lives in cloud apps like Gmail, Notion, Sheets, or Slack&lt;/li&gt;
&lt;li&gt;You want autonomous multi-day task execution without managing infrastructure&lt;/li&gt;
&lt;li&gt;You're a Pro user willing to try it with credits, or a professional where $200/month pays for itself in saved time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use more than one if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have different modes of work. Deep focus, always-on automation, and heavy research are three different jobs. These tools aren't mutually exclusive. I run OpenClaw on my VPS for overnight tasks, Cowork locally for writing and brainstorming, and bridge them through Nextcloud so both AIs share the same files. Different tools for different jobs, one shared brain.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Which combo are you running? Drop a comment, I read every one.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This Is Going
&lt;/h2&gt;

&lt;p&gt;Three major platforms shipped competing agent features in the same few weeks. All of them converging at once tells you where the industry is heading.&lt;/p&gt;

&lt;p&gt;The "build a SaaS wrapper" era is ending. Scheduled email briefings, automated research reports, CRM workflows, client intake processing. These tools do all of that out of the box now. Dozens of startups built businesses around features included in a $20/month subscription.&lt;/p&gt;

&lt;p&gt;The surviving play is learning which agent to deploy for which task, how to connect them, and how to make them share context across platforms. The people who figure out how to wire these tools together will have the real edge.&lt;/p&gt;

&lt;p&gt;Pick the right combination of agents, matched to how you work, and you'll move faster than anyone stuck choosing sides.&lt;/p&gt;

&lt;h2&gt;
  
  
  One More: Codex
&lt;/h2&gt;

&lt;p&gt;I've only been using Codex for a week, so it's not in the main comparison. But it deserves a mention because it's solving a different problem entirely.&lt;/p&gt;

&lt;p&gt;Codex is OpenAI's cloud-based coding agent, powered by codex-1, a version of o3 optimized specifically for software engineering. It comes in three flavors. &lt;strong&gt;Codex Web&lt;/strong&gt; is the autonomous cloud version: you give it a task, it spins up a sandboxed environment, works for 1 to 30 minutes, and comes back with a pull request. You can fire off multiple tasks in parallel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex Desktop&lt;/strong&gt; launched on Windows recently, which is how I've been running it, as a native app on my machine alongside Claude Desktop. &lt;strong&gt;Codex CLI&lt;/strong&gt; is the open-source command-line version, similar in spirit to Claude Code.&lt;/p&gt;

&lt;p&gt;Codex stays in one lane: software engineering. Writing code, fixing bugs, answering codebase questions, and proposing pull requests. Where the main three tools try to be general-purpose assistants, orchestrators, or always-on agents, Codex focuses on code and nothing else.&lt;/p&gt;

&lt;p&gt;It's included with ChatGPT Plus at $20/month with usage limits. Pro at $200/month gets 6x the capacity. &lt;/p&gt;

&lt;p&gt;And right now, OpenAI is running 2x usage limits on Plus, so you get double the Codex tasks for the same $20. Pair that with Anthropic's own 2x promo on Claude, and mid-March 2026 is the best window to trial both ecosystems side by side.&lt;/p&gt;

&lt;p&gt;My early impressions after a week on the Windows app: the cloud execution model is the standout feature. Fire off a task and go do something else. No terminal babysitting. I kicked off three bug fixes simultaneously and reviewed them all when they came back. &lt;/p&gt;

&lt;p&gt;The sandboxed environment means it can't break your local setup, which is a relief compared to OpenClaw's "full access to everything" philosophy. And it cites terminal logs and test outputs as evidence, so you can trace exactly what it did and why.&lt;/p&gt;

&lt;p&gt;But it's early days. I haven't stress-tested it on complex multi-file refactors yet, and I don't know how it handles edge cases in large codebases. For developers, it fills the same focused coding role in your stack. For non-developers, it won't add much.&lt;/p&gt;

&lt;p&gt;I'll write a full breakdown once I've spent more time with it. For now: if you're already paying for ChatGPT Plus, you have access. Go try it while the 2x limits last.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If this helped you pick the right tool, follow for more real-world breakdowns like this one.&lt;/strong&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Forgetting to Forget - How Infinite Memory Reinvents OpenClaw</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 10 Mar 2026 15:08:35 +0000</pubDate>
      <link>https://dev.to/cucoleadan/forgetting-to-forget-how-infinite-memory-reinvents-openclaw-46ib</link>
      <guid>https://dev.to/cucoleadan/forgetting-to-forget-how-infinite-memory-reinvents-openclaw-46ib</guid>
      <description>&lt;p&gt;I've been running OpenClaw for a few weeks now and got familiar with its pros and cons. One thing I love about it is that it saves every conversation and, if configured correctly, it can search through all past sessions. &lt;/p&gt;

&lt;p&gt;On paper, the memory system works. In practice, it has gaps. &lt;/p&gt;

&lt;p&gt;I'd reference a decision from two weeks ago and the agent would pick it up fine. Then I'd ask about something equally important from the same week and get a random response.&lt;/p&gt;

&lt;p&gt;The conversations were there, stored and searchable, but the retrieval was inconsistent. Important context slipped through the cracks, not every time, but often enough that I stopped trusting it to remember the things that mattered.&lt;/p&gt;

&lt;p&gt;After long workflow runs where subagents coordinated multi-step tasks, the problem got worse. The agent would lose track of what happened mid-chain, missing details that should have been obvious given the work it just completed. &lt;/p&gt;

&lt;p&gt;I found myself re-explaining decisions, re-stating preferences, and mentally tracking which parts of our shared history the agent could actually access versus which parts had quietly fallen out of reach.&lt;/p&gt;

&lt;p&gt;OpenClaw v2026.3.7 fixes this. &lt;/p&gt;

&lt;p&gt;The update introduces a pluggable context engine architecture and the lossless-claw plugin, making it possible for the first time to retain absolutely everything across days, weeks, months, or years. And no, this is not a premium feature locked behind a paywall, after all OpenClaw is, well, Open Sourced.&lt;/p&gt;

&lt;p&gt;I really believe this is the beginning of genuinely intelligent agents available to anyone willing to put in the work and self-host them.&lt;/p&gt;

&lt;p&gt;Here's my take on how to set this up for your OpenClaw and what it might mean in the long term.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftddhibjnbolzl0vqpiqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftddhibjnbolzl0vqpiqe.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  No More Starting Over
&lt;/h2&gt;

&lt;p&gt;The system no longer forgets who I am the moment I close the window. Every command, every conversation, every preference builds uninterrupted continuity. I pick up exactly where I left off the night before.&lt;/p&gt;

&lt;p&gt;Here's what a typical workflow looks like now. I tell my assistant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Follow up on yesterday's discussion and start drafting an email campaign. Keep my usual tone and the branding guidelines we cemented last week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assistant already knows my "usual tone." It's been watching me work for a few days (since the update came in). The branding guidelines I established are preserved, searchable, and actively informing every new output.&lt;/p&gt;

&lt;p&gt;The old setup forced me into a cycle of pasting documents or pulling info from my Notion DB. I also found myself searching through the &lt;code&gt;/memory&lt;/code&gt; folder for a past convo and pasting that inside my Telegram chat. That was really a massive time waster.&lt;/p&gt;

&lt;p&gt;Now with this upgrade I won't have to do all that. Yeah, it works for massive conversations, but I don't want to save every little, unimportant thing, but more on that later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The End of the Context Tax
&lt;/h2&gt;

&lt;p&gt;Every new AI session used to demand a toll. Re-establish who I am. Re-explain the project. Re-state my conventions. This "context tax" consumed time and mental energy better spent on actual work.&lt;/p&gt;

&lt;p&gt;Sure, you can just update your &lt;code&gt;MEMORY.md&lt;/code&gt; and &lt;code&gt;AGENTS.md&lt;/code&gt;, even the &lt;code&gt;IDENTITY.md&lt;/code&gt;, but you shouldn't pollute these super important files with info you need to fetch on demand.&lt;/p&gt;

&lt;p&gt;Think of a developer re-explaining their tech stack loses five minutes per session. Over a quarter, those minutes add up to hours burned on orientation instead of output. &lt;/p&gt;

&lt;p&gt;Or writers restating brand voice, marketers re-uploading style guides, project managers re-establishing timelines. Everyone pays the context tax, nobody benefits.&lt;/p&gt;

&lt;p&gt;Infinite memory removes this friction entirely. The entire history becomes the implicit foundation for every new request, which let's you jump directly into substantive work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5sa4m0mvs31xdrgqd2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5sa4m0mvs31xdrgqd2i.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The productivity gains are measurable. Intelligence requires context and memory to function meaningfully. When the assistant retains everything, outputs become exponentially more accurate and relevant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Previous Memory Systems Fell Short
&lt;/h2&gt;

&lt;p&gt;Older systems relied on basic vector searches to retrieve relevant conversation fragments. When I asked a question, the system computed an embedding, searched a vector database for similar embeddings, and retrieved matching fragments. &lt;em&gt;When it wanted to.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;The problem: vector similarity is a poor proxy for actual relevance.&lt;/p&gt;

&lt;p&gt;A search for "authentication" might return discussions about password hashing from six months ago, even though the current question is about OAuth implementation in a completely different project. The context window fills up with marginally relevant fragments, causing the model to hallucinate or lose track of the conversation thread.&lt;/p&gt;

&lt;p&gt;And that's how I involuntary become sort of a memory manager. I pruned chats, started fresh sessions, and developed elaborate "starter prompts" pasted at the beginning of every session to reconstruct context the system should have retained on its own.&lt;/p&gt;

&lt;p&gt;None of these workarounds addressed the core problem. Vector retrieval alone doesn't capture the nuanced thread of a long-term working relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9tdzv8ylipllidavyj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9tdzv8ylipllidavyj0.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Lossless Claw Fixes This
&lt;/h2&gt;

&lt;p&gt;Lossless Claw takes a fundamentally different approach. It replaces the AI's "forgetting" mechanism with a permanent memory system. Every conversation is stored in a fast local SQLite database, while a background AI (Gemini 3.1 Flash-Lite in my case) silently summarizes older messages into a compressed, intelligent graph. &lt;/p&gt;

&lt;p&gt;When you need context, the system retrieves exactly what's relevant from this history, combining it with your recent messages, so the AI never forgets what matters, even months from now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Boring, Technical Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Jump right ahead if you don't care about the ins and outs of how this works.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;The system keeps the most recent 20 messages completely untouched in the "fresh tail." Whatever I'm actively discussing remains in perfect, verbatim context. This means fast responses because the model has exact quotes from the active workflow rather than summaries or approximations.&lt;/p&gt;

&lt;p&gt;Once a message ages out of the fresh tail, a background process kicks in. Gemini 3.1 Flash-Lite silently summarizes and compresses those older messages into a dense graph structure. The SQLite database stores these nodes efficiently, preventing system bloat while maintaining instant accessibility. This compression runs automatically on a schedule, keeping history growth manageable without any manual intervention.&lt;/p&gt;

&lt;p&gt;When I ask a complex question requiring past knowledge, the system pulls from the compressed graph up to a 150k token retrieval limit. This boundary guarantees the main model has enough room to read relevant history and generate a high-quality response without slowing down.&lt;/p&gt;

&lt;p&gt;And the retrieval is really smart. Rather than dumping raw tokens into the context window, the system identifies the portions of history relevant to the current query and surfaces those specific sections. &lt;/p&gt;

&lt;p&gt;Think of it as a research librarian versus a keyword search. &lt;/p&gt;

&lt;p&gt;A keyword search returns every document mentioning a term. A librarian understands the question, knows the project, and brings the three documents that matter. &lt;strong&gt;The compressed graph gives the assistant that librarian's judgment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu8ie867yi4nys0jgwd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu8ie867yi4nys0jgwd0.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Lossless Claw
&lt;/h2&gt;

&lt;p&gt;No code. No terminal. No config files. The entire setup is conversational.&lt;/p&gt;

&lt;p&gt;Tell your OpenClaw this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install this https://github.com/Martian-Engineering/lossless-claw and let's configure it once it is done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One prompt. The plugin manages the SQLite lifecycle internally, covering database initialization, optimization, and maintenance without running a single command.&lt;/p&gt;

&lt;p&gt;Integrating memory into existing agents is equally straightforward. Tell your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a persistent memory profile for each of my active agents using the lossless-claw plugin.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whether there are separate agents for coding, writing, or project management, each one maintains its own coherent memory growing over time. The system stays invisible, surfacing forgotten context exactly when it's needed.&lt;/p&gt;

&lt;p&gt;For anyone who's already been running OpenClaw and has existing conversation history worth preserving, tell the gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Import my existing conversation history into the lossless-claw memory graph and index it for retrieval.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system ingests past sessions, compresses them through the same summarization pipeline, and makes them part of the permanent memory from day one. No history left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professional Tuning and My Settings
&lt;/h2&gt;

&lt;p&gt;These are settings I use when I run OpenClaw with Gemini 3.1 Pro Preview Custom Tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distillation threshold: 0.25&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This low threshold triggers the summary process early, keeping the active window clean and leaving plenty of room for complex reasoning. Early distillation means the context window stays usable even during long, demanding sessions. Tell the assistant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set the lossless-claw distillation threshold to 0.25.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fresh tail: 20 messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Preserving the last 20 messages as raw text ensures the agent understands the current flow and the most recent shifts in the conversation. Summarizing too early kills nuance. The back-and-forth of a debugging session or the evolution of an idea within a single sitting needs full fidelity to stay coherent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval limit: 150k tokens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the sweet spot between depth and speed. When I need to recall a decision from six months ago, the system pulls it in instantly while still leaving room for the current task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set my retrieval limit to 150k tokens and the fresh tail to 20 messages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w0o0jbw1empzaqf8blq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w0o0jbw1empzaqf8blq.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Flash-Lite Powers the Background
&lt;/h2&gt;

&lt;p&gt;I use Gemini 3.1 Flash-Lite to handle the summarization layer. This is a secretary task that doesn't require a high-cost reasoning model to compress facts, and Flash-Lite is built for exactly this kind of work. And it's dirt cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Memory and Shared Knowledge
&lt;/h2&gt;

&lt;p&gt;I run OpenClaw solo most of the time, but the team angle is worth talking about.&lt;/p&gt;

&lt;p&gt;Right now, each person's agent works in isolation. No shared memory of decisions, conventions, or project history. A new team member has to absorb months of tribal knowledge by asking around. Every agent profile starts from zero.&lt;/p&gt;

&lt;p&gt;Shared memory profiles fix this. The reasoning behind picking one database over another lives in the agent, not in someone's head or a forgotten Slack thread. Onboarding becomes less about catching people up and more about pointing them at a system already loaded with context.&lt;/p&gt;

&lt;p&gt;For agencies managing multiple clients, each client agent keeps its own partitioned memory. The tone and history for one account never bleeds into another.&lt;/p&gt;

&lt;p&gt;And this also applied to a team of AI agents, not necessarily to your coworkers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Privacy
&lt;/h2&gt;

&lt;p&gt;The first thing people ask about persistent memory is where the data lives.&lt;/p&gt;

&lt;p&gt;On my machine. The SQLite database, the summarized graph, all of it stays local unless I configure it otherwise. Summarization runs locally too, through models I control. Nothing goes to a third-party server to become training data, if I don't want to.&lt;/p&gt;

&lt;p&gt;I own the history. I control the models touching it. And if I need to wipe something, i just tell my OpenClaw:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Purge all memory nodes related to [project name] from my agent profile.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The memory is permanent by default, but deletion is one prompt away.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Infinite Memory Changes
&lt;/h2&gt;

&lt;p&gt;The most useful part of this update is everything I stopped doing.&lt;/p&gt;

&lt;p&gt;I stopped managing memory by hand. I stopped pasting old conversations into new sessions. I stopped wondering whether the agent remembered the decision we made last Tuesday when it answered with something that sounds a bit strange.&lt;/p&gt;

&lt;p&gt;The agent feels less like a tool I operate and more like a collaborator who has been around long enough to know how I think. I did not expect this shift to happen so fast.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenClaw almost crossed 300,000 stars on GitHub. The project started as an experimental framework and is becoming something closer to an agent operating system, and infinite memory will play a big role in this.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Install and Configure PicoClaw on the Cheapest VPS</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 17 Feb 2026 14:49:01 +0000</pubDate>
      <link>https://dev.to/cucoleadan/how-to-install-and-configure-picoclaw-on-the-cheapest-vps-1l73</link>
      <guid>https://dev.to/cucoleadan/how-to-install-and-configure-picoclaw-on-the-cheapest-vps-1l73</guid>
      <description>&lt;p&gt;OpenClaw's creator, Peter Steinberger, just joined OpenAI. The project will live on as an open-source foundation, but when the person who built the thing moves to a company with its own agent ambitions, it's worth looking at what else is out there.&lt;/p&gt;

&lt;p&gt;PicoClaw launched the same week, claims it can run a full AI agent on a $10 Raspberry Pi with less than 10MB of RAM, and it's already sitting at 12K GitHub stars. That's a bold pitch for a framework that's barely a week old.&lt;/p&gt;

&lt;p&gt;I wanted to see if it holds up. &lt;/p&gt;

&lt;p&gt;So I grabbed the cheapest ARM server Hetzner sells (€3.79/month), installed PicoClaw from scratch, connected it to OpenRouter for LLM access, and wired up a Telegram bot so I can talk to it from my phone.&lt;/p&gt;

&lt;p&gt;This is the complete walkthrough of that process, every step from a blank server to a working AI assistant.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://x.com/dann_pvn" rel="noopener noreferrer"&gt;Follow me on X&lt;/a&gt; for more like this&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Hetzner server or any other VPS;&lt;/li&gt;
&lt;li&gt;An OpenRouter account and API key;&lt;/li&gt;
&lt;li&gt;A Telegram account (for bot setup).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Fair warning: I wrote this so that anyone can follow along, even if you've never touched a terminal before. Every command is copy-paste ready. But "easy to follow" doesn't mean "zero context needed." You're spinning up an AI agent on a server you control. You should at least know what a VPS is, what an API key does, and not panic when you see a command line. If that's you, let's go.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Installing Dependencies
&lt;/h2&gt;

&lt;p&gt;First, SSH into your server and install the required build tools. PicoClaw is written in Go, so you'll need &lt;code&gt;make&lt;/code&gt; to handle the build process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update
apt &lt;span class="nb"&gt;install &lt;/span&gt;make &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs the &lt;code&gt;make&lt;/code&gt; utility, which will orchestrate the compilation process defined in PicoClaw's Makefile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztububwgegfdft1hdksm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztububwgegfdft1hdksm.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloning and Building PicoClaw
&lt;/h2&gt;

&lt;p&gt;Clone the PicoClaw repository from GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update
apt &lt;span class="nb"&gt;install &lt;/span&gt;git &lt;span class="nt"&gt;-y&lt;/span&gt;
git clone https://github.com/sipeed/picoclaw.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jylu1y4td92pza960qu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jylu1y4td92pza960qu.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navigate into the project directory and install Go dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;picoclaw
apt &lt;span class="nb"&gt;install &lt;/span&gt;golang-go &lt;span class="nt"&gt;-y&lt;/span&gt;
make deps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command downloads and installs all Go modules required by the project (similar to &lt;code&gt;npm install&lt;/code&gt; for Node.js or &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; for Python). &lt;/p&gt;

&lt;p&gt;Once dependencies are installed, compile the source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command compiles all &lt;code&gt;.go&lt;/code&gt; files into a single &lt;code&gt;picoclaw&lt;/code&gt; binary executable.&lt;/p&gt;

&lt;p&gt;Finally, install the binary to your system path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flssl2b20qqerc3rdv3qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flssl2b20qqerc3rdv3qg.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;make install&lt;/code&gt; command copies the compiled binary to &lt;code&gt;/usr/local/bin/&lt;/code&gt; (or similar), making it accessible from anywhere on your system. That’s it, now let’s connect it to a model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting to OpenRouter
&lt;/h2&gt;

&lt;p&gt;PicoClaw needs an LLM provider to function. This guide uses OpenRouter as an AI gateway, which provides access to multiple models through a single API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Your OpenRouter API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;https://openrouter.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;a href="https://openrouter.ai/settings/keys" rel="noopener noreferrer"&gt;https://openrouter.ai/settings/keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a new API key (name it something memorable like "PicoClaw")&lt;/li&gt;
&lt;li&gt;Copy the key immediately as you won't be able to see it again:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvizb88haphad2ty08frp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvizb88haphad2ty08frp.png" alt=" " width="554" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the API Connection
&lt;/h3&gt;

&lt;p&gt;Create the configuration file with your API credentials. Replace &lt;code&gt;YOUR_OPENROUTER_API_KEY&lt;/code&gt; with the key you just copied:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /root/.picoclaw/config.json &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "agents": {
    "defaults": {
      "workspace": "~/.picoclaw/workspace",
      "model": "google/gemini-3-pro-preview",
      "max_tokens": 8192,
      "temperature": 0.7,
      "max_tool_iterations": 20
    }
  },
  "providers": {
    "openrouter": {
      "api_key": "YOUR_OPENROUTER_API_KEY",
      "api_base": "https://openrouter.ai/api/v1"
    }
  }
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd2k9szezhvha5vkw9ja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd2k9szezhvha5vkw9ja.png" alt=" " width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Warning&lt;/strong&gt;: This configuration stores your API key in plain text. Ensure your server is properly secured with SSH key authentication, firewall rules, and restricted user access. Anyone with file system access can read this key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testing the Connection
&lt;/h3&gt;

&lt;p&gt;Verify that PicoClaw can communicate with OpenRouter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;picoclaw agent &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Hello, are you working?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This did not work for me on the first try because the binary is installed to &lt;code&gt;/root/.local/bin/picoclaw&lt;/code&gt;, but that directory wasn't in my PATH. So I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH=$PATH:/root/.local/bin'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This fixed the issue and I got a response!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqfpt69dsr4qgaf1oz8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqfpt69dsr4qgaf1oz8w.png" alt=" " width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If configured correctly, you should receive a response from the AI model as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Telegram Integration
&lt;/h2&gt;

&lt;p&gt;Running PicoClaw from the command line works, but integrating it with Telegram provides a much more convenient interface for daily use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Telegram Bot
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Telegram and search for &lt;code&gt;@BotFather&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Send the command &lt;code&gt;/newbot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Follow the prompts to choose a name and username for your bot&lt;/li&gt;
&lt;li&gt;Copy the bot token (format: &lt;code&gt;123456789:ABCdefGHIjklMNOpqrsTUVwxyz&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a84ehne7sik0286md0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a84ehne7sik0286md0r.png" alt=" " width="531" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Your Telegram User ID
&lt;/h3&gt;

&lt;p&gt;To restrict bot access to only your account:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for &lt;code&gt;@userinfobot&lt;/code&gt; on Telegram&lt;/li&gt;
&lt;li&gt;Send it any message&lt;/li&gt;
&lt;li&gt;Copy the numeric &lt;code&gt;Id&lt;/code&gt; it returns (e.g., &lt;code&gt;123456789&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz49fbidkjlgfgkryn19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz49fbidkjlgfgkryn19.png" alt=" " width="545" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Telegram Access
&lt;/h3&gt;

&lt;p&gt;Install &lt;code&gt;jq&lt;/code&gt; for JSON manipulation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;jq &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update the PicoClaw configuration to enable Telegram integration. Replace &lt;code&gt;YOUR_TELEGRAM_BOT_TOKEN&lt;/code&gt; and &lt;code&gt;YOUR_TELEGRAM_USER_ID&lt;/code&gt; with your actual values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'
  .channels.telegram = {
    "enabled": true,
    "token": "8534006675:AAEQasMkndYFB_039eT2q8nwEFe1IY7ZJWY",
    "allowFrom": ["1606858324"]
  }
'&lt;/span&gt; /root/.picoclaw/config.json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/config.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv&lt;/span&gt; /tmp/config.json /root/.picoclaw/config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;allowFrom&lt;/code&gt; array restricts who can use your bot. Only Telegram user IDs listed here will be able to interact with your AI agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting the Gateway
&lt;/h3&gt;

&lt;p&gt;Launch the PicoClaw gateway to activate the Telegram bot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;picoclaw gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvptn2fb74v9omrz7952.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvptn2fb74v9omrz7952.png" alt=" " width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the gateway is running, open Telegram, navigate to your bot, and click &lt;strong&gt;Start&lt;/strong&gt;. You should now be able to chat with your PicoClaw agent directly through Telegram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6al93fc42zxfes18k2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6al93fc42zxfes18k2p.png" alt=" " width="558" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running PicoClaw as a Background Service
&lt;/h2&gt;

&lt;p&gt;By default, PicoClaw runs in the foreground and stops when you close the terminal or press &lt;code&gt;Ctrl+C&lt;/code&gt;. To keep it running permanently, set it up as a systemd service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the Service File
&lt;/h3&gt;

&lt;p&gt;Create a systemd service definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/systemd/system/picoclaw.service &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
[Unit]
Description=PicoClaw Gateway
After=network.target

[Service]
ExecStart=/root/.local/bin/picoclaw gateway
Restart=always
RestartSec=5
Environment=HOME=/root

[Install]
WantedBy=multi-user.target
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enabling and Starting the Service
&lt;/h3&gt;

&lt;p&gt;Reload systemd to recognize the new service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable the service to start automatically on boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;picoclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the service immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start picoclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monitoring the Service
&lt;/h3&gt;

&lt;p&gt;Check the service status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status picoclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View real-time logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; picoclaw &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PicoClaw now runs in the background, automatically starts on server reboot, and restarts itself if it crashes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb29r2g2olhqb6fb830z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb29r2g2olhqb6fb830z.png" alt=" " width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your PicoClaw is Up-and-Running
&lt;/h2&gt;

&lt;p&gt;You now have a fully functional PicoClaw installation running on your VPS, accessible through Telegram from anywhere. This setup provides a personal AI assistant with persistent conversation history and the flexibility to customize the underlying model through OpenRouter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About the Experiment&lt;/strong&gt;: This installation serves as a head-to-head comparison with my OpenClaw instance. While PicoClaw appears more optimized and lightweight on paper, OpenClaw has been my reliable daily driver. I'll be monitoring both over the next few days to evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource consumption (CPU, RAM)&lt;/li&gt;
&lt;li&gt;Response times and reliability&lt;/li&gt;
&lt;li&gt;Model routing efficiency through OpenRouter&lt;/li&gt;
&lt;li&gt;Overall user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://x.com/dann_pvn" rel="noopener noreferrer"&gt;Follow me on X&lt;/a&gt; to keep up with what I do and this experiment's results.&lt;/p&gt;

&lt;p&gt;The main wildcard is whether OpenAI's involvement will transform OpenClaw into a proprietary "Claw" product. If that happens, PicoClaw's open-source nature makes it the more sustainable long-term choice for self-hosted AI agents.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>If you’re building with AI right now you should probably check this out. It’s a collection of 26 mental models to help you figure out what to build before you waste weeks coding.</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Wed, 07 Jan 2026 09:49:24 +0000</pubDate>
      <link>https://dev.to/cucoleadan/if-youre-building-with-ai-right-now-you-should-probably-check-this-out-its-a-collection-of-26-54fe</link>
      <guid>https://dev.to/cucoleadan/if-youre-building-with-ai-right-now-you-should-probably-check-this-out-its-a-collection-of-26-54fe</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/cucoleadan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1392305%2Fb8e28d8c-8302-4fe8-86e5-d09186c09b75.png" alt="cucoleadan"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/cucoleadan/26-mental-models-to-build-better-products-in-2026-1n1a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;26 Mental Models to Build Better Products in 2026&lt;/h2&gt;
      &lt;h3&gt;cucoleadan ・ Jan 7&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#promptengineering&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>promptengineering</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>26 Mental Models to Build Better Products in 2026</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Wed, 07 Jan 2026 09:46:41 +0000</pubDate>
      <link>https://dev.to/cucoleadan/26-mental-models-to-build-better-products-in-2026-1n1a</link>
      <guid>https://dev.to/cucoleadan/26-mental-models-to-build-better-products-in-2026-1n1a</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;This post was originally published as the &lt;a href="https://vibestacklab.substack.com/p/26-mental-models-to-build-better" rel="noopener noreferrer"&gt;26 Mental Models to Build Better Products in 2026&lt;/a&gt; in my VSL Substack publication.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two weeks of coding magic, one flawless launch and one very sad-looking usage chart. That’s what usually hits you when you build before you validate.&lt;/p&gt;

&lt;p&gt;It feels great to create until you realize you built the wrong thing beautifully.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI makes it dangerously easy to build everything, but it won't tap you on the shoulder when you're building the wrong thing.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The mental models I’m about to share are the thinking patterns that prevent this. They're quiet questions you should ask yourself before touching code.&lt;/p&gt;

&lt;p&gt;So get ready because this is going to be a long one.  I’ve put together 26 frameworks to help you decide what to build before you build it. &lt;/p&gt;

&lt;p&gt;You can bookmark this and come back to it when you're stuck between options or unsure if an idea is worth your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;WHY This Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you skip product thinking you end up building features nobody asked for. You solve problems that don't exist and waste weeks on code that, in the end, gets deleted.&lt;/p&gt;

&lt;p&gt;The pattern is predictable. You prompt AI to build a feature and deploy it perfectly, only to watch users ignore it while you wonder why flawless code didn't lead to adoption. &lt;/p&gt;

&lt;p&gt;Unfortunately, the problem was your judgment and not the execution.&lt;/p&gt;

&lt;p&gt;Maybe you didn't validate if the feature mattered and ended up building something users don't need. Or you didn't check if users would understand it and ended up creating confusion instead of clarity.&lt;/p&gt;

&lt;p&gt;And if there was something I would’ve paid to be told last year was that &lt;strong&gt;product mistakes compound quickly.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;That unused feature sits in your repo needing maintenance and ends up complicating your codebase for months. It confuses new users and ends up wasting debugging time that should have gone toward features people actually use.&lt;/p&gt;

&lt;p&gt;The real price you pay is opportunity cost. Features that would have mattered don't exist because you spent your energy building the ones that didn't.&lt;/p&gt;

&lt;p&gt;And that’s why you must start with product thinking before writing a single prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What’s A Mental Model About&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Mental models are reusable thinking patterns that help you make better decisions faster.&lt;/p&gt;

&lt;p&gt;Experienced product builders use these instinctively. Before writing any code, they ask specific questions: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who's this for? &lt;br&gt;
What problem does this solve? &lt;br&gt;
How will people discover this? &lt;br&gt;
What's the simplest version that works? &lt;br&gt;
What breaks if we get this wrong?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These frameworks are not random questions. The same pattern you use to evaluate a new feature also applies to pricing changes, onboarding flows, and API design. Learn the model once, use it everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three core principles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Decision frameworks beat implementation details.&lt;/strong&gt; Mental models help you evaluate options before you start building. They won't tell you how to code something, but they will tell you if you should code it at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern recognition works across contexts.&lt;/strong&gt; The "build vs. buy" model works for authentication just as well as it does for analytics. The "jobs to be done" model applies to landing pages just as well as feature prioritization. You are building a toolkit that works across every decision you face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevention always beats fixing&lt;/strong&gt;. You catch product mistakes in your head when changes cost nothing instead of catching them in production when they cost everything.&lt;/p&gt;

&lt;p&gt;Think of these models as a senior product manager reviewing your ideas before you build. &lt;/p&gt;

&lt;p&gt;They ask the hard questions early to force you to check if you validated demand, or if users truly understand the value.&lt;/p&gt;

&lt;p&gt;But the real difference between a person and these models is speed. &lt;/p&gt;

&lt;p&gt;A senior PM takes days to give feedback while these models take just five minutes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Needless to say that if you can afford a senior PM you should definitely run things by them.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The 26 Mental Models Framework&lt;/strong&gt;
&lt;/h2&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Product Validation Models&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;These cover what to build and when&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq2pn4of7h62u5oxwk2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq2pn4of7h62u5oxwk2f.png" alt="Product Validation Models - These cover what to build and when" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. The Mom Test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether your product idea solves a real problem&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Before building anything, especially when validating with friends/family&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your mom will tell you your app idea is great because she loves you. Friends will say "I'd totally use that!" because they don't want to hurt your feelings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The model works like this:&lt;/strong&gt; Ask people about their current behavior instead of asking then if they would use your solution.&lt;/p&gt;

&lt;p&gt;"Would you pay for a tool that organizes your bookmarks?" &lt;em&gt;is worthless.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;"Tell me about the last time you couldn't find a bookmark you saved" &lt;strong&gt;reveals whether this problem actually exists in their life.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What did you do the last time you faced this problem? How much time/money did it cost you? What solutions have you tried? How much would it be worth to solve this?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt; Forces conversations about past behavior and real pain, not hypothetical interest and polite encouragement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. The Ramen Profitable Filter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; If this feature/product can generate enough revenue to sustain you&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When choosing between multiple product ideas or features&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You need to build something that makes enough money to keep you building rather than a unicorn.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The filter asks: Can I get to 10-50 paying customers with this specific solution? It's a mistake to start with "will this scale to millions?" Just "can I find my first 50 people who will pay?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You're choosing between building AI-powered resume optimization (massive market, huge competition) or a niche tool for freelance podcast editors to manage client revisions. &lt;/p&gt;

&lt;p&gt;The resume tool might scale bigger. The podcast tool can get to 50 customers in communities you already know, like Substack, Reddit, Facebook groups or Discord servers where editors hang out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Who are the first 10 customers by name or community? What's the specific painful problem they have right now? What's a reasonable price they'd pay monthly? Does 10-50 customers at that price cover your living costs?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. The Hair-On-Fire Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether the problem is urgent enough that people will switch to your solution&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Validating problem severity before building&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Problems come in two categories: hair-on-fire urgent and "yeah, that's annoying." Only the first category makes people switch tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If someone's hair is on fire, they don't politely research solutions. They grab whatever's closest. That's the urgency level you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Losing customer data because your backup system failed? That’s the Hair-on-fire scenario which forces you to  buy a solution today. Manually copying data between two tools that takes 10 minutes weekly? Annoying, but you'll keep doing it for months before switching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Are users actively searching for solutions right now? Have they tried multiple existing solutions? Would they pay to solve this today or "eventually"? What's their current painful workaround?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt; Separates "nice to have" features that never gain traction from "must have" solutions people adopt immediately.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. The Unfair Advantage Test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Why you can build this better than anyone else&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Before committing to a product direction in a competitive space&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every idea sounds good until someone with more resources copies it in two weeks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Your unfair advantage is something that can't be easily replicated:&lt;/strong&gt; unique data access, specialized expertise, an existing audience, proprietary technology, or deep domain knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Building a generic project management tool? No unfair advantage because Notion, ClickUp, and fifty others already exist. Building a project management tool specifically for film production crews using terminology and workflows you learned from 10 years in the industry? That's an unfair advantage competitors can't copy without living your experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What do I have that competitors would need years to build? Can this be copied with money alone? Does this advantage matter to customers?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. The MVP Scope Guillotine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What's actually essential for the first version&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When scoping your first version or any major feature&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The guillotine is brutal: If users can accomplish their core goal without this feature, it doesn't make V1.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Here's how to use it:&lt;/strong&gt; State the core user goal in one sentence. Then evaluate each planned feature: "Can users accomplish [core goal] without this?" If yes, cut it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Core goal: "Help freelancers send professional invoices and get paid."&lt;/p&gt;

&lt;p&gt;Features you're considering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create invoice with line items → &lt;strong&gt;Essential&lt;/strong&gt; (can't invoice without this)&lt;/li&gt;
&lt;li&gt;Send invoice via email → &lt;strong&gt;Essential&lt;/strong&gt; (can't get paid if client doesn't receive it)&lt;/li&gt;
&lt;li&gt;Accept credit card payments → &lt;strong&gt;Essential&lt;/strong&gt; (need a way to get paid)&lt;/li&gt;
&lt;li&gt;Recurring invoices → Cut it (they can manually create monthly invoices)&lt;/li&gt;
&lt;li&gt;Expense tracking → Cut it (doesn't help them invoice clients)&lt;/li&gt;
&lt;li&gt;Client portal → Cut it (email works fine for V1)&lt;/li&gt;
&lt;li&gt;Multi-currency → Cut it (start with one market)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt; Most builders include features that feel important but aren't necessary. This model forces you to be honest about what's truly essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;User Experience Models&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decide what users are going to use and what they won’t&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl151y80att6kfku9nk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl151y80att6kfku9nk3.png" alt="User Experience Models" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. The Jobs-To-Be-Done Lens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What outcome users are hiring your product to deliver&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Designing features, writing copy, planning onboarding&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Users actually &lt;em&gt;hire&lt;/em&gt; products to get a job done&lt;/strong&gt;. Nobody wants a drill. They want a hole in the wall so they can hang a picture so their living room feels complete. The same applies to a piece of software&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This lens shifts your focus from features to outcomes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You're building a time-tracking app. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feature-focused thinking:&lt;/em&gt; "Users need start/stop timers and project categories." &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jobs-focused thinking:&lt;/em&gt; "Users need to bill clients accurately without manually reconstructing what they worked on."&lt;/p&gt;

&lt;p&gt;That insight changes everything. In this case the job is generating accurate invoices rather than just tracking time. So maybe the solution is not manual timers but automatic time detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What's the user trying to accomplish? What's their life like before and after using this feature? What alternatives are they using now? What job is that alternative really doing?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. The Empty State Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How to design the experience when users have no data yet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Every time you build a dashboard, list view, or data display&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most builders design for the full state. During development you use dummy data so your dashboard is populated with numbers, graphs, and activity. But every user starts with nothing. &lt;strong&gt;Empty states either guide users to success or lose them immediately.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example of empty state failure:&lt;/strong&gt; User signs up for your analytics tool. They land on a dashboard showing... blank graphs and "No data available." They don't know what to do next. They close the tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of empty state success:&lt;/strong&gt; Same dashboard, but empty state shows: "Connect your first data source to see insights" with a big button labeled "Connect Google Analytics." Below: "This takes 2 minutes and you'll see your first dashboard immediately." *&lt;em&gt;**Clear next action.&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What does a first-time user see? Is the next action obvious? Does the empty state feel broken or intentionally helpful? Can they reach a "success" state in their first session?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. The Error Message Principle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How to communicate what went wrong and what to do next&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Writing any error, warning, or validation message&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Invalid input" is useless.&lt;/strong&gt; "Email addresses can't contain spaces. Please remove any spaces and try again" tells users exactly how to fix it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The principle has three parts: (1) What went wrong, (2) Why it's wrong, (3) How to fix it.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bad error message:&lt;/strong&gt; "Authentication failed"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good error message:&lt;/strong&gt; "Wrong password. Check your caps lock and try again. [Reset password]"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bad error message:&lt;/strong&gt; "File upload error"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good error message:&lt;/strong&gt; "This file is 12MB but our limit is 10MB. Try compressing it or splitting into smaller files."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Does this message explain what specifically went wrong? Does it tell users how to fix it? Would someone non-technical understand this?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;9. The Progressive Disclosure Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How much information to show at once&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Designing complex interfaces, multi-step processes, settings pages&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Showing everything at once overwhelms users.&lt;/strong&gt; Progressive disclosure reveals information in layers starting with basics and only showing advanced options when needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Settings page with 40 options all visible at once? Overwhelming. Settings page organized into "General" (5 basics visible) with "Advanced Settings" collapsed below? Manageable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pattern works in onboarding too:&lt;/strong&gt; Don't explain every feature on day one. Show the core workflow first. Introduce advanced features when users are ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What does every user need to see immediately? What can wait until they ask for it? Can beginners accomplish their goal without seeing advanced options?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;10. The Feedback Loop Check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether users understand that their action worked&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Any user action including buttons, forms, saves, deletions&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Users click "Save." The button does nothing visible. Did it work? They click again. And again. Now they've created three duplicate entries because there was no feedback.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Every user action needs a closed feedback loop:&lt;/strong&gt; Loading state (processing), success state (it worked), or error state (it failed).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button click → Button shows spinner → Success message appears → Button returns to normal&lt;/li&gt;
&lt;li&gt;Form submission → "Saving..." indicator → "Saved successfully" with checkmark → Form clears or navigates&lt;/li&gt;
&lt;li&gt;File upload → Progress bar → "Upload complete" → File appears in list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; After clicking/submitting, does the user know immediately that something is happening? Do they know when it's complete? If it fails, do they know what went wrong?&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Technical Decision Models&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decide if that feature is worth your time and effort&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvbqu2fmb3mrn6xlm0u9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvbqu2fmb3mrn6xlm0u9.png" alt="Technical Decision Models" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;11. The Build vs. Buy Scorecard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether to code it yourself or use a third-party service&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Evaluating authentication, payments, email, analytics, search&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a scoring system with three questions, each rated 0-10:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is this core to my product's unique value?&lt;/strong&gt; (0 = commodity, 10 = your secret sauce)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there a battle-tested solution I can buy?&lt;/strong&gt; (0 = I'd need to build it, 10 = Stripe/Auth0 level quality exists)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Will building this take more than one week?&lt;/strong&gt; (0 = few hours, 10 = months of work)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;If questions 2 and 3 score high (15+ combined), buy it. If question 1 scores high (8+), consider building.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Authentication for your SaaS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core to your value? 2/10 (everyone needs auth, it's not your differentiator)&lt;/li&gt;
&lt;li&gt;Battle-tested solution exists? 10/10 (Clerk, Supabase Auth, Auth0, dozens of options)&lt;/li&gt;
&lt;li&gt;Takes more than a week? 9/10 (OAuth, password reset, session management, security is complex)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Score: Buy it.&lt;/strong&gt; You'd spend weeks building something that Clerk gives you in 30 minutes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Counterexample:&lt;/strong&gt; Your AI-powered keyword research algorithm&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core to your value? 10/10 (this IS your product)&lt;/li&gt;
&lt;li&gt;Battle-tested solution exists? 3/10 (generic SEO tools exist but not your specific approach)&lt;/li&gt;
&lt;li&gt;Takes more than a week? 8/10 (yes, it's complex)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Score: Build it.&lt;/strong&gt; This is your unfair advantage.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;12. The Complexity Budget&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether this solution is too complicated for the problem&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Choosing between simple and sophisticated solutions&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every abstraction, pattern, library, and framework you add is debt. You maintain it forever, debug it, explain it to AI, and work around its limitations. &lt;strong&gt;You have a limited complexity budget so you must spend it wisely.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You need to store user preferences (theme, language, timezone).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex solution:&lt;/strong&gt; Set up Redis for caching, create a separate microservice for preferences, implement pub/sub for real-time updates across sessions, add GraphQL subscriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple solution:&lt;/strong&gt; Add three columns to your users table. Read them on login. Update them on save.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The complex solution might be "better" architecturally. But is it worth the complexity for a feature that reads three values on login? That's the budget question.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What's the simplest solution that works? What complexity am I adding and why? Will I still understand this code in six months? Am I solving today's problem or a hypothetical future problem?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;13. The Data Architecture Question&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How to structure your database and relationships&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Planning database schema for a new feature&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design your database for the queries you'll run most often, not for theoretical elegance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Building a blog platform. Each post has an author, tags, and comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read patterns you'll have:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show all posts (with author name and tag names) → Happens constantly&lt;/li&gt;
&lt;li&gt;Show one post with all comments → Happens constantly&lt;/li&gt;
&lt;li&gt;Show all posts by one author → Occasional&lt;/li&gt;
&lt;li&gt;Show all posts with a specific tag → Occasional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This tells you:&lt;/strong&gt; Denormalize author name and tag names onto posts table for fast listing. It's okay to repeat data if it makes your common queries fast. The "perfectly normalized" approach requires joins on every page load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What data will I fetch on every page load? What queries will users run most often? Is it okay to duplicate some data for speed? Can I add an index to make this fast?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;14. The Good Enough Threshold&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; When to ship vs. keep refining&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Before every deployment when you're tempted to add "just one more thing"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Perfectionism kills momentum.&lt;/strong&gt; Ship when it solves the core problem, even if it's not polished because you can always iterate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You built a contact form. Current state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Users can enter name, email, message&lt;/li&gt;
&lt;li&gt;✅ Validation works&lt;/li&gt;
&lt;li&gt;✅ Submissions save to database&lt;/li&gt;
&lt;li&gt;✅ You get notified&lt;/li&gt;
&lt;li&gt;❌ No auto-reply confirmation email&lt;/li&gt;
&lt;li&gt;❌ No fancy animations&lt;/li&gt;
&lt;li&gt;❌ No file attachments&lt;/li&gt;
&lt;li&gt;❌ No CAPTCHA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Does the "happy path" work reliably from start to finish? Is this missing feature a functional blocker, or just embarrassing to my ego? Will the user fail to achieve their primary goal without this? Can I manually handle the edge cases for the first 10 users?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;15. The Third-Party Risk Assessment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether to depend on an external service&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Integrating any API, library, or platform&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every external dependency creates a blast radius where their failure, pricing changes, or disappearance becomes your emergency.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Risk tiers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptable risk:&lt;/strong&gt; Stripe for payments. If Stripe fails, payments fail, but that's true for everyone. Stripe is battle-tested and reliable. The alternative is building your own payment processor, &lt;strong&gt;&lt;em&gt;which is insane&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moderate risk:&lt;/strong&gt; Segment for analytics. If it fails, you lose tracking data, but your app still works. The alternative is sending events directly to multiple analytics tools, which is annoying but manageable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dangerous risk:&lt;/strong&gt; Your entire app depends on one founder's side project API that could shut down tomorrow. If it fails, your app fails. No fallback exists. This is unacceptable risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What breaks if this service fails? How likely is failure? How hard is it to switch to an alternative? Is this service core infrastructure or a nice-to-have feature?&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;AI-Assisted Building Models&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decide when the AI is right and when it is wrong&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1l1gm1wdgtg2u8axa6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1l1gm1wdgtg2u8axa6i.png" alt="AI-Assisted Building Models" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;16. The AI Review Checklist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether AI-generated code is production-ready&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; After AI generates any code before you commit it&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI models default to the "happy path," writing code for a perfect world where inputs are valid, APIs never fail, and bad actors don't exist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;AI has five predictable blind spots. Check these every time:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Validation:&lt;/strong&gt; Does it validate user input on both frontend and backend?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Error handling:&lt;/strong&gt; What happens when API calls fail, files are missing, or data is malformed?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Edge cases:&lt;/strong&gt; What if the user uploads a 500MB file? Enters emoji? Submits the form twice?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Security:&lt;/strong&gt; Does it sanitize inputs? Check permissions? Prevent injection attacks?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Performance:&lt;/strong&gt; Will this work with 1,000 records? What about 100,000?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; AI generates a file upload function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI probably included:&lt;/strong&gt; Basic upload logic, saving to storage, returning success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI probably missed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File size limits (user uploads 2GB video, server crashes)&lt;/li&gt;
&lt;li&gt;File type validation (user uploads .exe file, security risk)&lt;/li&gt;
&lt;li&gt;Error handling if storage is full&lt;/li&gt;
&lt;li&gt;What happens if upload is interrupted&lt;/li&gt;
&lt;li&gt;Duplicate filename handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Run through the checklist. Add what's missing.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;17. The Feature Architecture Sketch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How to structure a feature before prompting AI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Before building any non-trivial feature&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Five-minute sketch saves hours of AI going in circles. Map the data flow: User action → Frontend → Backend → Database → Response&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Building a "save for later" feature for articles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick architecture sketch:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. User clicks "Save" button on article 
2. Frontend: Disable button, show spinner
3. Frontend: Send POST to /api/saves with article_id
4. Backend: Check if user is authenticated
5. Backend: Check if article exists
6. Backend: Check if already saved (prevent duplicates)
7. Backend: Insert into saves table with user_id + article_id + timestamp
8. Backend: Return success with saved article data
9. Frontend: Update UI to show "Saved" state, enable button
10. Handle errors: Not authenticated, article not found, database error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when you prompt AI, you give it this sketch. AI knows exactly what to build. &lt;strong&gt;Without the sketch, AI makes assumptions and you spend an hour iterating.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What triggers this feature? What data moves where? What can go wrong at each step? What does success look like? What does failure look like?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;18. The Context Window Strategy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What information to include in your AI prompts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Starting any new feature or debugging complex issues&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Strategic context makes AI 10x more useful. Random context makes it confused.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What to include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database schema (relevant tables only)&lt;/li&gt;
&lt;li&gt;Existing code patterns from your project&lt;/li&gt;
&lt;li&gt;Error messages (full stack trace)&lt;/li&gt;
&lt;li&gt;Specific requirements and edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to skip:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementation history ("I tried X then Y")&lt;/li&gt;
&lt;li&gt;Vague goals ("make it better")&lt;/li&gt;
&lt;li&gt;Unrelated code&lt;/li&gt;
&lt;li&gt;Your entire codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of a good prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to add email validation to my signup form.

Current schema:
users table: id, email, password_hash, created_at

Current pattern (from login.ts):
We use Zod for validation
We return errors as {field: string, message: string}
We validate on both frontend and backend

Requirements:
Check for valid email format
Check if email already exists (return friendly error)
Case-insensitive email check
Trim whitespace before validating

Generate the validation function for backend.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prompt includes schema, existing patterns, and specific requirements so AI can generate exactly what you need.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;19. The Iteration Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; How to improve AI output without starting over&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When AI code almost works but has issues&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iterate surgically. Point to the specific problem and requested change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The pattern: (1) Identify the specific line or section, (2) Explain what's wrong, (3) State exactly what you want instead.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bad iteration:&lt;/strong&gt; "This doesn't work. Make it better."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good iteration:&lt;/strong&gt; "The form submits successfully but doesn't show a success message. Add a toast notification after line 47 that says 'Settings saved' and clears after 3 seconds."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bad iteration:&lt;/strong&gt; "Add error handling."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good iteration:&lt;/strong&gt; "Add a try-catch around the API call on line 23. If it fails, set error state to 'Unable to load data. Please try again.' and show it in a red alert box."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;20. The AI Blind Spot Map&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What categories of problems to always check manually&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Any AI-generated feature touching real users&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI writes code for a single user in a perfect vacuum, consistently missing the "invisible" systemic chaos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;AI has predictable blind spots across five categories:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Race conditions:&lt;/strong&gt; Two users click at the same time—does data get corrupted?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Proper validation:&lt;/strong&gt; Frontend validation exists, but does backend validate too?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Edge case handling:&lt;/strong&gt; Empty arrays, null values, missing data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Security:&lt;/strong&gt; Authentication checks, permission verification, input sanitization&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Async logic:&lt;/strong&gt; Promises, error handling in async operations, loading states&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a habit of checking this manually as from experience I can tell you that AI misses these categories almost every time…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; AI builds a "delete account" feature. Check the blind spots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Race condition:&lt;/strong&gt; Can user trigger delete twice? &lt;em&gt;Add request debouncing&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Does it check if user is deleting their own account? &lt;em&gt;Add permission check&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge cases:&lt;/strong&gt; What if user has active subscriptions? &lt;em&gt;Add validation before delete&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Does it require password confirmation? &lt;em&gt;Add confirmation step&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async:&lt;/strong&gt; Does it handle database errors? &lt;em&gt;Add error handling and rollback&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Without this checklist, you ship code with security holes and broken edge cases.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Product Growth Models&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decide how to expand your product offering and what to charge for it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjziihjz64s4x1rfu14g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjziihjz64s4x1rfu14g.png" alt="Product Growth Models" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;21. The Pricing Validation Test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Whether your pricing makes sense to buyers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Setting initial pricing or considering changes&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show your pricing tiers to 10 target users. If they can't choose a tier in 30 seconds, your pricing is broken.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The test reveals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can users self-identify which tier fits them?&lt;/li&gt;
&lt;li&gt;Do they understand the value difference between tiers?&lt;/li&gt;
&lt;li&gt;Are tier names clear (not cute)?&lt;/li&gt;
&lt;li&gt;Do limits make sense?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of bad pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Starter:&lt;/strong&gt; $19/mo - "For individuals"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth:&lt;/strong&gt; $49/mo - "For growing teams"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; $99/mo - "For professionals"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;User confusion:&lt;/strong&gt; "I'm an individual but also professional. I'm not growing but I have a team of 2. Which tier?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of good pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo:&lt;/strong&gt; $19/mo - Up to 5 projects, 1 user&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team:&lt;/strong&gt; $49/mo - Up to 25 projects, up to 5 users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business:&lt;/strong&gt; $99/mo - Unlimited projects, unlimited users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;User clarity:&lt;/strong&gt; "I have 3 projects and work alone. Solo plan." Decision made in 10 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Can users identify their tier based on concrete limits? Do tier names describe who it's for or how much they can do? Would you be able to choose if you were seeing this for the first time?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;22. The Impact vs. Effort Matrix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; Which features to build next&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Feature prioritization and roadmap planning&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;True velocity is about aggressively filtering out "Low Impact, High Effort" traps that feel productive to build but deliver nothing to the user.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Plot every potential feature on two axes: User impact (low to high) and Development effort (low to high).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Four quadrants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High impact, low effort:&lt;/strong&gt; Build these first (quick wins)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High impact, high effort:&lt;/strong&gt; Build these next (major features)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low impact, low effort:&lt;/strong&gt; Build if you have spare time (nice-to-haves)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low impact, high effort:&lt;/strong&gt; Never build these (time sinks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Features under consideration example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;High impact, low effort:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add password reset link to login page (1 hour, prevents 20% of support tickets)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;High impact, high effort:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build API for integrations (2 weeks, enables enterprise customers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Low impact, low effort:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add dark mode (3 hours, some users will appreciate it)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Low impact, high effort:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build custom analytics dashboard (3 weeks, competitors exist, users won't switch for this)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Build in this order: password reset → API → dark mode when slow → skip custom analytics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Is this feature actually valuable or just fun to build? Can we get 80% of the impact with 20% of the effort? If we don't build this, will users actually leave?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;23. The Five-User Interview Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What users actually need vs. what they say they want&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Planning new features or understanding why adoption is slow&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just five conversations focused on past behavior can reveal more actionable data than 1,000 surveys asking about future wishes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The pattern:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;How do you currently solve [problem]?&lt;/strong&gt; (Reveals workarounds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk me through the last time you did [task].&lt;/strong&gt; (Actual behavior)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's frustrating about how you do it now?&lt;/strong&gt; (Real pain points)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What have you tried to fix this?&lt;/strong&gt; (Shows urgency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If we solved this, what would you do differently?&lt;/strong&gt; (Validates impact)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What you're listening for:&lt;/strong&gt; Patterns across multiple users. If 4 out of 5 mention the same workaround, that's your feature opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You're building a content calendar tool. User interviews reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5/5 users currently use Google Sheets&lt;/li&gt;
&lt;li&gt;4/5 users manually check LinkedIn/Twitter to see what competitors posted&lt;/li&gt;
&lt;li&gt;5/5 users forget to repurpose content across platforms&lt;/li&gt;
&lt;li&gt;2/5 users want AI writing assistance (not a pattern yet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Build competitive content tracking and cross-platform reminders. Leave AI writing for later because there isn't enough demand signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Did they complain about a problem, or did they prove they are trying to solve it? Am I listening to the loudest user or the recurring pattern? Did I ask "would you use this" (bad) or "how do you do this now" (good)?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;24. The One Metric Focus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; What success metric this feature moves&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Before building any feature intended to improve the product&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shipping code without a defined success metric is just recreational engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every feature needs one primary metric that defines success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shift from "Building" to "Solving":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bad planning:&lt;/strong&gt; "We're building a referral program because it would be cool."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good planning:&lt;/strong&gt; "We're building a referral program to &lt;strong&gt;increase new user signups by 20%&lt;/strong&gt;. Success = 1 in 5 users refers someone."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;More examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Add onboarding tutorial" → &lt;strong&gt;Metric:&lt;/strong&gt; Increase activation rate (users who complete first task) from 40% to 60%&lt;/li&gt;
&lt;li&gt;"Build API documentation" → &lt;strong&gt;Metric:&lt;/strong&gt; Reduce API-related support tickets by 50%&lt;/li&gt;
&lt;li&gt;"Add social proof to landing page" → &lt;strong&gt;Metric:&lt;/strong&gt; Increase conversion rate from 2% to 3%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; What specific metric will move if this works? How will we measure it? Do we have a baseline for that number right now? If the metric doesn't move, will we kill the feature or iterate on it?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;25. The Pivot vs. Persist Framework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; When to change direction vs. keep iterating&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When growth stalls or user feedback is consistently negative&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Abandoning a good idea because of bad execution is a tragedy, but polishing a product nobody wants it’s the fastest way to bankruptcy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Pivot when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Users consistently say "I don't have this problem" &lt;em&gt;(Problem validation failed)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;❌ Free users like it but nobody will pay &lt;em&gt;(Value proposition broken)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;❌ Churn is high because the product doesn't solve a core need.&lt;/li&gt;
&lt;li&gt;❌ You repeatedly hear "I'd use this if it did X instead" &lt;em&gt;(Wrong solution)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Persist when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Users confirm the problem is real and painful.&lt;/li&gt;
&lt;li&gt;✅ Some users are willing to pay but pricing/packaging needs work.&lt;/li&gt;
&lt;li&gt;✅ Churn happens because of execution issues &lt;em&gt;(bugs, missing features)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;✅ You hear "I love this but wish it had Y feature" &lt;em&gt;(Right direction, needs iteration)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You built a project management tool for freelancers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pivot Signal:&lt;/strong&gt; After 6 months, users say, "I don't actually need project management—I just work on one project at a time. I need invoicing." → &lt;em&gt;Problem validation failure. Pivot to invoicing.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persist Signal:&lt;/strong&gt; Users say, "I love this but it's missing recurring tasks and a mobile app." → &lt;em&gt;Execution issue. Persist and build the missing features.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Are users complaining about bugs (fix it) or the concept (kill it)? Do they wish it worked better, or do they wish it was something else entirely? Is the refusal to pay about the price or the value?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;26. The Feature Kill Switch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decides:&lt;/strong&gt; When to remove features that aren't working&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Regular product audits and when considering feature expansion&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every unused feature is a permanent tax on your codebase that slows down every future deployment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"Zombie" Feature Tax:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance Burden:&lt;/strong&gt; You still have to debug, explain, and test code that nobody uses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface Clutter:&lt;/strong&gt; More buttons mean more confusion for new users trying to find the core value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False Confidence:&lt;/strong&gt; Usage metrics look healthy overall, but the engagement is diluted across 20 mediocre features instead of 3 great ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kill Switch Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify:&lt;/strong&gt; Flag features used by &amp;lt; 5% of users in the past 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigate:&lt;/strong&gt; Is it broken, hidden, or just useless?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Announce:&lt;/strong&gt; Give users 30 days notice to save their data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete:&lt;/strong&gt; Remove the code entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listen:&lt;/strong&gt; If nobody complains, you just made your product better.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Monthly Feature Audit&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core workflow:&lt;/strong&gt; 100% usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to CSV:&lt;/strong&gt; 65% usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom templates:&lt;/strong&gt; 45% usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk actions:&lt;/strong&gt; 25% usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom emoji reactions:&lt;/strong&gt; 3% usage → &lt;em&gt;Kill this&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar view:&lt;/strong&gt; 2% usage → &lt;em&gt;Kill this&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Key questions:&lt;/strong&gt; Does this feature pay rent? If we deleted this tomorrow, would our support inbox actually notice? Are we keeping this because it adds value, or just because we already wrote the code?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;This is a lot. You don't need to memorize all 26 models right now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of this as your 2026 reference guide. Bookmark it and come back when you're facing a specific decision, like: should I build this feature, how do I price this, is this AI code production-ready, which feature matters most?&lt;/p&gt;

&lt;p&gt;The mental models you use most often will become instinctive.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Gold Nugget 💡&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Here's how to actually use these mental models: use the 5-Minute Product Think framework.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you prompt AI or write any code, spend five minutes asking which mental models apply. Write out 3-5 questions based on those models. Use the answers to guide what you build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy-paste ready template:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;text&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before I build [FEATURE]:
1. Product Validation: Is this a hair-on-fire problem or nice-to-have?
2. User Experience: What does the empty state show and what action should users take?
3. Technical Decision: Is this core to my value or should I use a third-party service?
4. What could go wrong: What edge cases will break this in production?
5. Success looks like: What metric moves if this feature works?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adapt the questions based on which models fit your situation. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Building a new feature?&lt;/em&gt; Use product validation and UX models. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reviewing AI code?&lt;/em&gt; Use the AI review checklist and good enough threshold. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Choosing your tech stack?&lt;/em&gt; Use build vs. buy and complexity budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This framework works because it forces product thinking &lt;em&gt;before&lt;/em&gt; code thinking. It catches misaligned expectations when changes cost nothing and gives AI better context for what you actually need.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let me show you this in action with a real scenario:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're thinking of adding social sharing to your app. Five-minute product think:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hair-on-fire problem (Model #3):&lt;/strong&gt; Are users actively asking to share? Check support tickets and interviews. Result: Nobody mentioned sharing in the last 50 conversations. Not urgent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jobs-to-be-done (Model #6):&lt;/strong&gt; What job would sharing solve? Maybe: "Get my teammates to sign up." But is that really how B2B tools spread? Result: Direct invites probably work better than social sharing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build vs. buy (Model #11):&lt;/strong&gt; If we build this, use a library or write custom? Result: Social sharing libraries exist, but...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact vs. effort (Model #22):&lt;/strong&gt; High or low impact? Low (nobody's asking). High or low effort? Medium (2-3 days with testing). Result: Low impact, medium effort = don't build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One metric (Model #24):&lt;/strong&gt; What metric would this move? Signups? But we get 90% of signups from SEO and direct outreach, not social sharing. Result: Won't move our key metrics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Decision after 5 minutes: Skip social sharing. Build the team invitation feature instead (users actually asked for this).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See how the models work together? You prevented wasting 3 days building something nobody needs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to skip this:&lt;/strong&gt; Quick experiments, throwaway prototypes, learning exercises, anything that won't touch real users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it's essential:&lt;/strong&gt; Features that real users will interact with, technical decisions that affect your architecture o product changes that impact revenue.&lt;/p&gt;

&lt;p&gt;The five minutes you spend thinking through mental models saves hours of building the wrong thing. And hours of debugging the right thing built wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Let's Connect&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Which of these 26 mental models do you wish you'd known about six months ago?&lt;/p&gt;

&lt;p&gt;Or what product decision are you facing right now that could use a mental model? Reply and tell me. I read every response and often turn common questions into future articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Build With Better Judgment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Bookmark this page. Use it all year. Come back when you're facing a decision and not sure how to think it through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You'll still build fast with AI but now you'll just build the right things.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Mental models are how experienced builders think. Now they're how you think too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;This post was originally published as the &lt;a href="https://vibestacklab.substack.com/p/26-mental-models-to-build-better" rel="noopener noreferrer"&gt;26 Mental Models to Build Better Products in 2026&lt;/a&gt; in my VSL Substack publication.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>promptengineering</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>How to Prompt AI for Consistent JSON Responses</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 02 Dec 2025 14:03:05 +0000</pubDate>
      <link>https://dev.to/cucoleadan/how-to-prompt-ai-for-consistent-json-responses-1gbm</link>
      <guid>https://dev.to/cucoleadan/how-to-prompt-ai-for-consistent-json-responses-1gbm</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally posted on the &lt;a href="https://vibestacklab.substack.com/p/how-to-prompt-ai-for-consistent-json" rel="noopener noreferrer"&gt;VSL Substack publication&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You just used AI to generate your API integration code, tested it locally, and deployed it to production because it seemingly worked perfectly. Two hours later, your logs are filled with parsing failures and users cannot complete actions because "Invalid JSON" errors are popping up everywhere. The AI gave you working code, but the problem is that it only worked in your controlled test environment with your specific input.&lt;/p&gt;

&lt;p&gt;It happened to me so many times I lost count, so I’m going to share one of the best ways to get your AI to generate valid json, every single time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt9g6nxaevfcah1x6hkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt9g6nxaevfcah1x6hkb.png" alt="Consistent JSON Output System" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad JSON Means High Costs
&lt;/h2&gt;

&lt;p&gt;When you are building features that depend on structured data like API integrations, database operations, or configuration files, JSON consistency directly determines whether your app works or breaks. A single malformed response can quickly cascade into hundreds of failed user actions, corrupt database writes, and support tickets flooding your inbox.&lt;/p&gt;

&lt;p&gt;While AI generates JSON that looks correct during development, production environments expose inconsistencies like missing commas, trailing commas in strict parsers, unescaped quotes in user-generated content, and Unicode characters from international users. These small formatting errors crash entire features, so you need AI to output valid and production-ready JSON consistently instead of just succeeding in your local tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Airport Security Model
&lt;/h2&gt;

&lt;p&gt;Airport security examines your documents multiple times at check-in, security, and the gate because mistakes are expensive to fix later. JSON validation works the same way because AI generates structurally sound JSON in controlled conditions but often breaks under real-world variance. That’s why you need to build multiple validation checkpoints to catch these errors.&lt;/p&gt;

&lt;p&gt;Most builders stop at the prompt, but production-ready apps require five distinct checkpoints to ensure reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Common Ways AI Breaks Your Data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Syntax Errors:&lt;/strong&gt; Missing or extra commas, brackets, or quotes break &lt;code&gt;JSON.parse()&lt;/code&gt; immediately on your server. For example, AI often adds a trailing comma after the last object property or forgets to close a nested object properly. While some lenient parsers might handle this, standard Node.js or Python backends will throw an exception and crash the request before your logic even runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escaped Character Traps:&lt;/strong&gt; One of the most insidious errors occurs when AI double-escapes characters inside the JSON string itself (e.g., returning &lt;code&gt;\\"&lt;/code&gt; instead of &lt;code&gt;\"&lt;/code&gt;). This technically creates a valid string but invalid JSON content for your parser, causing it to fail when processing fields that contain quotes, backslashes, or special characters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure Mismatch:&lt;/strong&gt; This happens when you get valid JSON in the wrong shape, such as receiving &lt;code&gt;{"title": "My Article"}&lt;/code&gt; when you actually need &lt;code&gt;{"article": {"title": "My Article"}}&lt;/code&gt;. Your backend code expects nested objects but receives flat structures, which causes undefined property errors that can take down your entire API endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type Confusion:&lt;/strong&gt; AI sometimes returns strings when you need numbers or arrays when you need objects. This results in valid JSON with broken logic. An example is when a count field comes back as &lt;code&gt;"25"&lt;/code&gt; (string) instead of &lt;code&gt;25&lt;/code&gt; (number), which breaks database schema validation and any math operations you perform on that data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Truncated Responses:&lt;/strong&gt; When you request a large dataset, some models will hit their output token limit and cut off the JSON mid-stream (e.g., ending with &lt;code&gt;...&lt;/code&gt; or just stopping). This leaves you with an incomplete, unparsable string. The reliable fix is to request data in smaller chunks—generating multiple subsets and concatenating the results in your code rather than asking for one massive payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5-Checkpoint Framework for Bulletproof JSON
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozkxat662nvsirl28qtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozkxat662nvsirl28qtd.png" alt="The Validation Checkpoint System" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Be Explicit in Your Prompt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't say:&lt;/strong&gt; "Return the SEO data as JSON"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Say:&lt;/strong&gt; "Return ONLY valid JSON with no additional text. Use this exact structure: &lt;code&gt;{"title": string, "description": string}&lt;/code&gt;"&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Provide a JSON Schema
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The most reliable way to get consistent JSON structure is to give AI an exact schema to follow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JSON Schema defines the structure, types, and requirements for your data. Instead of describing what you want in natural language, you provide a formal specification that eliminates ambiguity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add this to your prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Return JSON matching this exact schema. Do not add any fields not in the schema. All required fields must be present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;properties&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;maxLength&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;An engaging, SEO-friendly article title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;maxLength&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A concise summary of the article content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;required&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;additionalProperties&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; Schemas eliminate type confusion and structure mismatch because the model validates its output against the schema pattern during generation. The &lt;code&gt;additionalProperties: false&lt;/code&gt; flag is particularly powerful because it strictly forbids the AI from hallucinating extra fields you didn't ask for. This catches errors before they reach your code. Learn more about schema properties at the &lt;a href="https://spec.openapis.org/oas/v3.0.3#schema" rel="noopener noreferrer"&gt;OpenAPI Schema specification&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Request Code Fences
&lt;/h2&gt;

&lt;p&gt;Add to your prompt: "Wrap the JSON in markdown code fences with json syntax highlighting"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This prevents AI from adding explanatory text before or after the JSON because extra text breaks parsing when you extract the response.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Validate Before Using
&lt;/h2&gt;

&lt;p&gt;Never assume AI output is valid. Always wrap in try-catch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aiResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Use data here*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid JSON from AI:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Handle the error gracefully*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Check Structure After Parsing
&lt;/h2&gt;

&lt;p&gt;Valid JSON doesn't guarantee correct structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateSeoData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92i04czxtnjcqv4t59av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92i04czxtnjcqv4t59av.png" alt="5-stage validation" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Red Flags: What to Watch For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🚩 AI adds explanation text before or after JSON:&lt;/strong&gt; This breaks parsing. AI models are trained to be conversational and often add context before JSON blocks, so you must always request "ONLY valid JSON, no additional text."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚩 Nested objects are inconsistent:&lt;/strong&gt; AI formats the first object correctly but makes errors in deeply nested structures. The model's attention weakens as JSON depth increases, which leads to malformed brackets and missing commas three or four levels deep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚩 Numbers as strings:&lt;/strong&gt; AI often wraps numbers in quotes because it sees numbers as text tokens rather than numeric types. You need to be explicit that "count should be a number, not a string."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚩 Double-escaped characters in strings:&lt;/strong&gt; AI returns &lt;code&gt;\\"&lt;/code&gt; instead of &lt;code&gt;\"&lt;/code&gt; for quotes inside strings because the model treats escape sequences as text patterns rather than functional syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch Out For Escaped Character
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One of the most frustrating JSON issues occurs when AI returns responses with escaped characters inside the JSON itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of what goes wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What you expect:&lt;/strong&gt; &lt;code&gt;{"title": "The \"Best\" Guide"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What AI sometimes returns:&lt;/strong&gt; &lt;code&gt;{"title": "The \\\"Best\\\" Guide"}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The AI double-escapes quotes, backslashes, and special characters.&lt;/strong&gt; When you parse this JSON, you get literal backslash characters in your strings instead of properly escaped quotes. This breaks things when you try to display the data to users or pass it to other systems that expect clean strings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to prevent it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add to your prompt: &lt;strong&gt;"Use proper JSON escaping. Quotes inside strings should use single backslash escape ("), not double backslash (\")."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Edge Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trailing commas:&lt;/strong&gt; AI adds commas after the last item in objects or arrays. Strict JSON parsers reject this immediately even though JavaScript often accepts it, so this breaks in production environments using different parsers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unescaped special characters:&lt;/strong&gt; If your data contains quotes or backslashes, AI often forgets to escape them. A title like "O'Brien's Guide" will break your JSON when AI returns &lt;code&gt;"title": "O'Brien's Guide"&lt;/code&gt; instead of &lt;code&gt;"title": "O\'Brien's Guide"&lt;/code&gt; if your parser is strict about apostrophes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inconsistent null handling:&lt;/strong&gt; AI randomly switches between &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;"null"&lt;/code&gt;, empty string, or omitting the field entirely. Your application logic assumes one pattern but receives variations, which causes conditional checks to fail unpredictably.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Production Safety Net
&lt;/h2&gt;

&lt;p&gt;You have likely spent an hour debugging a critical failure only to discover the culprit was a single missing comma. In production, that one missing comma is not just a syntax error. It represents hundreds of failed user requests and corrupted data that piled up before you even noticed the issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's the technique that changed everything for me:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;jsonrepair&lt;/code&gt; to automatically fix malformed JSON.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;jsonrepair&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonrepair&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Try parsing normally first*&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aiResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// If parsing fails, attempt repair*&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;repairedJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;jsonrepair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aiResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repairedJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JSON repaired successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repairError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Could not repair JSON:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repairError&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Handle the error*&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;jsonrepair&lt;/code&gt; library automatically fixes common JSON formatting issues like adding missing commas, removing trailing commas, fixing unescaped quotes, and repairing truncated JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think of it as insurance. You hope you never need it, but when production breaks at 2 AM, you will be grateful it is there. And don’t ask me how I know that…&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool of the Week: Zod
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod - TypeScript-first schema validation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have valid JSON from AI, you still need to validate that the structure matches what your app expects. Zod lets you define schemas and validate data in one line. TypeScript validates types at compile time, while Zod validates data at runtime.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SeoSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Validate AI output*&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SeoSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;safeParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aiData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid structure:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;It catches structure mismatches and type confusion instantly, so pairing it with &lt;code&gt;jsonrepair&lt;/code&gt; gives you bulletproof AI output handling.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Valid JSON is boring until it breaks production at the worst possible time. Build the checkpoints now and thank yourself later.&lt;/p&gt;

&lt;p&gt;Let's Connect: What's your strategy for handling AI-generated structured data? Do you validate everything, or trust AI until it breaks? Reply and tell me about the weirdest JSON error you've debugged.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This was originally posted on the &lt;a href="https://vibestacklab.substack.com/p/how-to-prompt-ai-for-consistent-json" rel="noopener noreferrer"&gt;VSL Substack publication&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>vibecoding</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How To Architect A Feature In 5 Minutes Before Talking To AI</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 25 Nov 2025 14:51:09 +0000</pubDate>
      <link>https://dev.to/cucoleadan/how-to-architect-a-feature-in-5-minutes-before-talking-to-ai-2on8</link>
      <guid>https://dev.to/cucoleadan/how-to-architect-a-feature-in-5-minutes-before-talking-to-ai-2on8</guid>
      <description>&lt;p&gt;&lt;em&gt;This post has been originally published on my Substack publication &lt;a href="https://open.substack.com/pub/vibestacklab/p/how-to-architect-a-feature-in-5-minutes?r=qc9fi&amp;amp;utm_campaign=devto&amp;amp;utm_medium=post&amp;amp;showWelcomeOnShare=true" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yesterday I opened my server logs and saw my API costs had spiked for no obvious reason.&lt;/p&gt;

&lt;p&gt;I was building a new feature and thought I'd be clever. I told the AI: "Just reuse the logic from the other generator." The AI said "Sure!" The UI worked perfectly when I tested it.&lt;/p&gt;

&lt;p&gt;But I never looked at what was happening underneath.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI had built something that made three separate calls to my server every time a user clicked one button. The feature worked on my screen, but it was costing me money with every click and making users wait longer than they should.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;AI Will Make Anything Work Even if It's Wasteful&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One of the first things you’ll learn building with AI tools is that they'll make anything work on the surface, even if it's wasteful underneath.&lt;/p&gt;

&lt;p&gt;When you ask AI to build a feature, it assumes everything will go perfectly. It assumes your backend is already set up exactly right. That you don't care how many times it calls your database or how long users have to wait. &lt;/p&gt;

&lt;p&gt;It assumes you know what you’re doing.&lt;/p&gt;

&lt;p&gt;AI is incredibly fast at writing code but it doesn't think about what happens when that code runs in the real world, with real users.&lt;/p&gt;

&lt;p&gt;That’s why &lt;strong&gt;you have to&lt;/strong&gt; treat AI like a brilliant junior developer who will take shortcuts whenever you aren't watching. Here’s what you need to know to actually make it work. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The 5-Minute Sketch That Saves Hours&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Spend 5 minutes thinking before you start typing prompts.&lt;/p&gt;

&lt;p&gt;Before you ask AI to build anything, draw what you actually want to happen. I’m talking about the data flow, basically what information moves where, and in what order.&lt;/p&gt;

&lt;p&gt;When I saw those cost spikes, I stopped. I grabbed a piece of paper and drew what the AI had actually built. It was a mess of arrows going back and forth.&lt;/p&gt;

&lt;p&gt;Then I drew what I actually wanted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser calls the API;&lt;/li&gt;
&lt;li&gt;Server gets the request;&lt;/li&gt;
&lt;li&gt;Server computes and routes my message;&lt;/li&gt;
&lt;li&gt;Server calls the AI and saves the result in the database;&lt;/li&gt;
&lt;li&gt;The browser polls my database and shows the new information.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once I saw it on paper, the problem was obvious. The AI was calling the save step twice and re-fetching data that was already in database. It tried to reuse logic from an old feature that worked differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;This Is The Classic "Reuse this code" Trap&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I was building a Meta Description generator for Yahini. I already had a Brief Generator that creates meta titles and descriptions along with a bunch of other content analysis and writing the brief.&lt;/p&gt;

&lt;p&gt;I thought I'd be smart. I told the AI: "Repurpose the Brief Generator logic, but just return the meta title and description."&lt;/p&gt;

&lt;p&gt;The AI obliged. The feature worked. Users could generate meta information.&lt;/p&gt;

&lt;p&gt;But here's what I didn't notice: the AI kept &lt;em&gt;all&lt;/em&gt; the calls from the Brief Generator, then throwing all of it away and only showing the meta title/description.&lt;/p&gt;

&lt;p&gt;I was paying for a full brief generation every single time someone just wanted a meta description. That's like ordering a full meal at a restaurant, eating only the dessert, and throwing the rest away.&lt;/p&gt;

&lt;p&gt;My prompt started with &lt;code&gt;*reuse this to…*&lt;/code&gt; without thinking about what &lt;code&gt;this&lt;/code&gt; actually did.&lt;/p&gt;

&lt;p&gt;This is why the 5-minute sketch matters. If I'd drawn what I wanted before prompting and share it with the AI, it would have seen immediately that the Brief Generator did 10 steps and I only needed 3 of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4 Questions to Ask Before You Prompt&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Run through these 4 questions for 5 minutes before you prompt and your AI code will most certainly be more reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think of these as your architecture checklist. I use these symbols to mark my sketch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🚩 Red flag:&lt;/strong&gt; What will break your feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✅ Green flag:&lt;/strong&gt; What makes it production-ready&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. What goes in?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Be specific about what data you're sending and what format it's in.&lt;/p&gt;

&lt;p&gt;🚩 &lt;strong&gt;Red flag:&lt;/strong&gt; Vague descriptions like "user data" or "form values" leave too much room for AI to guess wrong.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Green flag:&lt;/strong&gt; Write exactly what the user provides: "A URL (text), a tone choice (dropdown with 3 options: professional, witty, casual), and their user ID (number)."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Instead of telling AI "handle the signup form," say: "User enters email (must include @), password (minimum 8 characters), and checks a newsletter opt-in box (yes/no)."&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. What happens to it?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Trace the complete path your data takes from start to finish.&lt;/p&gt;

&lt;p&gt;🚩 &lt;strong&gt;Red flag:&lt;/strong&gt; Skipping steps like "validate" or "check permissions" because they seem obvious—AI won't assume them.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Green flag:&lt;/strong&gt; Map every hop: "Browser → Server validates URL format → Server scrapes website → Server sends scraped text to AI → AI returns description → Server saves to database → Server responds to browser."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For a contact form, map the full path: "Server checks email is valid → Server checks for spam → Server saves to database → Server sends confirmation email → Server responds 'Message sent' to browser."&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. What could slow this down?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Think about external dependencies and what happens if they're slow or unavailable.&lt;/p&gt;

&lt;p&gt;🚩 &lt;strong&gt;Red flag:&lt;/strong&gt; Assuming external services (website scraping, AI APIs, payment processors) will always respond instantly.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Green flag:&lt;/strong&gt; Identify each external dependency and set realistic timeout expectations: "Scraping might take 5-10 seconds. AI call usually takes 2-3 seconds but could take up to 10."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For a feature that checks if a domain is available, note potential delays: "Domain lookup calls an external API—it might take 3 seconds or fail completely if the service is down."&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. What happens when it breaks?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Think through (almost) every way this could fail and what the user should see.&lt;/p&gt;

&lt;p&gt;🚩 &lt;strong&gt;Red flag:&lt;/strong&gt; Only planning for the "happy path" where everything works perfectly.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Green flag:&lt;/strong&gt; List specific failure scenarios and responses: "If scraping fails → show 'Couldn't access that website, try another URL' and don't charge credits. If AI times out → show 'Taking longer than expected, try again' and don't save partial results."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For a file upload feature, plan for: "File too large → 'Maximum 5MB.' Wrong file type → 'Only PDF, DOC, or TXT files.' Upload interrupted → 'Upload failed, please try again' and clean up partial files."&lt;/p&gt;

&lt;h3&gt;
  
  
  Example time
&lt;/h3&gt;

&lt;p&gt;Let's say you're building a feature that generates social media posts from a blog URL.&lt;/p&gt;

&lt;p&gt;Before you prompt AI, spend 5 minutes on this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Draw your data flow on paper:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User pastes blog URL and picks platform (Twitter, LinkedIn)&lt;/li&gt;
&lt;li&gt;Your server fetches the blog content&lt;/li&gt;
&lt;li&gt;Your server sends content + platform to AI&lt;/li&gt;
&lt;li&gt;AI returns optimized post&lt;/li&gt;
&lt;li&gt;Your server saves it and shows it to the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mark your 4 questions on the sketch:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What goes in?&lt;/strong&gt; Blog URL (text, must start with http), platform choice (dropdown: Twitter/LinkedIn), user's account ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens?&lt;/strong&gt; Browser → Server validates URL → Server scrapes blog → Server sends to AI with platform context → AI returns post → Server saves → Server responds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What could slow it down?&lt;/strong&gt; Blog scraping might take 5-10 seconds if the site is slow. AI usually responds in 2-3 seconds. Total: plan for 15 seconds max.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What breaks?&lt;/strong&gt; Blog URL invalid → show "Please enter a valid URL." Scraping times out → show "Couldn't access that blog, try another." AI fails → show "Generation failed, try again" and don't save anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Now you're ready to prompt AI. Your prompt might look like:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Create an action plan on how to build an API endpoint that takes a blog URL and platform choice (Twitter or LinkedIn). First validate the URL format. Then scrape the blog content with a 10-second timeout. Send the scraped content to OpenAI with context about which platform. Return the generated post. If scraping fails, return error message without calling OpenAI. If AI fails, return error without saving. Only save successful results to database."&lt;/p&gt;

&lt;p&gt;The AI will build exactly what you sketched because you thought through the flow first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;**IMPORTANT -&lt;/em&gt;* Use this kind of prompt to generate a more comprehensive action plan and only then start coding. I use an Architect mode in Kilo Code that creates a To Do list and then my other agents implement each item from that list.*&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Show AI a Picture, Not a Paragraph&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here's how I fixed my expensive feature in 10 minutes.&lt;/p&gt;

&lt;p&gt;I grabbed my rough sketch and uploaded the photo to the AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My sketch showed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;del&gt;Brief Generator (full flow with 10 steps)&lt;/del&gt; ← crossed out&lt;/li&gt;
&lt;li&gt;New simple flow: URL → Scrape → AI → Save → Return&lt;/li&gt;
&lt;li&gt;Notes in the margin: "Only need meta description and title, skip other stuff."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My prompt was simple: "Rebuild this to match my sketch. Remove the extra steps."&lt;/p&gt;

&lt;p&gt;The AI understood immediately. It rewrote the code, removed the wasted calls, and cut the delay in half.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;The pattern:&lt;/strong&gt; A rough sketch beats a detailed text explanation every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to include in your sketch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boxes for each major step (Browser, Server, Database, External API)&lt;/li&gt;
&lt;li&gt;Arrows showing what data moves where&lt;/li&gt;
&lt;li&gt;Notes about what to validate or check&lt;/li&gt;
&lt;li&gt;Cross-outs showing what NOT to do&lt;/li&gt;
&lt;li&gt;Timing notes ("10 sec timeout here")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You don't need perfect diagrams. You need clarity about what talks to what and in what order.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture Means Deciding Before Building&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When developers talk about "architecture," it sounds intimidating.&lt;/p&gt;

&lt;p&gt;Architecture means deciding how the pieces of your feature will talk to each other before you build them.&lt;/p&gt;

&lt;p&gt;No-code platforms make these decisions for you, usually poorly, especially when your prompts are vague. It’s up to you to orchestrate everything, and it’s easier than you think.&lt;/p&gt;

&lt;p&gt;When you skip the architecture sketch, you end up debugging in production. A user clicks a button, something breaks, and you're digging through server logs trying to figure out which of the five database calls failed.&lt;/p&gt;

&lt;p&gt;When you sketch first, you know exactly what should happen. When something breaks, you can trace the flow on your sketch and find the problem in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The sketch becomes your debugging map.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;The test:&lt;/strong&gt; If you can draw it on paper in 5 minutes, you're ready to build it. If you can't draw it, you don't understand it well enough yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;This Week's Discovery: tldraw&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I usually just use pen and paper, but when I need to share my sketch or save it for later, I use &lt;a href="https://www.tldraw.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;tldraw&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It keeps that hand-drawn feel, which stops you from obsessing over making it perfect. And when you need to share your architecture with AI, you can export the sketch and paste it directly into your prompt.&lt;/p&gt;

&lt;p&gt;The hand-drawn style actually helps by keeping you focused on the flow instead of making it pretty.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Let's Connect&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next time AI-generated code isn't working the way you expected, stop. Step away from the screen. Draw what you actually want to happen.&lt;/p&gt;

&lt;p&gt;Did you discover a loop or redundancy you didn't know existed? Reply and tell me.&lt;/p&gt;

&lt;p&gt;Build smart,&lt;/p&gt;

&lt;p&gt;Dan&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post has been originally published on my Substack publication &lt;a href="https://open.substack.com/pub/vibestacklab/p/how-to-architect-a-feature-in-5-minutes?r=qc9fi&amp;amp;utm_campaign=devto&amp;amp;utm_medium=post&amp;amp;showWelcomeOnShare=true" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Your Landing Page Is Probably Over-Engineered</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Wed, 19 Nov 2025 09:42:19 +0000</pubDate>
      <link>https://dev.to/cucoleadan/your-landing-page-is-probably-over-engineered-1nd</link>
      <guid>https://dev.to/cucoleadan/your-landing-page-is-probably-over-engineered-1nd</guid>
      <description>&lt;p&gt;&lt;em&gt;This post has been originally published on my Substack publication &lt;a href="https://vibestacklab.substack.com/p/your-landing-page-is-probably-over" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;React is what most developers reach for first, wrapped in Next.js or Remix or just running through Vite.&lt;/p&gt;

&lt;p&gt;That makes sense for products that behave like real apps, where the screen is constantly &lt;em&gt;reacting&lt;/em&gt; to what the user does, but it quietly makes simple sites feel heavier than they should to be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For most solo founders, the priority is a site that loads fast, feels snappy on cheap phones, and plays nicely with AI crawlers and search engines trying to understand what you actually do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a landing page with a hero, three feature blocks, and an email signup form.&lt;/p&gt;

&lt;p&gt;In a typical React setup, you are loading an entire framework just to make that form submit.&lt;/p&gt;

&lt;p&gt;That often means shipping a bunch of useless JavaScript even though the page itself is mostly text and a couple of buttons. &lt;/p&gt;

&lt;p&gt;This causes multiple issues, starting with visitors having to wait for JavaScript to parse before they can even scroll smoothly.&lt;/p&gt;

&lt;p&gt;AI tools trying to summarize your site, or search engines like Google trying to index your copy, have to run your JavaScript first before they “see” your text.&lt;/p&gt;

&lt;p&gt;That extra step can fail on slower devices, tighter crawl budgets, or when an AI assistant is racing through dozens of sites to answer a user's question about "simple task management tools."&lt;/p&gt;

&lt;h3&gt;
  
  
  How visitors and AI experience your stack
&lt;/h3&gt;

&lt;p&gt;Picture someone on a train with spotty signal clicking your link.&lt;/p&gt;

&lt;p&gt;They see your headline start to appear, then watch the layout shift three times as JavaScript loads, then wait for the "Sign Up" button to become clickable.&lt;/p&gt;

&lt;p&gt;By the time the page finally loads, they have already spent a few seconds wondering whether your product will feel just as clunky.&lt;/p&gt;

&lt;p&gt;Now picture an AI agent trying to figure out what your product does so it can recommend you to someone asking for help.&lt;/p&gt;

&lt;p&gt;It lands on your site, waits for React to hydrate, tries to parse your state tree, and eventually gives up or grabs a half-rendered snippet that makes your product sound vague or broken.&lt;/p&gt;

&lt;p&gt;React shines when the page is constantly changing based on what the user does: think dashboards, editors, or complex flows.&lt;/p&gt;

&lt;p&gt;Marketing pages are different. They sit closer to a good PDF with a few buttons than to Figma or Notion. Their whole purpose is to help the visitor understand what you do and ideally take an action towards your conversion goal, be it to sign up or to download a resource. &lt;/p&gt;

&lt;h3&gt;
  
  
  React for apps, Astro for "reading"
&lt;/h3&gt;

&lt;p&gt;The turning point for me was admitting that my main site behaves more like a magazine than an app.&lt;/p&gt;

&lt;p&gt;People land there to understand the promise, skim through a few sections, maybe read a FAQ, and then decide if they want to try the product.&lt;/p&gt;

&lt;p&gt;Astro fits that world because it builds pages as plain HTML first and then lets you sprinkle interactivity only where you truly need it.&lt;/p&gt;

&lt;p&gt;The default experience puts content ahead of JavaScript, which lines up nicely with what search engines, AI crawlers, and impatient humans all tend to prefer.&lt;/p&gt;

&lt;p&gt;For the product itself, React still plays a big role.&lt;/p&gt;

&lt;p&gt;I use it heavily for real app features and tiny tools where it makes sense, often with AI helpers and Kilo Code (my lightweight editor setup) to move fast on more complex flows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The site you hit first, the one where you decide if this thing is worth your time, stays much simpler and more focused on clarity than the app that sits behind it.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hosting on Cloudflare Workers
&lt;/h3&gt;

&lt;p&gt;Once the pages are built, they live on Cloudflare's network as static files.&lt;/p&gt;

&lt;p&gt;You can think of this as uploading a folder of prebuilt pages to a network of cities around the world.&lt;/p&gt;

&lt;p&gt;The setup is three steps: build your site, run one command to push to Workers, and you are done. &lt;em&gt;I do have a Github action setup that does this automatically which I will share in a later edition.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Static files are cheap to serve (basically free), and backend only gets involved when there is something truly dynamic to handle, like a form submission or a webhook callback.&lt;/p&gt;

&lt;p&gt;From a reader's point of view, the page shows up quickly from wherever they are, with no waiting for a single origin server halfway across the world.&lt;/p&gt;

&lt;p&gt;From your point of view, it means one fewer thing to worry about, and one more piece of your stack that "just works" once you set it up.&lt;/p&gt;

&lt;p&gt;From an AI crawler's point of view, it means clean HTML that arrives fast and makes sense without needing to execute a bunch of JavaScript first.&lt;/p&gt;

&lt;p&gt;If something does go wrong, you’re usually looking at a small, specific piece of logic instead of a giant app server.&lt;/p&gt;

&lt;h3&gt;
  
  
  A tiny Astro example that shows the difference
&lt;/h3&gt;

&lt;p&gt;Here is a concrete look at how a page can be mostly "just content" with one small interactive piece.&lt;/p&gt;

&lt;p&gt;You do not need to understand every symbol. The key idea is that almost everything is plain HTML, and only one piece is interactive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This example shows the file structure of a typical Astro page.&lt;/strong&gt; The top section (between the &lt;code&gt;---&lt;/code&gt; marks) runs at build time to prepare variables. The middle section is your HTML template. The &lt;code&gt;&amp;lt;Counter /&amp;gt;&lt;/code&gt; component at the bottom is the only part that ships JavaScript to the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ship your first version this weekend&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../islands/Counter.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Describe your product in one clear paragraph here.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt; &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Here is what happens when someone visits this page:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The browser receives HTML immediately.&lt;/strong&gt; Your headline and paragraph appear before any JavaScript downloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro sends one tiny script&lt;/strong&gt; to wake up the &lt;code&gt;&amp;lt;Counter /&amp;gt;&lt;/code&gt; component, because you marked it with &lt;code&gt;client:load&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything else stays as plain HTML.&lt;/strong&gt; No framework overhead, no hydration delay, no waiting for a bundle to parse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Compare that to a React app, where the entire page waits for JavaScript to load before showing anything, and AI tools have to execute your bundle just to read your headline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for a landing page:&lt;/strong&gt; Most of your page is static content. Your headline does not change based on user input. Your feature descriptions do not need React. Only the signup form or a demo widget might need interactivity, and Astro lets you load JavaScript for just that piece.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why this stack matters for real people (and AI)
&lt;/h3&gt;

&lt;p&gt;For readers, a fast site means less time waiting and more time deciding whether they trust you.&lt;/p&gt;

&lt;p&gt;Most people never think about frameworks. They simply notice whether your page appears quickly on hotel Wi-Fi and whether it feels smooth on an older phone.&lt;/p&gt;

&lt;p&gt;For AI assistants, clean HTML means they can actually understand what you do and recommend you when it makes sense.&lt;/p&gt;

&lt;p&gt;When ChatGPT, Perplexity, or any other AI tool crawls your site, it wants structured content it can read in milliseconds instead of a React bundle it has to execute first.&lt;/p&gt;

&lt;p&gt;Pre-built pages give AI the straight story, which means you show up in AI-generated answers instead of getting skipped for something easier to parse.&lt;/p&gt;

&lt;p&gt;For search engines, clear, pre-built content is easier to crawl and understand.&lt;/p&gt;

&lt;p&gt;Astro's style of building static pages plays nicely with this, and hosting them on Cloudflare's edge means the "fast page" story stays true worldwide.&lt;/p&gt;

&lt;p&gt;For you as a founder, this split makes your life simpler.&lt;/p&gt;

&lt;p&gt;React stays where its power actually pays off, inside your product, while your marketing site stays closer to a document you can reason about in an afternoon.&lt;/p&gt;

&lt;p&gt;When something breaks, the stack is small enough that the issue usually lives in Astro, React, or a specific Worker instead of feeling like a maze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I mention Yahini on the site as an example of this stack in action: Astro for content, React where it counts, and Cloudflare Workers to get it all to people and AI crawlers quickly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That mix keeps things simple enough that when something breaks, you can usually trace the problem in one sitting.&lt;/p&gt;




&lt;h3&gt;
  
  
  This week's finds: Grok Code Fast 1 and serving markdown to AI crawlers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Grok Code Fast 1&lt;/strong&gt; has been quietly helping in the background. &lt;strong&gt;It is a coding-focused model built for speed and low cost, which means you can afford to iterate quickly instead of waiting for one "perfect" answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best part is that you can fire off several quick rounds of prompting without worrying about your bill, things like: "draft this component," "simplify it," "make it easier to read," and treat it like a rapid feedback loop in your editor.&lt;/p&gt;

&lt;p&gt;That makes it a great fit for experiments like "rewrite this page component for Astro" or "split this React widget into a tiny piece I can reuse elsewhere," where you mostly need many small tries instead of one giant brain dump.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example, I used it to turn a React hero section into a simple Astro page, then asked it to remove anything that was not strictly needed for the first version. The whole experiment took about fifteen minutes and three iterations, which would have felt much slower with a heavier model.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I use Grok Code Fast 1 via Open Router, but you can also use it directly from Grok.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serving markdown to AI crawlers with Cloudflare Workers&lt;/strong&gt; is another small trick worth knowing about.&lt;/p&gt;

&lt;p&gt;Someone on Reddit shared a setup where Workers detect AI crawlers (like ChatGPT or Perplexity bots) and serve them a clean markdown version of your page instead of the full HTML.&lt;/p&gt;

&lt;p&gt;That makes it even easier for AI tools to parse your content, understand what you do, and recommend you when people ask questions your product can solve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are already on Cloudflare, this is a tiny addition that can make a real difference in how AI sees your site. The setup involves checking the user agent string, then serving a simplified markdown response when it matches known AI crawlers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/CloudFlare/comments/1nsj78y/using_cloudflare_workers_to_serve_markdown_to_ai/" rel="noopener noreferrer"&gt;Link: Using Cloudflare Workers to serve markdown to AI crawlers - Reddit post&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Let's connect
&lt;/h3&gt;

&lt;p&gt;Which page in your world is mostly words and a single call to action, but still runs through your full React setup?&lt;/p&gt;

&lt;p&gt;Reply and tell me what it does and what you are using today, and I will suggest the smallest "content-first" version you could try without touching the rest of your product.&lt;/p&gt;

&lt;p&gt;If you have already split your app this way, reply with "stack split" and tell me how it went, so I can include a few real-world examples in a future issue.&lt;/p&gt;




&lt;p&gt;You do not have to pick between "I will just rent a platform forever" and "I need to become a full-time engineer."&lt;/p&gt;

&lt;p&gt;One fast, simple, ownable website is often enough to start, and moving it off your full app stack might be the lowest-risk win you can grab this week.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post has been originally published on my Substack publication &lt;a href="https://vibestacklab.substack.com/p/your-landing-page-is-probably-over" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>astro</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Search Beyond the Docs When Your Code Won't Work</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Tue, 28 Oct 2025 14:09:30 +0000</pubDate>
      <link>https://dev.to/cucoleadan/how-to-search-beyond-the-docs-when-your-code-wont-work-54e6</link>
      <guid>https://dev.to/cucoleadan/how-to-search-beyond-the-docs-when-your-code-wont-work-54e6</guid>
      <description>&lt;p&gt;&lt;em&gt;This post has been originally published on my Substack publication &lt;a href="https://vibestacklab.substack.com/p/how-to-search-beyond-the-docs-when" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Last week I started building the new project management feature in Yahini, which meant creating a table with advanced sorting capabilities. At first, everything looked perfect. The table loaded, the data showed up, and when I clicked the "Due Date" column header, it actually sorted the rows.&lt;/p&gt;

&lt;p&gt;But something was wrong.&lt;/p&gt;

&lt;p&gt;Tasks with due dates were mixing randomly with tasks that had no dates at all. The empty ones should've been sitting at the bottom of the list, out of the way, but instead they scattered throughout the entire table. It drove me nuts.&lt;/p&gt;

&lt;p&gt;I tried fixing it five different ways. Asked Kilo (via Context7) to pull the TanStack Table docs. Read through the sorting guide. Tried every example they had. Nothing worked. After 45 minutes of this, I started questioning whether I'd completely misunderstood how table sorting was supposed to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exa to the Rescue
&lt;/h2&gt;

&lt;p&gt;On attempt six, I asked Kilo to use Exa to search for similar TanStack sorting issues. Instead of just looking over docs, Exa searches the whole web, including GitHub discussions, obscure blogs and reddit threads.&lt;/p&gt;

&lt;p&gt;The AI came back with a GitHub discussion thread and two Stack Overflow posts. One discussion nailed it: "TanStack automatically pushes &lt;code&gt;undefined&lt;/code&gt; values to the end when sorting, but it treats &lt;code&gt;null&lt;/code&gt; as an actual value and tries to sort it."&lt;/p&gt;

&lt;p&gt;That was the issue. Supabase returns &lt;code&gt;null&lt;/code&gt; for empty date fields by default. JavaScript treats &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; as completely different values. TanStack's sorting knows what to do with &lt;code&gt;undefined&lt;/code&gt; (push it to the bottom), but &lt;code&gt;null&lt;/code&gt; gets treated like any other value and sorted randomly in the list.&lt;/p&gt;

&lt;p&gt;The AI was smart enough to connect the dots. It read those discussions, saw that I was fetching from Supabase (thanks to the Kilo Code context), and suggested: "Your database is probably returning null. Convert it to undefined when you process the data."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix was one line:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;due_date: task.due_date === null ? undefined : task.due_date&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;That's it. Simply check if the value is &lt;code&gt;null&lt;/code&gt; and convert it to &lt;code&gt;undefined&lt;/code&gt;. TanStack now knows to push those tasks to the bottom.&lt;/p&gt;

&lt;p&gt;Five minutes later, sorting worked exactly how it should. Tasks with due dates sorted by date. Tasks without due dates stayed at the bottom where they belong.&lt;/p&gt;

&lt;p&gt;Would've spent another hour manually Googling variations of "tanstack date sorting broken."&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Your Coding Assistant Even Smarter
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) is just a standard way to connect AI assistants to external tools. Think of it like giving your AI a phone and a library card. Instead of being locked in a room with only what it remembers, it can now call out for current information whenever it needs it.&lt;/p&gt;

&lt;p&gt;This matters because every time you leave your editor to search for something, you break flow. Before I set up MCPs, I'd be coding, hit a problem, open a browser tab, read three Stack Overflow threads, maybe check the docs, then try to context-switch back to where I was in my code. That's 5-10 minutes gone, plus the mental energy to get back into the problem.&lt;/p&gt;

&lt;p&gt;With MCPs, the AI does the searching while you stay in your editor. You're still in your code, still thinking about the problem, and the answer comes to you instead of you going to find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Exa Adds to Your MCP Setup
&lt;/h2&gt;

&lt;p&gt;I already use Context7 MCP for documentation. Context7 is great when you need the official answer. Think of API references and function signatures, basically the "correct" way to do something according to the docs.&lt;/p&gt;

&lt;p&gt;Exa fills the gap that documentation doesn't cover: real-world implementations. It reads the entire web. Blog posts where developers explain edge cases. GitHub issues where someone hit your exact bug and posted their solution. Stack Overflow threads with working code. Even Substack posts where people share problems they ran into.&lt;/p&gt;

&lt;p&gt;For the sorting bug, Context7 gave me TanStack's official sorting documentation. That told me how sorting is supposed to work in theory. Exa found the GitHub discussions about null vs undefined specifically. That told me how to fix my actual problem.&lt;/p&gt;

&lt;p&gt;The AI reads what Exa finds, interprets it, then asks clarifying questions. When it saw those discussions about null values, it connected that to my Supabase setup and suggested the exact conversion I needed. I didn't have to piece together the solution myself, but rather used the AI to synthesize information from multiple sources and give me a working answer.&lt;/p&gt;

&lt;p&gt;That whole debugging process took 15 minutes total. An hour saved on a problem that would've been painful to solve manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exa Helped Me Migrate Yahini Too
&lt;/h2&gt;

&lt;p&gt;When I moved Yahini's presentation website from Remix to Astro a few weeks back (full breakdown coming this Friday), Exa saved me from hitting every edge case the hard way.&lt;/p&gt;

&lt;p&gt;I asked Kilo Code via Exa to find blog posts from people who'd done the same migration. &lt;/p&gt;

&lt;p&gt;It pulled up five different posts. &lt;/p&gt;

&lt;p&gt;One from someone who migrated a SaaS marketing site, another from a developer who documented every routing difference they found, and a third with deployment gotchas for hosting static websites on Cloudflare Workers.&lt;/p&gt;

&lt;p&gt;Used those posts as my migration checklist. When I hit a routing issue with dynamic paths, I already knew how to fix it because someone else had documented the solution. When my build failed the first time, I recognized the error from one of those posts and knew exactly which config setting to change.&lt;/p&gt;

&lt;p&gt;What would've been two days of trial-and-error turned into about six hours of focused work. More on this next week with the full play-by-play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Exa MCP
&lt;/h2&gt;

&lt;p&gt;Takes about 1 minute in Kilo Code. (I wrote about it on my previous post)&lt;/p&gt;

&lt;p&gt;Step 1: Sign up at exa.ai and grab your API key from the dashboard. Free account gives you $10 in credits. That's roughly 2k searches with 1 to 25 results. &lt;/p&gt;

&lt;p&gt;Step 2: Open your MCP config file. In Kilo Code: Settings → MCP Server → Edit Global MCP (this applies to all projects) or Edit Project MCP (just one project). In Cursor: Settings → Features → Model Context Protocol.&lt;/p&gt;

&lt;p&gt;Step 3: Add this configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcpServers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;exa&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;command&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;args&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-y&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;exa-mcp-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;env&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EXA_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-exa-api-key-here&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Replace &lt;code&gt;your-exa-api-key-here&lt;/code&gt; with your actual key. Don't commit this to GitHub if you're working on a public repo—keep your API keys in environment variables or a local config file.&lt;/p&gt;

&lt;p&gt;Step 5: Restart your editor. Exa should now show up in your AI assistant's available tools list. You can verify this by asking Kilo "What tools do you have access to?" and checking if Exa appears. Or just look at the green dot beside its name in your MCP list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exa Pricing
&lt;/h2&gt;

&lt;p&gt;$10 free credits to start. I've used maybe 200 searches building Yahini features over the past few weeks and am still a long way from hitting my free credit limit.&lt;/p&gt;

&lt;p&gt;After that, roughly $5 per 1,000 searches. To put that in context: if you do 10 searches per day (which is a lot), that's 300 searches per month, or about $1.50. Compare that to one hour of stuck time where you're manually debugging, and the ROI is obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Actually Use This
&lt;/h2&gt;

&lt;p&gt;I run three MCPs together when coding for Yahini: Context7, Exa, and Supabase MCP (lets the AI query my database directly for debugging). Between the three, I can build most features without leaving my editor.&lt;/p&gt;

&lt;p&gt;Here's my actual workflow when I hit a problem:&lt;/p&gt;

&lt;p&gt;First, I ask Context7 for the official approach. "Pull the TanStack Table sorting docs" or "Show me the Supabase date handling API." This gives me the foundation.&lt;/p&gt;

&lt;p&gt;Then, if that doesn't solve it, I bring in Exa. "Find examples of people sorting null values in TanStack" or "Search for blog posts about Remix to Astro migration." This gives me real-world solutions from people who've hit the same problem.&lt;/p&gt;

&lt;p&gt;The AI synthesizes both. It takes the official docs from Context7, finds the practical implementations from Exa, and gives me a solution that actually works in production. &lt;/p&gt;

&lt;p&gt;The combined theory with actual practice is what makes this setup powerful.&lt;/p&gt;

&lt;p&gt;I still open browser tabs for some things. Visual design inspiration, testing how a feature feels in different browsers, reading long-form technical deep-dives. But for "how do I build this" or "why isn't this working," the MCP setup handles the research while I stay focused on code.&lt;/p&gt;

&lt;p&gt;Not to mention the Architect mode in Kilo works 10 times better when given access to the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Week's Discovery: shadcn/ui
&lt;/h2&gt;

&lt;p&gt;When I built Yahini's task table (the one from the sorting saga), I started with shadcn's data table component. It gave me the basic structure, sorting UI, and loading states out of the box. Then I customized it to match Yahini's design.&lt;/p&gt;

&lt;p&gt;shadcn isn't a component library you install via npm. You get the actual code dropped into your project. So when I needed custom styling for overdue tasks (red text, bold font, urgent indicator), I opened the component file and modified it directly. No CSS overrides fighting with library defaults. No digging through prop documentation hoping there's an &lt;code&gt;onOverdue&lt;/code&gt; callback.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And they have an MCP server, which I had to try!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Check it out here → &lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;ui.shadcn.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;What makes you leave your editor most often? Looking up UI patterns? Finding code examples? Debugging weird behavior that doesn't match the docs? Reply and let me know. Curious what would actually speed up your workflow.&lt;/p&gt;

&lt;p&gt;Want to try Exa? Grab the free credits at exa.ai, drop that config into your MCP settings, and test it for a week. You'll know pretty fast if it's worth it.&lt;/p&gt;




&lt;p&gt;If you enjoyed this post please consider following me here and subscribing  to my newsletter &lt;a href="https://vibestacklab.substack.com/p/how-to-search-beyond-the-docs-when" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mcp</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Kilo Code Changed How I Write Code and I'm Never Going Back</title>
      <dc:creator>cucoleadan</dc:creator>
      <pubDate>Fri, 24 Oct 2025 13:26:29 +0000</pubDate>
      <link>https://dev.to/cucoleadan/kilo-code-changed-how-i-write-code-and-im-never-going-back-18hh</link>
      <guid>https://dev.to/cucoleadan/kilo-code-changed-how-i-write-code-and-im-never-going-back-18hh</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Quick note: This article was first published on my Substack publication -&amp;gt; &lt;a href="https://vibestacklab.substack.com/" rel="noopener noreferrer"&gt;VSL&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had three browser tabs open: AI Studio, ChatGPT, and my code. Copy, paste, refresh, repeat. I was coding by committee and learning nothing.&lt;/p&gt;

&lt;p&gt;Every time I needed help debugging, I'd switch tabs, explain the problem, get code back, paste it into VS Code, test it, find new bugs, then go back to the chat. I spent more time switching contexts than actually building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right now&lt;/strong&gt;, vibe coders are stuck between two bad options: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pick an expensive platforms like Lovable that charge $25-$200/month and force you to use their code editor;&lt;/li&gt;
&lt;li&gt;juggle separate AI interfaces that don't integrate with where you actually work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today I’ll show you the third and better way. &lt;/p&gt;

&lt;h2&gt;
  
  
  How I Started Coding Features In Yahini
&lt;/h2&gt;

&lt;p&gt;I'd write a prompt in ChatGPT and Gemini, get code, copy it, paste into VS Code, test, find bugs, go back to the chat, explain the error, get new code, repeat. I'd spend 15 minutes just switching between tabs.&lt;/p&gt;

&lt;p&gt;I even tried self-hosting an AI wrapper like Chatbot UI. One of those open-source chat interfaces you connect to your API keys to use multiple models in the same browser tab. &lt;/p&gt;

&lt;p&gt;Spent a Saturday setting up Supabase, configuring environment variables, deploying to Cloudflare. &lt;/p&gt;

&lt;p&gt;Got it working, had my own private ChatGPT/Sonnet/Gemini/Grok basically. But it was still a separate tab. Still copy-pasting code between the chat and VS Code. And now I had to maintain it. Database migrations, updates, auth issues. Gave up after two weeks because it didn't actually solve the problem.&lt;/p&gt;

&lt;p&gt;These approaches keep AI separate from your code. With platforms like Lovable or Bolt, you don't even get to choose your AI model. They pick for you, mark it up, and you pay whatever they decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  BYOK Changes Everything
&lt;/h2&gt;

&lt;p&gt;Kilo Code is an open-source VS Code extension with specialized modes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architect (plan before you code),&lt;/li&gt;
&lt;li&gt;Code (generate features),&lt;/li&gt;
&lt;li&gt;Ask (understand existing code),&lt;/li&gt;
&lt;li&gt;Debug (fix issues).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking ChatGPT in another tab, Kilo Code sits next to your code like a pair programming partner. It can automatically reference files, use MCP servers and compress the context when it becomes too large.&lt;/p&gt;

&lt;p&gt;But nothing beats the bring-your-own-keys (BYOK) functionality.&lt;/p&gt;

&lt;p&gt;I use OpenRouter with Google Vertex credits. I have one API key in Kilo Code that points to OpenRouter. Then inside OpenRouter, I add all my provider keys. Anthropic, OpenAI, Google, whatever. &lt;/p&gt;

&lt;p&gt;I create different model configs in OpenRouter and switch between them based on task complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple task? Cheaper model. Complex refactor? Claude Sonnet. All through one key.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also added a couple hundred dollars in OpenRouter credits to have a backup in case I run out of credits on other platforms. &lt;em&gt;These credits also allow me to test specific new models like the Grok Code Fast 1 without depositing funds into individual providers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now think of this, Cursor and Lovable charge anywhere from $20 to thousands of dollars per month. &lt;/p&gt;

&lt;p&gt;With Kilo Code, I pay $0 for the tool (it's open source). Then I only pay for whichever AI model I use at provider rates. &lt;/p&gt;

&lt;p&gt;Last month: $119 in API calls for 117 million tokens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tg47jrnf1b2jfe2hs2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tg47jrnf1b2jfe2hs2v.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: This includes some of Yahini’s usage besides coding. If I were to approximate I would say that I spent ~$50 for coding  which includes a complete migration of the &lt;a href="http://Yahini.io" rel="noopener noreferrer"&gt;Yahini.io&lt;/a&gt; website from Remix to Astro.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Building an API Endpoint in 2 Hours
&lt;/h2&gt;

&lt;p&gt;I needed an API endpoint for Yahini's lead magnet downloads. Captures email, queues it for processing, triggers email sequence. Built with Hono and Cloudflare Workers.&lt;/p&gt;

&lt;p&gt;I opened Architect mode and said: "I need an API endpoint that handles lead magnet downloads with email capture and queue processing." &lt;/p&gt;

&lt;p&gt;Architect mode (&lt;em&gt;powered by Sonnet 4.5&lt;/em&gt;) created a to-do list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up POST endpoint with Hono routing;&lt;/li&gt;
&lt;li&gt;Add anti-spam and rate limiting middleware;&lt;/li&gt;
&lt;li&gt;Add request validation (email, resource ID);&lt;/li&gt;
&lt;li&gt;Queue message for email worker;&lt;/li&gt;
&lt;li&gt;Batch processing with delays;&lt;/li&gt;
&lt;li&gt;Error handling and retries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I switched to Code mode. It followed the to-do list Architect created to complete each step. The Cloudflare documentation MCP was also a huge time saver. I used it to give Kilo Code access to all the Workers docs, queue setup, and batch processing patterns, making sure the AI won’t hallucinate too much.&lt;/p&gt;

&lt;p&gt;Here's the simplified version of the worker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hono&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hono&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;antiSpam&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./middleware/antiSpam&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rateLimiter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./middleware/rateLimiter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Hono&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Hono&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Apply anti-spam and rate limiting middleware*&lt;/span&gt;
&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/download-resource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;antiSpam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/download-resource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rateLimiter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/download-resource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resourceId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Validation*&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Missing required fields&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="c1"&gt;// Queue email for processing*&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EMAIL_QUEUE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Your Resource is Ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;templateData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;resourceId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Received batch of &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; messages`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;handleSendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed. Retrying:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validation, anti-spam, rate limiting, and queue processing. Nothing fancy, but production-ready.&lt;/p&gt;

&lt;p&gt;Took 2 hours total to have a fully functional worker. I ended up integrating it in my dedicated Brevo Worker to keep things organized. And Kilo Code helped with that too.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Kilo Code Beats Platform Lock-In&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The platform trap is real. Lovable charges $25/month minimum for 100 credits, but here's the&lt;/strong&gt; catch: those credits burn fast. A simple "Add authentication" prompt costs 1.2 credits. Building a landing page? 2 credits. You're looking at 50-80 prompts per month before you need to upgrade.&lt;/p&gt;

&lt;p&gt;Bolt isn't better. Their Pro plan starts at $20/month for 10 million tokens, but developers report burning through 7-12 million tokens just fixing simple errors. One user lost 1.3 million tokens in a single day. And those tokens don't roll over.&lt;/p&gt;

&lt;p&gt;But the real problem isn't the cost. It's that you don't own anything.&lt;/p&gt;

&lt;p&gt;With Lovable or Bolt, you're building inside their editor. Sure, Lovable added GitHub sync (which is huge), but you're still paying a monthly subscription just to access the platform. When credits run out mid-build, your work stops until you top up. When a new model drops that's perfect for your use case, you can't switch to it unless they support it.&lt;/p&gt;

&lt;p&gt;And here's the part nobody talks about: Lovable Cloud. That's their backend service, powered by Supabase. It has completely separate billing. You get $25 free per month, but once your app needs real data storage, authentication, or file uploads, that meter starts running. People build prototypes thinking they're spending $25/month, then their app gets traction and suddenly they're getting surprise bills for backend usage they didn't budget for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kilo Code separates the tool from the cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The extension is free. Open source. You install it in VS Code (also free) or even in Cursor if you're already paying for that. Then you bring your own API keys.&lt;/p&gt;

&lt;p&gt;Here's what that means in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to use Sonnet 4.5 for complex refactors? Pay Anthropic's API rates directly.&lt;/li&gt;
&lt;li&gt;Found a free model that's great for simple tasks? Use that.&lt;/li&gt;
&lt;li&gt;Got Google Vertex credits? Code for free until they run out.&lt;/li&gt;
&lt;li&gt;New model drops? Switch to it immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No subscription. No credits that expire. No separate backend billing. Just pay for the AI you actually use, at the rates the providers actually charge.&lt;/p&gt;

&lt;p&gt;Even if you're already paying for Cursor ($20/month), adding Kilo Code means you control which models you use and when. Cursor's credits burn fast when you're in Max Mode. With Kilo Code, you decide if a task needs an expensive model or if a cheap one will do. You're not locked into their usage tiers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Quick Note on Credits&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I'm running Kilo Code with free Google Vertex credits routed through OpenRouter, so I'm basically coding for free until those run out. I'll write a full post on how to set that up.&lt;/p&gt;

&lt;p&gt;For now, just know BYOK means you can use whatever credits or pricing you want. Free model for learning? Go for it. Paid premium model for production? Your choice. You aren't locked into anyone's credit system.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Week's Discovery
&lt;/h2&gt;

&lt;p&gt;The Cloudflare Documentation MCP made building that endpoint smooth. Instead of opening docs in another tab, Kilo Code had all the queue syntax, Worker config, and routing info right there. Saved me 30 minutes of tab-switching. If you're building on Cloudflare, this MCP is essential.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cloudflare/mcp-server-cloudflare/tree/main/apps/docs-vectorize" rel="noopener noreferrer"&gt;https://github.com/cloudflare/mcp-server-cloudflare/tree/main/apps/docs-vectorize&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;What's your setup? Juggling AI chat tabs? Paying for Cursor or stuck in Lovable? Reply and tell me.&lt;/p&gt;

&lt;p&gt;Want to try Kilo Code with BYOK? GitHub repo: &lt;a href="https://github.com/Kilo-Org/kilocode" rel="noopener noreferrer"&gt;https://github.com/Kilo-Org/kilocode&lt;/a&gt;. If you want the full OpenRouter + free credits walkthrough, let me know. I'll write that in the upcoming editions&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Own your tools. Control your costs. That's how you stop paying rent on your own work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Subscribe to my Substack publication &lt;a href="https://vibestacklab.substack.com/" rel="noopener noreferrer"&gt;VSL&lt;/a&gt; and follow my journey where I show how I build &lt;a href="//yahini.io"&gt;Yahini&lt;/a&gt; and what tools I use!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
