<?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: Malik Chohra</title>
    <description>The latest articles on DEV Community by Malik Chohra (@malik_chohra).</description>
    <link>https://dev.to/malik_chohra</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1343661%2F5a5ed7f3-f672-4bd4-b592-b57036da4c95.jpg</url>
      <title>DEV Community: Malik Chohra</title>
      <link>https://dev.to/malik_chohra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/malik_chohra"/>
    <language>en</language>
    <item>
      <title>Wire AI Is Live: Beta tester open</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Thu, 30 Jul 2026 16:19:58 +0000</pubDate>
      <link>https://dev.to/malik_chohra/let-the-model-write-the-content-never-the-control-flow-12aj</link>
      <guid>https://dev.to/malik_chohra/let-the-model-write-the-content-never-the-control-flow-12aj</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Wire AI is live and early access is open. It's an AI-native growth engineer for mobile apps: your React Native app embeds an SDK, a LangGraph backend decides what to ask each user next, and deterministic code owns the routing while the model only generates content. On one live app, activation went from 69% to 93%. 15 early-access seats, 3 taken, free and installed by hand.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is part of my Code Meet AI newsletter: &lt;a href="https://codemeetai.substack.com" rel="noopener noreferrer"&gt;https://codemeetai.substack.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Wire AI is live today, and early access is open.&lt;/p&gt;

&lt;p&gt;It's the AI-native growth engineer for mobile apps: AI that replaces your growth team. It runs four versions of every step of your users' journey, live at once, and keeps what makes them stay.&lt;/p&gt;

&lt;p&gt;On the first app it ran on, activation went from 69% to 93%.&lt;/p&gt;

&lt;p&gt;15 seats. 3 are already gone. Free, installed by me personally, and there's no price attached because I haven't set one yet.&lt;/p&gt;

&lt;p&gt;Below: what it does, what already shipped, what's still rough, and how to claim one of the 12 that are left.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Your users' journey has stages. They onboard, they get a plan, they hit their first real win, they get asked for a review. Wire AI runs four versions of each of those stages, live, at the same time. Users are assigned to a version and stay in it, the funnel says which version keeps more of them, and the winner gets promoted.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71gqcrr15loppkrwmucg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71gqcrr15loppkrwmucg.png" alt="The learning loop: four versions of every journey stage, the winner promoted, every finished journey feeding the next round." width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then the part a testing tool doesn't do. Every finished journey feeds back in: Wire reads what happened and writes a sharper variant for the next round.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It isn't a dashboard that tells you to go run a test. It's the loop, already running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What that looks like in your codebase
&lt;/h2&gt;

&lt;p&gt;Your React Native app embeds a small SDK. When a user opens the app, the SDK talks to a backend I run, and that backend decides, one screen at a time, what to ask that specific person next. It renders as native cards. Not a webview, not a chat window bolted onto your product.&lt;/p&gt;

&lt;p&gt;At the end it hands your app a structured plan you can save and act on, and every step streams into a funnel you can read.&lt;/p&gt;

&lt;p&gt;So instead of writing an onboarding once and guessing for the next two years, you write a config and the AI runs it.&lt;/p&gt;

&lt;p&gt;The part that makes it work is boring on purpose. Deterministic code controls the flow and the model only generates content. Routing is a pure function of where the session is, how many questions are left, whether the user is bailing, so the whole flow is testable without a model in the loop.&lt;/p&gt;

&lt;p&gt;The AI writes the next question, grounded in every answer the person already gave, and writes the final plan. Everything it emits gets validated against a fixed vocabulary of components before it's allowed anywhere near a screen.&lt;/p&gt;

&lt;p&gt;That's the difference between a generative UI demo and something you can put in front of paying users. Most AI UI demos let the model draw whatever it wants and hope. This one gives the model a small, checked job and keeps the state machine in code where it belongs.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgoknj8qtipckqf946t2d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgoknj8qtipckqf946t2d.png" alt="How a single turn runs, from the app through A2A to a schema-checked card." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What that gets you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A journey that adapts per user.&lt;/strong&gt; The static onboarding asks everybody the same seven questions in the same order. Wire AI asks what follows from what the person just said, stops when it has enough, and skips what it can already infer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experiments that run without you.&lt;/strong&gt; A/B/C/D variants across the journey, five stages, four arms, twenty combinations, without anybody sitting in a meeting deciding which to try next. This is the direction the product is built toward and I'll be straight about where it sits today, further down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A funnel you can actually read.&lt;/strong&gt; Completion, drop by step, time per screen, and the transcript of any individual session so you can read exactly what the AI asked and what the person answered. Most apps at this stage are guessing about where users give up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You find out who your users actually are.&lt;/strong&gt; Wire AI reads every session and hands you the patterns: what people came for, which question makes them hesitate, which wording converts. Most founders are still running on a persona doc written before launch.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Our pilot client, and what actually happened
&lt;/h2&gt;

&lt;p&gt;I can't name the app, that's a client boundary I hold. What I can tell you is what it does: it helps people find spots to hang out. Live React Native app, real users, and an onboarding people were quietly dropping out of.&lt;/p&gt;

&lt;p&gt;Here's the run, in the order it happened.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;We started with an experiment, not a redesign.&lt;/strong&gt; Three versions of the onboarding running live at the same time, users assigned stickily so nobody got a different flow on their second open, every version chasing the same goal event. Nobody sat in a room deciding which one was better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The first read was wrong, and the loop is what caught it.&lt;/strong&gt; One arm came back looking like a 17 point winner. At around fifty sessions that feels like a result, and it's exactly the moment a human growth team ships it and builds the next quarter on top. At scale it was worth about three and a half points. Mostly noise wearing a nice hat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The version that actually won was the short one.&lt;/strong&gt; The deep, thorough discovery flow lost to a fast one of about eight screens. On a flow with no real leak in it, where every individual question converts in the high nineties, length turned out to be the only lever that moved anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Then the part I didn't expect: we found out who the users actually were.&lt;/strong&gt; The product context we had written assumed one kind of person, someone new to the city looking for places. The answers said something else. Younger, local, born there, social, budget conscious. My actual reaction, reading the answers: wait, these people already live here. We had spent months onboarding a user who didn't exist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;So we rewrote the messaging to the real one.&lt;/strong&gt; New product context, questions rewritten for the person who actually shows up, one question cut completely because it was seasonal noise nobody cared about, and a guard added so the AI stops asking the same thing twice in different words.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Three learning loops in, activation had gone from 69% to 93%&lt;/strong&gt;, and the first movement showed up inside the first week of running live.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two honest caveats on that number, because it's the one people will quote. It's activation on one app, in one category, over one window, so it isn't a portfolio of case studies and I won't dress it up as one.&lt;/p&gt;

&lt;p&gt;And the winning arm's completion rate moved by about thirteen points between generations of the experiment, which is a reminder that you read these numbers per run, never all-time. That lesson cost me a re-read of my own dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What already shipped
&lt;/h2&gt;

&lt;p&gt;Not a landing page and a waitlist. These pieces exist and run.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The SDK is open source.&lt;/strong&gt; &lt;code&gt;wireai-rn&lt;/code&gt; on npm, MIT licensed, eleven built in components with validated schemas, six adapters for different model providers. Swapping providers is one environment variable, so you're not married to whoever is winning this quarter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The transport is an open standard.&lt;/strong&gt; The device and the backend speak Google's A2A over JSON-RPC 2.0, the same contract implemented on both ends. That's how a Python agent graph ends up driving a native React Native screen. One call, one turn, one card.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The backend is a real service.&lt;/strong&gt; Python, FastAPI, LangGraph. Multi tenant, per app keys with scoped access, session state living outside the process so it scales sideways, data in &lt;code&gt;eu-central-1&lt;/code&gt; because GDPR isn't a Q3 problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;There's a console.&lt;/strong&gt; Register an app, edit the config without cutting a release, read the funnel, open any session and read the transcript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It's tested like something people depend on.&lt;/strong&gt; The drop in kit runs 630 tests on every merge, and the agent routing has its own eval suite with an accuracy gate, so "the agent got worse" shows up as a failing build instead of a feeling.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First card lands in about 130 milliseconds, against roughly three and a half seconds when I started. Onboarding is the one screen where a spinner costs you the user permanently.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a seat gets you
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If Wire AI doesn't lift your activation, you've paid nothing and you still keep the teardown.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the deal in one sentence. Here's everything inside it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Activation Teardown, before you commit to anything.&lt;/strong&gt; I put your existing onboarding through the analysis and send you a report: where people drop, which step leaks, what I would change first and why. It's yours whether you take a seat or walk away, and you don't need to install a single line of code to get it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The install, done by me, by hand.&lt;/strong&gt; Up to four hours on a call, in your codebase, together. Not a docs link and good luck. This is the part that doesn't scale, and it's exactly why there are 15 seats and not 500.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your bugs jump the queue.&lt;/strong&gt; When you hit something broken, and you will, it gets fixed that day instead of queueing behind everything else. That stops being possible the moment this cohort is full.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A direct line to the roadmap.&lt;/strong&gt; What gets built next is what early-access apps need next. At this stage that isn't landing-page language, it's just how the queue works, because there is nobody in front of you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics free to 1 million events a month.&lt;/strong&gt; Any app, not only early access, and it doesn't expire when the beta does.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No price, and that's deliberate. I'm not deciding what Wire AI costs until early access tells me what it's worth, so nobody in these 15 seats gets priced by a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want back
&lt;/h2&gt;

&lt;p&gt;One thing: the truth, while you use it.&lt;/p&gt;

&lt;p&gt;When a question the AI asks is stupid, say so. When the console confuses you, say so. When a number looks wrong, say so, and that one is worth more to me than any testimonial you could write.&lt;/p&gt;

&lt;p&gt;That's the whole trade. You get the teardown, the install, the queue and the roadmap line. I get the thing I can't buy, which is honest reactions from a real app with real users in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it isn't you, it might be someone you know
&lt;/h2&gt;

&lt;p&gt;All three seats that are gone came warm. Somebody knew somebody. Not one came from a cold email, and I have sent a lot of cold emails, so I've stopped pretending that's the channel.&lt;/p&gt;

&lt;p&gt;So if your own app doesn't fit but a name came to mind while you were reading, that's the ask. Forward this to them, or drop the name in a comment and I'll reach out and tell them you sent me.&lt;/p&gt;

&lt;p&gt;Anyone arriving through a referral skips the queue and goes straight to a call. And I'll run the Activation Teardown on your app too, even if you never install anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you say yes, two things you should know
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Only the onboarding stage is live and proven.&lt;/strong&gt; The journey wide experimentation I described up there is the roadmap, not a shipped feature. I'd rather you hear that now than find it out in week two.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;I have an open number I can't explain yet.&lt;/strong&gt; This week my own dashboard read 23% completion on an app that had been finishing north of ninety. I spent a morning on it and I still don't have a clean answer. Best guess is the dashboard, there are two honest ways to compute a completion rate and my headline tile looks like it's reading the wrong one, but I haven't proven it and I'm not going to pretend I have.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both of those are in a launch post on purpose. The product is deliberately incomplete at this stage, and the fastest way to harden it is with a few real apps inside it rather than a year of me polishing it alone. If that reads as a red flag, this isn't the right moment for you and that's a fair call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;You're a fit if you have a React Native or Expo app that's live, with real users going through an onboarding right now, and you're a solo founder or a tiny team where the person who feels the activation problem is also the person who decides.&lt;/p&gt;

&lt;p&gt;It helps if your app already has AI or personalization in it, because then I don't have to sell you the idea and we can go straight to the mechanics.&lt;/p&gt;

&lt;p&gt;You're not a fit if you already have a growth team running experiments every week. Genuinely. A larger company passed on this recently for exactly that reason and they were right to. The value here is removing a person from a loop you don't have. If you have the person, you don't need me.&lt;/p&gt;

&lt;p&gt;Pre launch is also a bad fit, and I say that with some regret because those are usually the most fun conversations. Without traffic there's nothing for the loop to learn from.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to claim a seat
&lt;/h2&gt;

&lt;p&gt;Reply to this email. That's the whole process, there's no form and no demo request.&lt;/p&gt;

&lt;p&gt;Tell me what your app does and roughly how many people go through onboarding in a week. Two sentences is plenty. If it's a fit I'll send you a time this week. If it isn't, I'll tell you straight instead of quietly moving you into a nurture sequence.&lt;/p&gt;

&lt;p&gt;Not sure you qualify? Ask for the teardown anyway. Worst case, you get a report on your own funnel and we both move on.&lt;/p&gt;

&lt;p&gt;12 seats left of 15. The cap is real, because the install is manual and I'm the one doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I make this
&lt;/h2&gt;

&lt;p&gt;I draft with AI. I've written about my workflow more than once and it'd be strange to hide it here. The receipts, the numbers, the decisions and the opinions are mine, the sentences get a drafting partner and then a lot of editing from me. If that disqualifies me for you, fair enough. If it interests you, that's most of what this newsletter is about.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Malik, 9 years building mobile apps, React Native and Expo. I write Code Meet AI, where I show what I'm building with AI and what it costs me. Wire AI lives at &lt;a href="https://getwireai.com" rel="noopener noreferrer"&gt;getwireai.com&lt;/a&gt;, and the SDK is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>reactnative</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Fable 5 vs Opus vs GLM: I had a cheaper model grade the audit of my own code</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Tue, 21 Jul 2026 09:43:04 +0000</pubDate>
      <link>https://dev.to/malik_chohra/fable-5-vs-opus-vs-glm-i-had-a-cheaper-model-grade-the-audit-of-my-own-code-1c64</link>
      <guid>https://dev.to/malik_chohra/fable-5-vs-opus-vs-glm-i-had-a-cheaper-model-grade-the-audit-of-my-own-code-1c64</guid>
      <description>&lt;p&gt;i'm building Wire AI, and the next piece i have to build is the learning loop. It's the self-improving core of the engine: it takes each user's journey inside the app, generates variations of that flow, tests them, and keeps whatever makes people activate and stay. Real implementation work, a big pile of it, and the kind you'd rather not write by hand at frontier prices every single time.&lt;/p&gt;

&lt;p&gt;so i wanted to do that build with a cheaper Chinese model, GLM 5.2, instead of reaching for a frontier model on reflex. one problem. cheap-and-wrong is the most expensive thing there is, and i was not about to let a model i hadn't vetted write production code inside my own engine. so before i trusted it with anything, i gave it a hard, real technical challenge: audit the actual codebase behind Wire AI and tell me where it breaks. not a benchmark, my own code, the files i'd opened a dozen times and thought i understood.&lt;/p&gt;

&lt;p&gt;and i didn't just point GLM at it and hope. i ran the same audit through three models to see where the cheap one really lands: GLM 5.2, the candidate i actually wanted to hire for the build; Opus 4.8, my daily driver and the reference i already trust; and Fable 5, the ceiling. cheap, reliable, frontier, same job, and i'd grade every finding myself.&lt;/p&gt;

&lt;p&gt;Here is what happened, with the receipts, because a feeling is not evidence.&lt;/p&gt;

&lt;p&gt;Most model comparisons you read are benchmark charts on tasks neither you nor the author care about. i wanted the other thing. One real task, my own codebase, the actual numbers off the runs instead of vibes. So i gave three models the identical job inside Claude Code: audit the architecture of this SDK and tell me where it breaks when i build on top of it. Same prompt, same files, same instruction to cite every claim with a real file path. Then i read every output against the source and counted what was actually true.&lt;/p&gt;

&lt;h2&gt;
  
  
  a quick aside on what the codebase even is
&lt;/h2&gt;

&lt;p&gt;The code i audited isn't a side project. It's the engine behind Wire AI, the thing i'm building, and it helps to know what it does before you watch three models take it apart.&lt;/p&gt;

&lt;p&gt;Wire AI finds your app's winning formula. The one-breath version of how: it runs the experience inside your app, the first session a user gets, the moment they finally get it, the parts of the app they find, what they tell you back, then tests the variations itself and keeps the ones that make users stay. You set the goal. The AI runs the loop.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13kgbj3xbgtiz0mw3plr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13kgbj3xbgtiz0mw3plr.png" alt="The Wire learning loop. A user's real journey inside the app feeds the engine, the AI writes variations of the flow, tests them on live traffic, keeps whatever makes users stay, and loops the result back in. You set the goal, the AI runs the loop." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the part that's easy to miss, and it's the reason i keep testing this thing against real code. Changing the app with no release isn't the trick, plenty of tools do that now. The difference is who's holding the pen. In the usual setup a person sits in a no-code builder and drags the new flow together by hand. In this one there's no builder and nobody in the middle: the AI writes the variants, runs them, and promotes the winner. That's the whole bet, and it only works if the engine underneath is right.&lt;/p&gt;

&lt;p&gt;The part i keep pointing models at is exactly that engine, the piece that generates and renders those flows at runtime, the server deciding what a given user sees and the app drawing it without a new binary. It's the code with real users behind it, so it's the code i actually need to be right. Which is why i handed it to three different models and read every word back against the source.&lt;/p&gt;

&lt;h2&gt;
  
  
  the audit, scored
&lt;/h2&gt;

&lt;p&gt;GLM 5.2, the cheap one. Opus 4.8, the one i run every day. And Fable 5, the frontier model, the most capable one i have access to. Same job for all three.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnjp2w5qzyg223sxwb24f.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnjp2w5qzyg223sxwb24f.png" alt="Same audit, three models. GLM 5.2 and Opus 4.8 each found the same 5 core problems at 0 hallucinations. Fable 5 found 11, the same 5 plus 6 more, also 0 hallucinations. All 14 re-verified by a cheaper model, 0 refuted." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GLM and Opus found the same five problems. Not similar problems. The same five, down to the files.&lt;/p&gt;

&lt;p&gt;They both caught that my component types get sealed into the bundle at startup, so an agent can't define a component at runtime. They both caught that streaming is dead on the agent path because the adapter never implemented it. They both caught the drift between what my SDK can render, what my server allows, and what my model actually gets told about. They both traced the coupling between the SDK and the agent backend to the same leaky spot. And they both landed on the same fix, make the registry the single source of truth.&lt;/p&gt;

&lt;p&gt;i verified the citations on both. Zero hallucinations, every file path checked out. GLM even found one extra thing Opus missed: a comment in my backend claiming it runs the latest Claude while the code underneath quietly calls a cheaper OpenAI model. The kind of lie your own codebase tells you.&lt;/p&gt;

&lt;p&gt;So on those two it was a tie. One costs roughly ten times less than the other and it found the same five things. If the story ended there the headline writes itself, run the cheap one for audits, go home.&lt;/p&gt;

&lt;p&gt;Then i gave Fable 5 the identical prompt, and it found eleven.&lt;/p&gt;

&lt;p&gt;Not five. Eleven distinct architectural problems, plus three smaller ones it flagged separately as lower severity. The same five the other two found are in there. Then six more, and i checked those against the source the exact same way. The streaming path advertises a sixty second timeout in its own docstring while a hidden thirty second poll cap kills the request first. The mechanism the SDK exports to tell an agent what components exist is built, tested, and wired into nothing. The registry silently ignores a component swap if you keep the same name. The agent card reads a private Zod internal that a supported version of Zod no longer has, so it degrades to typeless without ever throwing an error. Real, cited, reproducible. Zero hallucinations again, and it rated its own weaker findings as medium confidence instead of overselling them.&lt;/p&gt;

&lt;p&gt;Later i ran the inverse experiment, because trusting a frontier model on my own code without a check is exactly the mistake i tell everyone else not to make. i had a cheaper model independently re-verify all eleven findings, line by line, plus the three secondary ones. Fourteen confirmed, zero refuted. The frontier model found the problems, the cheap one confirmed the homework.&lt;/p&gt;

&lt;p&gt;Take one of them, the sixty-versus-thirty-second one. My agent path promises sixty seconds right there in its own docstring, and underneath it a hidden thirty second poll cap kills the request first. i would have built onboarding flows on top of that, watched a perfectly legitimate agent run die at thirty seconds, and burned an afternoon blaming my prompt or the network before i found the real thing. Fable found it by reading. That's the one that landed for me, because it's the exact kind of bug you only ever meet in production, on a user's screen, at the worst possible time.&lt;/p&gt;

&lt;p&gt;That's the finding that reframes the whole comparison. It's not that Fable is a better model on a leaderboard. It's that on a genuinely hard read, depth is not free, and the cheaper models stopped at the obvious layer.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wz536oj5au6yn9h0z34.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wz536oj5au6yn9h0z34.png" alt="Audit scorecard: GLM and Opus each hit the same 5 core findings with 0 hallucinations. Fable 5 hit 11, the same 5 plus 6 more, also 0 hallucinations, with honest confidence ratings on the harder calls." width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  the numbers behind the runs
&lt;/h2&gt;

&lt;p&gt;This is the part i actually care about, pulled from the session logs, not estimated.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;GLM 5.2&lt;/th&gt;
&lt;th&gt;Opus 4.8&lt;/th&gt;
&lt;th&gt;Fable 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Distinct problems found&lt;/td&gt;
&lt;td&gt;5 (+1)&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;11 (+3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hallucinations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turns / tool calls&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh input tokens billed&lt;/td&gt;
&lt;td&gt;644,000&lt;/td&gt;
&lt;td&gt;88,000&lt;/td&gt;
&lt;td&gt;62,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wall clock&lt;/td&gt;
&lt;td&gt;6.0 min&lt;/td&gt;
&lt;td&gt;18.1 min&lt;/td&gt;
&lt;td&gt;~8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$0.59&lt;/td&gt;
&lt;td&gt;~$6&lt;/td&gt;
&lt;td&gt;~$14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few things jump out.&lt;/p&gt;

&lt;p&gt;Token consumption runs the opposite direction from price. GLM billed six hundred and forty four thousand fresh input tokens for the job. Opus billed eighty eight thousand. Fable billed sixty two thousand, the fewest of the three, and it did the deepest read. The two expensive models lean hard on context caching, reusing what they've already read at a steep discount, and that's most of why they can cost more per token and still not blow up on input. You're not just paying for the weights, you're paying for how few fresh tokens the model needs to hold the whole codebase in its head at once.&lt;/p&gt;

&lt;p&gt;But few tokens is not cheap. Fable billed the fewest fresh input tokens and still cost the most, because the frontier price sits on top of every token and its denser output is expensive to generate. GLM is a tenth of that. So the cost curve and the depth curve run in the same direction: you consume more, you get more, and the more here is real problems in real files, not padding.&lt;/p&gt;

&lt;p&gt;Speed didn't track price either. GLM was fastest at six minutes. Fable came in around eight. Opus, on maximum reasoning effort, took eighteen, because i deliberately run it slow and thorough. Fast and cheap didn't mean shallow on the five, and slow and expensive wasn't the deepest. The deepest was the frontier model, at a middle speed. None of the tidy stories hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  then i made one of them build
&lt;/h2&gt;

&lt;p&gt;A read tests reasoning. It doesn't test whether a model can do unattended work. So i ran a second round, GLM only, on a real build: take the drift bug from the audit and fix it properly. Single source of truth, generated manifest, a test that fails if anything drifts again.&lt;/p&gt;

&lt;p&gt;It worked. Ninety two tests passing when i ran them myself, a drift guard that failed correctly when i sabotaged it on purpose, two previously unreachable components wired through end to end. A clean, verified, tested refactor.&lt;/p&gt;

&lt;p&gt;And the build burned nearly seven times what the audit did. Same model, same codebase, one fix. Not because the fix was large, because building unattended means iterating, and iterating burns tokens. Three hundred and seventeen turns. A hundred and twenty seven tool calls, more than half of them just running tests and reading the errors. On a read the cost gap is enormous and it's in GLM's favor. On a long build it closes fast, because the cheap model pays for its discount in extra steps.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqka2vj0dmabw77s9y3g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqka2vj0dmabw77s9y3g.png" alt="The gap that flips: on the read task GLM is about ten times cheaper than Opus. On the build task the gap closes, because the cheap model burns its savings on debugging loops." width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  what each model actually gave back
&lt;/h2&gt;

&lt;p&gt;All three earned a job. That's the real conclusion, and it's more useful than a winner, because it tells me what to do on Monday.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opus is the daily reliable read. It found the same five things GLM did, cited clean, no drama, on the everyday work where the answer sits at the obvious layer. It's the one i trust without babysitting it, and on a long autonomous build the token efficiency i pay for stops being a luxury and becomes the reason the job finishes cheaper than the sticker suggests.&lt;/li&gt;
&lt;li&gt;GLM is the cheap different lens. It found the same five, at six hundred and forty four thousand tokens of brute-force reading instead of clever caching, and it surfaced the one comment the frontier model didn't. i don't care how it got there when the output is right and the run comes in an order of magnitude under the one i trust. For volume reads it's the pick, and even on a build it finishes, it just pays in turns.&lt;/li&gt;
&lt;li&gt;Fable is the surprising deep finder. It found six real problems the other two walked straight past, in the exact files, with honest confidence about the ones it was less sure of. That's the model you point at the thing before you commit six months to building on top of it. One deep read to not ship on top of a broken assumption is the cheapest line item in the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of them replaced the others. Cheap for volume, efficient for endurance, frontier for depth. Better outcome than a leaderboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  where this actually went
&lt;/h3&gt;

&lt;p&gt;Here's the part that isn't abstract. Those findings didn't sit in a doc. They went back into the engine, and the first tenant running it in production felt the difference.&lt;/p&gt;

&lt;p&gt;The sixty-versus-thirty-second bug and the drift bug were the exact kind of thing that shows up as a mystery failure on a real user's phone. Hardening them was the point of the audit. Around the same stretch i chased the first-card latency on the onboarding and it dropped from about 2279ms to 71ms, because i prefetch the adaptive card while the user answers the fixed questions instead of after, so the first screen a user sees is close to instant now.&lt;/p&gt;

&lt;p&gt;And the loop holds. On the live tenant it runs about 88.5% completion with zero server language-model fallbacks, on real production traffic. When the AI tested the flow length itself, the short version, roughly eight screens, won at 92.8% on its arm. Earlier in that tenant's life the same loop found the message that actually resonated and daily installs went from about 100 to 1,000, because it landed on the exact problem users showed up to solve.&lt;/p&gt;

&lt;p&gt;i want to be honest about what that is. It's a set of real receipts, not one clean before-and-after conversion number. i don't have a single "we lifted X%" figure and i'm not going to invent one. What i have: a hardened engine, a first card that went from a beat-and-a-half to instant, a live flow completing in the high eighties to low nineties with nothing falling back to a language model on the server, and an acquisition number that moved because the loop found the words. That's the improvement, stated as the numbers i can actually stand behind.&lt;/p&gt;

&lt;p&gt;That engine is Wire AI, and here's the one line that matters if you build apps. You put AI &lt;em&gt;in&lt;/em&gt; your product, a feature, a chatbot, a recommendation. i let AI &lt;em&gt;run&lt;/em&gt; mine, the loop above is the AI operating the product's experience, not sitting inside it as one more feature. Same instinct you already have, pointed one layer up. The easiest way in costs you nothing. Analytics free to 1M events/month. Forever. Any app. Wire it up and watch where your own funnel actually leaks before you commit to a thing. If you want the loop itself running your product, i'm taking 10 founders into a free founding cohort right now, and the deal is plain: don't pay if we don't improve your activation. i set it up with you hands-on and stay in it with you month to month, no invoice attached. If you just want to see where your app leaks first, i'll run you a free Activation Teardown, one AI report on your real users, ending in "here's what to fix", no strings. If you ship React Native and you've already got AI somewhere in the app, you're exactly who i want in that cohort. Reply and i'll run your teardown.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest caveats
&lt;/h2&gt;

&lt;p&gt;Four, so nobody quotes this out of context.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is one task type on one codebase. Strong evidence about reading and reasoning over real code. On building it's exactly one data point, GLM only, not a verdict.&lt;/li&gt;
&lt;li&gt;The depth result is one audit. Fable finding eleven where the others found five is a real, verified result on this codebase. It is not a promise the frontier model always doubles the count. Run your own hard task before you trust the pattern.&lt;/li&gt;
&lt;li&gt;The provider matters. i pinned GLM to its first-party host at full precision. The cheaper resellers serving the same model name can be quantized and worse, and then you're measuring the host, not the model.&lt;/li&gt;
&lt;li&gt;And the telemetry isn't perfectly symmetric. The Opus and GLM numbers came from the original run transcripts. Fable's came from a clean re-run of the identical audit, and i've flagged every number that's measured slightly differently instead of smoothing it over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the raw data, the full audit from each model, the telemetry table, and the config i used to run all three, reply RECEIPTS and i'll send the breakdown.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>claude</category>
      <category>programming</category>
    </item>
    <item>
      <title>context engineering, simplified</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Tue, 21 Jul 2026 09:43:04 +0000</pubDate>
      <link>https://dev.to/malik_chohra/context-engineering-simplified-ckb</link>
      <guid>https://dev.to/malik_chohra/context-engineering-simplified-ckb</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prompt is the ask. Context is the ground it stands on: who this is for, what good looks like, the real material, and what to leave alone.&lt;/li&gt;
&lt;li&gt;When the AI gives you generic or wrong output, the reflex is to write a cleverer prompt. Usually the prompt was fine and the context was thin.&lt;/li&gt;
&lt;li&gt;More context is not better context. Dump everything in and the model loses the thread. Curation is the actual skill, and the boundary (what to ignore) is the load-bearing half.&lt;/li&gt;
&lt;li&gt;Write the context down once, in a small set of files next to the code, and every future task starts from ground instead of a guess. Stale context is worse than none, so treat it like a dependency you keep current.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This piece is from &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap04" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where i document how i actually use AI to ship real products, receipts included. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few weeks ago an AI i built into an app asked a real user to name a beach-party plan. First thirty seconds in the product. The app can technically make a plan called that, so it wasn't a hallucination exactly, it was worse: a real feature dragged to the front because the model had nothing better to go on. i had handed it a one-line description of the app and told it to get the user to a concrete first action. A one-line description is an invitation to guess. So it guessed, confidently, in front of someone i was trying to keep.&lt;/p&gt;

&lt;p&gt;That was the moment context engineering stopped being a phrase i skimmed past and became a bug with a name. And here is the part that should get a senior dev's attention: the failure looked exactly like AI code that compiles clean and still ships a bug. Confident, plausible, wrong. The fix was never a better prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  a prompt is the ask, context is the ground
&lt;/h2&gt;

&lt;p&gt;The prompt is what you want. "Write the migration." "Refactor this service." "Draft the onboarding." Short, and you already know how to write one. Context is everything the model needs to answer that well and doesn't have unless you give it: which service owns this, which files are generated and off-limits, what the system actually does and who is on the other side of it. The prompt points at a target. Context is whether the model can see the target or is throwing in the dark.&lt;/p&gt;

&lt;p&gt;Most bad AI output is not a bad prompt. It is a fine prompt fired into an empty room. The model fills the empty room with the most statistically average thing, and average is exactly what makes you close the tab and call it overhyped.&lt;/p&gt;

&lt;h2&gt;
  
  
  the four things you are actually feeding it
&lt;/h2&gt;

&lt;p&gt;When people say "context," they mean four different things stacked together. It helps to see them apart.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwiog84g455dlv73ko90j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwiog84g455dlv73ko90j.png" alt="The four inputs of a working context: the goal, the ground truth, the constraints, and the boundary, feeding one context window." width="800" height="460"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A prompt is the arrow. These four are the ground it lands on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal.&lt;/strong&gt; Not the task, the outcome. "Turn these contracts into a tracker" is a task. "so i can see at a glance which renewals are risky this quarter" is the goal. Give the model the why and it makes better calls on the hundred small things you didn't specify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ground truth.&lt;/strong&gt; The real material, not a description of it. This is the one people skip. Don't tell the AI "our style is terse and functional," paste two modules that already read that way. Examples beat adjectives every time. A model shown three real things you like will out-perform any paragraph describing them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The constraints.&lt;/strong&gt; What good looks like and what to never do. The format. The interface it has to satisfy. The generated files it must not edit. Constraints are not the AI's handcuffs, they are how it knows it succeeded instead of guessing at your taste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The boundary.&lt;/strong&gt; What to leave out and what not to touch. This is the half nobody talks about, and it is coming next, because it is the one that separates people who are good at this from people who just paste more.&lt;/p&gt;

&lt;h2&gt;
  
  
  more context is not better context
&lt;/h2&gt;

&lt;p&gt;Here is the counter-move, and it is the part everyone gets wrong.&lt;/p&gt;

&lt;p&gt;Once you learn that thin context causes bad output, the obvious next step is to feed it everything. The whole repo. The entire history. Every doc, in case it helps. It feels thorough. It is the exact opposite of thorough.&lt;/p&gt;

&lt;p&gt;A model has a working memory, and past a point, adding more doesn't inform it, it distracts it. The signal you actually needed gets buried under fifty files of nearly-relevant noise, and the answer gets vaguer, not sharper. i have watched a model give a worse answer to the same question after i "helpfully" pasted three more files. The good lines were in there. It just couldn't find them anymore.&lt;/p&gt;

&lt;p&gt;So context engineering is not "add context until it works." It is "give it exactly what this task needs, and nothing that competes with that." Curation, not accumulation. Telling the model what to ignore is as load-bearing as telling it what to read. This is the same discipline as scoping a service token: you grant the access the job needs, not everything you own, because blast radius is real whether the risk is a leaked secret or a distracted model.&lt;/p&gt;

&lt;p&gt;The test i use now is embarrassingly simple. Before i paste something in, i ask: does the model need this to answer, or am i adding it to feel safe? The second kind is the noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  how to actually do it
&lt;/h2&gt;

&lt;p&gt;You don't need a framework. You need four sentences before the task, roughly in this order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;State the goal, not just the task.&lt;/strong&gt; One line on the outcome you're actually after. "so that..." is the most useful phrase in the whole practice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show, don't describe.&lt;/strong&gt; Paste two or three real examples of what good looks like. A before, an after, a module you'd be happy to merge. This single move fixes most "it sounds generic" complaints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name the constraints and the anti-goals.&lt;/strong&gt; The format, the interface, the hard limits, and the one or two things it must never do. Short bullets are fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draw the boundary.&lt;/strong&gt; Say what to use and what to ignore. "Only this package." "Don't touch the generated types." "The old implementation is background, not a template."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Four sentences turns a coin flip into something you'd actually ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  write it down once
&lt;/h2&gt;

&lt;p&gt;The last move is what makes this compound instead of repeat. The first time you assemble the context for a recurring job, don't throw it away. Put it in the repo, next to the code it describes. Next time, you point the AI at the folder and add one line for today's task. A five-minute setup becomes a five-second one, and the output stays consistent because the ground under it stopped moving.&lt;/p&gt;

&lt;p&gt;On a real project this is not one file, it is a few, and the names are becoming a standard any agent already reads. &lt;code&gt;PROJECT.md&lt;/code&gt; for what the thing is and why. &lt;code&gt;CONTEXT.md&lt;/code&gt; for what you are working on right now. &lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;AGENTS.md&lt;/code&gt; for the rules and conventions you want followed. &lt;code&gt;README.md&lt;/code&gt; for the human who lands cold. And &lt;code&gt;progress.md&lt;/code&gt;, the &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-02-give-the-ai?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap04" rel="noopener noreferrer"&gt;memory file from episode 02&lt;/a&gt;, for what happened last.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk57ytq5ra9d72wfyn5qm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk57ytq5ra9d72wfyn5qm.png" alt="A code editor showing the context files at a project root: AGENTS.md, CLAUDE.md, CONTEXT.md, PROJECT.md, progress.md, README.md, with CONTEXT.md open and filled in." width="800" height="488"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;the context lives in the repo, not in your head. any AI you point at the folder reads it and knows where it is.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If episode 02 sounds like it is happening again, that is because it is. A memory folder is context that persists across sessions. A context file is the same instinct pointed at a single repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  where this breaks
&lt;/h2&gt;

&lt;p&gt;Two ways, both worth knowing.&lt;/p&gt;

&lt;p&gt;Stale context is worse than no context. A context file that still describes last quarter's architecture will make the AI confidently wrong, and confidently wrong is the expensive kind. When the thing changes, change the file. It is a living note, not a monument, and it belongs in code review like anything else that drifts.&lt;/p&gt;

&lt;p&gt;And context is not a substitute for the check. Grounding the model dramatically raises the floor, it does not remove your job of reading the diff before you trust it. A non-engineer has no compiler and no test suite to catch a confident lie, but neither does your prose. The review step is the job that does not get automated away, and it is its own episode later in this series.&lt;/p&gt;

&lt;p&gt;The punchline is small and annoying and true: most of the time the AI wasn't wrong because it is dumb. It was wrong because it was guessing, and it was guessing because you didn't tell it the thing you assumed was obvious. Context engineering is just the discipline of saying the obvious thing out loud, once, and then reusing it.&lt;/p&gt;

&lt;p&gt;I put together a context starter pack: the four-line context you write before a task, the set of files that give any AI your whole project's context (PROJECT, CONTEXT, CLAUDE, AGENTS, README, and the progress.md memory file from episode 02, each explained), and the one prompt that sets them up for you. It goes out through the newsletter first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Written by Malik at &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap04" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;. This is episode 04 of Using AI, properly. Episode 02 was &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-02-give-the-ai?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap04" rel="noopener noreferrer"&gt;give the AI a memory&lt;/a&gt;, episode 03 was &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap04" rel="noopener noreferrer"&gt;put the AI on the work around work&lt;/a&gt;. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;i'm Malik, i've been a mobile engineer for 9 years, and i run my work and this newsletter on the system these episodes describe. Next up: how to make the AI check its own work, before you do.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>aitools</category>
    </item>
    <item>
      <title>Claude Cowork acts across your files now. Confidence is not correctness.</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Tue, 14 Jul 2026 08:12:31 +0000</pubDate>
      <link>https://dev.to/malik_chohra/claude-cowork-acts-across-your-files-now-confidence-is-not-correctness-1p2b</link>
      <guid>https://dev.to/malik_chohra/claude-cowork-acts-across-your-files-now-confidence-is-not-correctness-1p2b</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat makes you drive every step. Cowork flips it: you describe the outcome, it plans the steps, works across your files and connected apps, and hands back the finished thing.&lt;/li&gt;
&lt;li&gt;Anthropic says more than 90% of Claude Cowork usage is not software development. It is expense memos, contract trackers, client decks, folder cleanup. This week it went to web and mobile, and scheduled tasks run with no device online.&lt;/li&gt;
&lt;li&gt;That is a governance surface, not just a convenience. It acts across whatever you connect, and it is confident when it is wrong. Scope the access, keep the review.&lt;/li&gt;
&lt;li&gt;Start with one task you already resent, give it context first, and check its work like a code review.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This piece is from &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where i document how i actually use AI to ship real products, receipts included. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This Monday Anthropic put a number on something most of us felt but hadn't measured. They expanded &lt;a href="https://anthropic.skilljar.com/introduction-to-claude-cowork" rel="noopener noreferrer"&gt;Claude Cowork&lt;/a&gt; to web and mobile and shared what people actually run on it: more than 90% of usage is not software development. Not code. The biggest categories were business operations and content work. Reconciling the quarter's spend and drafting the memo about it. Turning a folder of contracts into a renewals tracker with the risks flagged. Building tomorrow's client deck from call transcripts.&lt;/p&gt;

&lt;p&gt;They call it "the work around work." Good name. It is the layer of the job that is real work, takes real hours, and somehow is nobody's actual job.&lt;/p&gt;

&lt;p&gt;If you write code, you have had this delegation engine for a year in the terminal. Cowork is that same engine pointed at everyone else's work. The interesting part for us is not the convenience. It is that the tool now acts, on its own, across whatever you connect it to. That changes what "review" means.&lt;/p&gt;

&lt;h2&gt;
  
  
  what Cowork is, in one honest paragraph
&lt;/h2&gt;

&lt;p&gt;You already know chat: you ask, it answers, you ask again. You are the project manager of every tiny step.&lt;/p&gt;

&lt;p&gt;Cowork is the same Claude with a different job description. You hand it an outcome: "turn this folder of contracts into a renewals tracker, flag anything risky." It makes a plan, breaks it into steps, works across the files and apps you have connected, and comes back with the finished thing. While it runs, you do something else. Since this week it follows you: start a task at your desk, check the status on your phone, pick up the result later with the laptop closed. Scheduled tasks run even with no device online.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakxymrhnx0i98541kftg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakxymrhnx0i98541kftg.png" alt="Chat versus Cowork: driving every step versus describing the outcome and reviewing the deliverable." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Chat: you drive. Cowork: you describe, then review.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6i7hmoc1lu7m95wc2hrr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6i7hmoc1lu7m95wc2hrr.png" alt="Malik's Claude home screen: the Chat and Cowork toggle set to Cowork, model Opus 4.8, with suggested ideas Send me a daily briefing, Organize my inbox, Customize Cowork for me." width="800" height="594"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;my actual Claude home. one toggle flips chat into Cowork, and "send me a daily briefing" is already sitting there as a suggestion.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One tool, two jobs, and the second job is most people's actual day.&lt;/p&gt;

&lt;h2&gt;
  
  
  what people actually run on it
&lt;/h2&gt;

&lt;p&gt;Not moonshots. Chores. The patterns showing up again and again in the early write-ups:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Folder archaeology.&lt;/strong&gt; Sort, rename, and deduplicate a cluttered folder. Rename 400 photos to match the product list. The task postponed for a year because it is three hours of mind-numbing clicking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pile of documents, should be a list.&lt;/strong&gt; A folder of contracts becomes a renewals tracker with dates and risk flags. A stack of receipts becomes an expense sheet. Dense PDFs in, structured table out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recurring report.&lt;/strong&gt; The weekly status, the morning brief, the numbers pulled into the same format every Monday. Described once as a routine, in plain language: what to gather, what format, where to deliver it. It runs every morning without you. Cron, described in English, with file and app access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First drafts from your own material.&lt;/strong&gt; Tomorrow's client deck from the call transcripts. The variance memo from the spreadsheet. Not "write me something generic," but "turn my raw material into my draft."&lt;/p&gt;

&lt;p&gt;The common shape: high effort, repeatable, source material already in your files.&lt;/p&gt;

&lt;h2&gt;
  
  
  the part that should get your attention
&lt;/h2&gt;

&lt;p&gt;Here is where the senior-dev instinct earns its keep. Two things about this tool are load-bearing, and both are easy to wave past.&lt;/p&gt;

&lt;p&gt;It has access to what you give it. That is the feature and the risk in one sentence. Connect the folders and tools the job needs, not everything you own. This is least privilege, the same principle you apply to a service token or an OAuth scope, except the person setting it up may never have thought about blast radius in their life. A general-purpose agent with read and write access to your whole drive is a very different thing from one pointed at a single project folder.&lt;/p&gt;

&lt;p&gt;And it is confident, including when it is wrong. A renewals tracker with one silently wrong date is worse than no tracker, because someone will trust it. You already know this shape from AI-generated code that compiles clean and still ships a bug. The difference is that a non-engineer has no compiler, no test suite, no diff habit to catch it. The review step is not optional politeness. It is the entire job that does not get automated away.&lt;/p&gt;

&lt;p&gt;So the honest framing is not "AI does your admin now." It is "AI does your admin now, and it needs the same governance you already give your code: scoped access, and a review before you trust the output."&lt;/p&gt;

&lt;h2&gt;
  
  
  how to start: one resented task
&lt;/h2&gt;

&lt;p&gt;Don't tour the features. Pick the one task you flinched at earlier. Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Give it context first.&lt;/strong&gt; Before the task, point Cowork at a short context file: what this project is, what good output looks like, what to leave alone. If you have given an AI a &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-02-give-the-ai?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;memory folder&lt;/a&gt; before, this is the same muscle. Two minutes, and the output quality jump is not subtle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe the outcome, not the steps.&lt;/strong&gt; "Make this folder make sense: group by client, newest first, flag anything duplicated" beats a 12-message back-and-forth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review like a manager, not a believer.&lt;/strong&gt; Open the deliverable, spot-check five rows against the source. A code review with different file types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it worked twice, make it a routine, and scope it tight.&lt;/strong&gt; Describe it once, give it access to exactly the folder it needs, and stop doing it forever.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  the punchline
&lt;/h2&gt;

&lt;p&gt;The AI didn't take the work. It took the work around the work. What's left over is the part that needed you all along: deciding, and checking. For us that is not new. We just called it code review and least privilege. The rest of the world is about to learn why we were so annoying about both.&lt;/p&gt;

&lt;p&gt;I am putting together a routines starter pack: three plain-language routine templates (the folder cleanup, the pile-to-tracker, the morning brief) you can adapt in five minutes. It goes out through the newsletter first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Written by Malik at &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;. This is episode 03 of Using AI, properly. Episode 02 was &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-02-give-the-ai?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;give the AI a memory&lt;/a&gt;, episode 01 was &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-01-the-art-of-prompting?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;the art of prompting&lt;/a&gt;. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;i'm Malik, i've been a mobile engineer for 9 years, and i run my work and this newsletter on the system these episodes describe. The delegation habit started in the terminal, moved to my &lt;a href="https://codemeetai.substack.com/p/how-to-build-a-second-brain-with?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap03" rel="noopener noreferrer"&gt;second brain&lt;/a&gt;, and now it does the work around the work. Next up: where a single sentence stops helping, and context begins.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>aitools</category>
    </item>
    <item>
      <title>Memory you can't inspect is memory you can't trust</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Fri, 10 Jul 2026 14:48:10 +0000</pubDate>
      <link>https://dev.to/malik_chohra/memory-you-cant-inspect-is-memory-you-cant-trust-4mb4</link>
      <guid>https://dev.to/malik_chohra/memory-you-cant-inspect-is-memory-you-cant-trust-4mb4</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every new session your AI starts from zero. It doesn't remember you, your repo, or the thing it got wrong yesterday.&lt;/li&gt;
&lt;li&gt;The fix is not a feature you wait for, it's a file you write. Two, actually: house rules (&lt;code&gt;CLAUDE.md&lt;/code&gt;) and a diary (a memory folder).&lt;/li&gt;
&lt;li&gt;The habit that makes it work: end each session with "what should you remember from this? write it down," and save the answer as one small note.&lt;/li&gt;
&lt;li&gt;Wrong memories are worse than none. Keep each note to one fact so you can delete it the day it stops being true.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This piece is from &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap02" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where i document how i actually use AI to ship real products, receipts included. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This Tuesday my AI told me a piece of work was shipped. Merged, published, CI green, the whole report. It wasn't. The server was still serving week-old code, and i only caught it because i went and hit the actual endpoint instead of trusting the summary.&lt;/p&gt;

&lt;p&gt;Annoying. But here is the part worth stealing. Instead of fixing it and moving on, i had the AI write the lesson down. One small note in the project's memory folder: "merged is not deployed. before you say shipped, curl the live thing and check the release SHA against the merge, twice."&lt;/p&gt;

&lt;p&gt;Next morning, new session, zero context, the model has no memory of Tuesday. I run an &lt;code&gt;npm publish&lt;/code&gt; and it stops me: the version on the registry didn't match the build we had just tested. It caught the exact same class of mistake, on its own, because Tuesday's note was sitting in a file it reads on startup.&lt;/p&gt;

&lt;p&gt;That's the whole trick, and it lives in your repo, not in some feature you're waiting for.&lt;/p&gt;

&lt;p&gt;I didn't plan any of this. It grew out of my repos. Each project got a small folder of markdown the AI reads before it writes a line of code, so it never opens the thing cold. That worked well enough that i lifted the whole pattern out of the codebase. My second brain runs on it now, the Obsidian vault too, and every work session i close ends by writing to the same kind of file. The pattern i built for my repos runs my notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  your AI opens the project blind
&lt;/h2&gt;

&lt;p&gt;You know this if you pair with Claude Code or Cursor daily. The first ten minutes of every session go to re-explaining the same things. The stack, where the API client lives, which files are generated, the conventions you moved to and the pattern you moved off. Good session. Next morning it opens the repo like it has never seen it.&lt;/p&gt;

&lt;p&gt;So you type it all out again. Every day.&lt;/p&gt;

&lt;p&gt;There was a thread on &lt;a href="https://reddit.com/r/ClaudeAI" rel="noopener noreferrer"&gt;r/ClaudeAI&lt;/a&gt; this week, roughly titled "I often forget how many people are clueless when it comes to Claude (or any AI)." A bit harsh. The gap it points at is real though, and it is not intelligence, it is setup. The people getting compounding value out of these tools are not smarter. They stopped re-briefing the assistant every morning.&lt;/p&gt;

&lt;p&gt;A session is a phone call. When it ends, the other side keeps no notes unless somebody writes them down. So write them down.&lt;/p&gt;

&lt;h2&gt;
  
  
  two kinds of memory, two files
&lt;/h2&gt;

&lt;p&gt;Everything worth keeping splits into two buckets, and they belong in two different places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;House rules.&lt;/strong&gt; The stuff that is always true: the stack, the conventions, the boundaries, the things it should never touch. One standing file the AI reads at the start of every session. In Claude Code that file is literally &lt;code&gt;CLAUDE.md&lt;/code&gt;. Cursor calls it &lt;code&gt;.cursorrules&lt;/code&gt;, some tools read &lt;code&gt;AGENTS.md&lt;/code&gt;. Same idea everywhere, a one-page briefing that is just always there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The diary.&lt;/strong&gt; The stuff it learns as you go: a correction, a decision that closed a debate, a gotcha. "The Android build breaks if you bump reanimated past the pinned version." "We dropped the March API, stop importing it." "Merged is not deployed." Learned facts, they change, so they don't belong in the house rules.&lt;/p&gt;

&lt;p&gt;Here is the part people overbuild. On day one the diary is one file. Make a &lt;code&gt;memory.md&lt;/code&gt; in the repo root, tell the AI to read it at session start, and add a line whenever something worth keeping shows up. A working memory system, no framework, no folder. The folder version is an upgrade you grow into, and i'll show you mine in a minute. But it starts as one file you could open in any editor.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhg3sesrfxuvcbl6vyqvy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhg3sesrfxuvcbl6vyqvy.png" alt="Two kinds of remembering: the standing house-rules file the AI always reads, and the memory folder of small learned facts with an index." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;House rules are written once and edited rarely. The diary grows a note at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why the split matters: &lt;code&gt;CLAUDE.md&lt;/code&gt; you write once and edit rarely, the diary grows every week and any note in it can turn out wrong later. Mix them and your always-on briefing slowly fills with stale facts, the one file you least want rotting. Keep them apart and each stays honest.&lt;/p&gt;

&lt;p&gt;The tools already exist and you'll meet them as you go. Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt; plus a memory folder automatically, the community ships things like claude-mem that record whole sessions, ChatGPT and Claude both have built-in memory they fill on their own. All fine. The plain file has one quiet advantage though: you can open it, diff it, and delete the wrong bits, and git already keeps the history. Memory you can't inspect is memory you can't trust, and a file you wrote is the most inspectable memory there is.&lt;/p&gt;
&lt;h2&gt;
  
  
  the capture loop
&lt;/h2&gt;

&lt;p&gt;The memory folder doesn't fill itself. The habit that fills it takes about two minutes.&lt;/p&gt;

&lt;p&gt;At the end of a session, ask: "what should you remember from this session? write it down."&lt;/p&gt;

&lt;p&gt;That's it. Every correction, every "actually, do it this way," every decision that closed a question becomes a candidate. The AI writes each as its own small note and adds a line to the index.&lt;/p&gt;

&lt;p&gt;I'm not the only one on a version of this. One of the most upvoted posts on &lt;a href="https://reddit.com/r/ClaudeAI" rel="noopener noreferrer"&gt;r/ClaudeAI&lt;/a&gt; this month, close to three thousand upvotes, was titled "I end every AI session with two questions." The session-ending ritual is quietly becoming the power move, because it converts a good session, which evaporates the moment you close the tab, into a note, which does not.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyw31k580l8yizu34asa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyw31k580l8yizu34asa.png" alt="The capture loop: work, then a correction, then one small note in memory, then the next session reads it and behaves better." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;One turn of the loop per session. It compounds fast.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mine runs on two habits. During the day, anything worth keeping gets dumped into an inbox note without stopping to sort it. At the end of a session the AI does the ritual: sorts what it learned, writes the notes, updates the index. Next morning it reads the index and picks up where we left off.&lt;/p&gt;
&lt;h2&gt;
  
  
  the memory bank: one folder per repo
&lt;/h2&gt;

&lt;p&gt;Once the one-file &lt;code&gt;memory.md&lt;/code&gt; clicks, there's a natural upgrade, and it's still just files. I call it a memory bank: one small folder per repo, two files inside.&lt;/p&gt;

&lt;p&gt;The first is the &lt;strong&gt;context&lt;/strong&gt;: what this repo is, the stack, the conventions, the boundaries, the things the AI must never touch. You write it once and edit it rarely. The second is the &lt;strong&gt;progress&lt;/strong&gt;: a dated log of where the work actually stands, updated at the end of each session. Drop both in a &lt;code&gt;.memory/&lt;/code&gt; folder in the repo (or &lt;code&gt;docs/&lt;/code&gt;, wherever your team already looks) and point the AI at them on startup.&lt;/p&gt;

&lt;p&gt;Here's the whole thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;your-repo/&lt;/span&gt;
  &lt;span class="s"&gt;.memory/&lt;/span&gt;
    &lt;span class="s"&gt;context.md    stack, conventions, boundaries, hard no's. written once.&lt;/span&gt;
    &lt;span class="s"&gt;progress.md   2026-07-09&lt;/span&gt;&lt;span class="na"&gt;: shipped the auth refactor. open: token-refresh race. next&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wire the retry.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same shape for every repo you touch. The context file barely moves. The progress file is a diary with dates. Open a session, the AI reads both, and it starts from where the code actually is instead of from zero. This is not theory for me: my whole work life runs on these folders, and the "merged is not deployed" catch from the opener came straight out of one.&lt;/p&gt;

&lt;p&gt;You don't have to hand-roll it either. Paste this into the AI once, per repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I want to give you a memory for this repo. Do two things.

First, create .memory/context.md. Interview me before you write it: ask one question at a time about what this repo is, the stack, the conventions, and the things you must never touch. Then write a one-page briefing you would want to read at the start of every session.

Second, create .memory/progress.md. Start it with today's date and one line: where the work stands right now.

From now on, read both files at the start of every session on this repo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And at the end of each session, this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before we finish, update .memory/progress.md. Add today's date and 3 to 5 lines: what we did, what we decided, what is still open, and anything you should remember next time. If i corrected you today or gave you a convention, put that in context.md instead. Keep both files short. Cut anything that is no longer true.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second prompt is the whole engine. It's the capture loop from the last section, turned into a habit you can paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  one fact per note, so you can fire it
&lt;/h2&gt;

&lt;p&gt;The rule that took me longest to learn: one fact per note.&lt;/p&gt;

&lt;p&gt;Not a session summary. Not a changelog. One fact, a couple of lines, with a date. "2026-07: merged is not deployed, verify the live endpoint before reporting shipped." That's a whole note.&lt;/p&gt;

&lt;p&gt;The reason is not tidiness. Memories go stale, and a stale memory is worse than no memory, because the model states it with full confidence. The component gets refactored, the workaround you swore by gets fixed upstream, the dependency you pinned moves on. When each fact lives alone, you delete that one note and the rest stays intact. When facts live tangled in a long summary, you can't pull the rotten one without rewriting everything, so nobody does, and the whole thing quietly rots.&lt;/p&gt;

&lt;p&gt;My memory folder is a few months old now. Notes get added most days, and deleted too, and that is not the system failing, that is the system working. Tuesday's "merged is not deployed" note earned its place by catching a real mistake inside twenty-four hours. A note that never fires again for months gets cut.&lt;/p&gt;

&lt;h2&gt;
  
  
  where this breaks
&lt;/h2&gt;

&lt;p&gt;Honest limits, because there are some.&lt;/p&gt;

&lt;p&gt;Memory doesn't make the AI right, it makes it consistent. Write down a wrong fact and you now have a machine that repeats your mistake politely, forever. Re-check anything important that came out of memory, especially anything with a date on it.&lt;/p&gt;

&lt;p&gt;No secrets in there. Tokens, keys, other people's private data. A memory folder is a plain readable file and it's probably tracked in git, so treat it like one.&lt;/p&gt;

&lt;p&gt;And don't over-collect. The goal is not to remember everything, it's to stop re-explaining the same ten things. If your index runs longer than a page, you're hoarding, not remembering.&lt;/p&gt;

&lt;h2&gt;
  
  
  start on your next branch
&lt;/h2&gt;

&lt;p&gt;Two files. A &lt;code&gt;CLAUDE.md&lt;/code&gt; with your stack and conventions. An empty memory folder with an empty index. Then end your next session with "what should you remember from this?" and let it write note one.&lt;/p&gt;

&lt;p&gt;That's the whole setup. The assistant you pair with next week already feels different from today's, and the gap only widens from there.&lt;/p&gt;

&lt;p&gt;I put together a memory starter pack: the &lt;code&gt;CLAUDE.md&lt;/code&gt; template i actually use, the note format, the index file, and the exact session-ending prompt. It goes out through the newsletter first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Written by Malik at &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap02" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;. This is episode 02 of Using AI, properly. Episode 01 was &lt;a href="https://codemeetai.substack.com/p/using-ai-properly-01-the-art-of-prompting?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap02" rel="noopener noreferrer"&gt;the art of prompting&lt;/a&gt;. New guides land there first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;i'm Malik, i've been a mobile engineer for 9 years, and i run my work and this newsletter on the system these episodes describe. The memory folder is where &lt;a href="https://codemeetai.substack.com/p/how-to-build-a-second-brain-with?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap02" rel="noopener noreferrer"&gt;the second brain&lt;/a&gt; and this newsletter both live now. Next up: putting the AI to work on the work around the work.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Loop engineering with Fable 5</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Wed, 08 Jul 2026 19:52:33 +0000</pubDate>
      <link>https://dev.to/malik_chohra/loop-engineering-with-fable-5-4dfp</link>
      <guid>https://dev.to/malik_chohra/loop-engineering-with-fable-5-4dfp</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I pointed Fable 5 at my own React Native SDK, read only. It found 11 real bugs, each cited to a file and a line, six more than the two other models on the same job. A cheaper model re-checked all 11 against the source. 0 got refuted.&lt;/li&gt;
&lt;li&gt;Finding bugs just got cheap. The moat moved to the check: tests plus reviewer agents run in a clean context, the part that does not come in the box.&lt;/li&gt;
&lt;li&gt;A model in a loop with no check is a confident intern shipping unwatched. The check is the discipline that keeps it useful instead of dangerous.&lt;/li&gt;
&lt;li&gt;Below: the two paste-able prompts I run (a read-only architecture audit and a weekly news loop), the receipts, and the loop I run them in.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This piece is from &lt;a href="https://codemeetai.substack.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where I document how I actually use AI to ship real products, receipts included. New guides land there first. It was &lt;a href="https://codemeetai.substack.com/p/how-im-actually-using-fable-5-with?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;originally published there&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finding bugs used to be the expensive, senior skill. Then I pointed Fable 5 at my own &lt;a href="https://github.com/chohra-med/wireai-rn?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;React Native / Expo SDK&lt;/a&gt;, read only, and asked where the code breaks when another app builds on top of it. It handed back eleven real problems, each cited to a file and a line, six more than the two other models I ran on the same job. A cheaper model re-checked all eleven against the source. Zero got refuted.&lt;/p&gt;

&lt;p&gt;That should scare you a little, not excite you. A model that good at finding things, wired to also fix and ship them unwatched, is a confident intern with commit access. The risk is not that it is wrong. The risk is that it is confidently, plausibly wrong on the one path that actually ships, and nobody checked. The discipline that keeps that intern useful instead of dangerous is the check. That is the whole job now, and it is the beat everyone skips.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0nj7qvwxazfvon99ibur.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0nj7qvwxazfvon99ibur.png" alt="My last 7 days in Claude Code. Opus 4.8 and Fable 5, split about 58/42." width="800" height="718"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;My last 7 days in Claude Code. Opus 4.8 and Fable 5, split about 58/42. This is not a test drive: Fable does roughly 40 percent of my real work now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So a model that good at finding things is only worth the bill if you do something with the finding, and "chatting with it" is not that. The way I actually use a model like this is the way I use every model now. I do not talk to it. I put it in a loop, and I spend my own time on the one part of the loop that still needs me.&lt;/p&gt;

&lt;p&gt;Here is the loop, the prompts, and the part that does the real work.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a loop actually is
&lt;/h2&gt;

&lt;p&gt;Every loop has the same four beats.&lt;/p&gt;

&lt;p&gt;Goal. You write down what done means before anything runs. Not a vibe, a test. Something that can come back true or false.&lt;/p&gt;

&lt;p&gt;Act. The model takes one step toward that goal.&lt;/p&gt;

&lt;p&gt;Check. Something compares the result against the goal.&lt;/p&gt;

&lt;p&gt;Repeat. Failed the check, go again. Passed, stop.&lt;/p&gt;

&lt;p&gt;The check is the beat everyone skips. It is also the whole game, and I will come back to it, because it is where finding a bug and actually shipping a fix stop being the same thing.&lt;/p&gt;

&lt;p&gt;For content people the goal might be "beats my best newsletter." For me the goal is a codebase that stays green. Same shape, different done. I run this loop as a system I call Spec Harness: plan, spec, build, verify, learn. The model does the building. The verify step is the check. The learn step is what makes tomorrow's loop tighter than today's.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi3fznumhs94lp18ote06.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi3fznumhs94lp18ote06.png" alt="The loop, four beats. Goal, act, check, repeat. The check is the one everyone skips." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The loop, four beats. Goal, act, check, repeat. The check is the one everyone skips.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I prompt Fable for the read that sets the goal
&lt;/h2&gt;

&lt;p&gt;The loop needs a goal, and for code the goal starts with an honest read of what is actually wrong. That read is the one place I pay for the frontier model, because it is a single expensive pass I run once, not the grind that comes after.&lt;/p&gt;

&lt;p&gt;Four things make the read worth the money.&lt;/p&gt;

&lt;p&gt;Give it the reason, not just the task. "Audit this SDK, two apps are about to ship on top of it" gets a sharper read than "find bugs."&lt;/p&gt;

&lt;p&gt;Set a boundary. Read only. It audits, it does not touch the code. Finding and fixing are different beats of the loop, and letting one model do both in one breath makes both sloppy.&lt;/p&gt;

&lt;p&gt;Make it cite everything. Every finding points at a real file and line. A made-up bug cannot cite a real location, so this one rule kills hallucinations. It is also how I spot-checked eleven findings in minutes.&lt;/p&gt;

&lt;p&gt;Make it grade itself. Rate each finding high, medium, low. A model that will admit "medium, not certain" on its weak calls is one you can trust on the strong ones.&lt;/p&gt;

&lt;p&gt;The paste-able version, adapt the paths to your repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit the architecture of &amp;lt;package or feature dir&amp;gt; in this React Native / Expo app. Read only. Do not edit a single file.

Context: this ships to real users on real phones in a few days, and other screens (in my case, other apps too) are being built on top of it. I care about the problems that survive to production and page me at 2am, not style nits.

For every problem you find:
- cite the exact file and line
- explain how it breaks when someone builds on top of it, or when it hits a real device: slow or dropped network, the app backgrounded mid-request, low memory, a cold start, or the OS killing and restoring the process
- name the layer it lives in: state, navigation, data fetching, a native module, or the public API other code depends on
- rate your confidence high / medium / low, and for anything medium, say exactly what you'd need to read to make it high

Prioritise, in this order: silent data loss, a failure the user never sees but that corrupts state, anything that only breaks after the app is killed and reopened, and any API shape that forces a breaking change on the screens already built on it.

Do not pad the list. Ten real, cited problems I can fix today beat forty maybes. If an area is genuinely solid, say so plainly instead of inventing a finding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I hand the list to a cheaper model and ask it to refute each finding against the source. Zero of the eleven survived as false. Frontier finds, cheap checks, I do neither by hand. That verified list is the goal the rest of the loop runs against.&lt;/p&gt;

&lt;p&gt;If you do not write code, the same four rules work on anything you ship. Here is the one I run on the marketing side once a week. It reads the week's news in my space, hands back posts I could actually publish, and ranks them against what has already worked for me. Different job, identical bones: give it the reason, keep it read-only, make it cite every claim to a real source, make it grade its own confidence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scan the last 7 days of news and discussion in &amp;lt;your space&amp;gt;. Read and gather only, publish nothing.

Goal: three posts I could ship this week that would beat my best-performing post, not generic hot takes.

For each one:
- link the exact article, thread, or number it is built on (no angle without a real source)
- write it as a post I could publish as-is, in my voice, not a summary of the news
- name which of my patterns that has worked before it matches, and why it should land
- rate your confidence high / medium / low; for any medium, say what you would need to know about my audience to make it high

Then rank the three against what has actually worked for me before, and tell me the one you would cut.
Do not pad. One post I can ship today, tied to a real source, beats five vague trend-chases.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap "posts" for "emails," "landing sections," or "feature ideas" and the shape holds. The domain changes; the four rules do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The effort dial, and the one place I still switch models
&lt;/h2&gt;

&lt;p&gt;The advice going around is to stop switching models and just use Fable's effort dial. Turn it down for easy work, up for hard, one model for everything. For a single reasoning pass, that is right. I leave the dial on high, push it up when the read is genuinely hard, and I stopped babysitting the model picker for one-shot work.&lt;/p&gt;

&lt;p&gt;The dial does not save you inside a loop, though.&lt;/p&gt;

&lt;p&gt;A build loop iterates for hundreds of turns, and every turn re-sends a growing context at the model's per-token rate. That rate is what compounds, not how hard the model thought on any single turn. I watched the same cheap model that audited my SDK for fifty nine cents spend four dollars building one fix, because building means running tests and reading errors over and over. Put a frontier model on that loop with the dial turned down and you are ordering the cheap wine at a three-star restaurant. You saved on the wrong line.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73jvwk43duhwu1l0wcmv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73jvwk43duhwu1l0wcmv.png" alt="A normal day. I run the window down to the wall, it resets, I do it again." width="799" height="93"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A normal day. I run the window down to the wall, it resets, I do it again. That is what "I actually use it" looks like on the invoice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I do both. The dial for the single read. A cheaper model for the loop that grinds. One is a knob inside a model, the other is a knob across phases. They are not the same knob.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftfaqym790m5v48bw7qy8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftfaqym790m5v48bw7qy8.png" alt="Pay the frontier rate once for the read. Drop to a cheaper model for the build loop." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Pay the frontier rate once for the read. Drop to a cheaper model for the build loop, where the cost compounds every turn.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the loop: the check is the part you actually build
&lt;/h2&gt;

&lt;p&gt;Writing the loop is easy. Writing the check is the job.&lt;/p&gt;

&lt;p&gt;Charlie Hills, whose piece got me writing this one, builds his check as a rubric. He fed a model a hundred and ten past newsletters plus their engagement numbers, had it pull out a scoring rubric, and now a separate judge agent scores every draft against it until it clears the bar. Separate judge, on purpose, so nothing grades its own homework.&lt;/p&gt;

&lt;p&gt;My check is not a content rubric. It is tests, plus agents that read like a senior reviewer, all run in a clean context so nothing marks its own 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ho5kojc169a959ohddk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ho5kojc169a959ohddk.png" alt="The check is tests plus a reviewer agent plus a workflow-tester, all run in a clean context." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The check is tests plus a reviewer agent plus a workflow-tester, all run in a clean context so nothing grades its own homework.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two of those agents earn their keep every week.&lt;/p&gt;

&lt;p&gt;A reviewer agent. I was wiring the same &lt;a href="https://getwireai.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;AI onboarding&lt;/a&gt; into two apps at once, mine and a client's, built days apart. The reviewer read both and found the same three mistakes in each. Config hand-rolled separately instead of calling the one shared helper, the copy-paste that drifts the second you touch it. An onboarding that asked the user what they cared about and then threw the answers away before saving, a quiet data-loss bug I would never have caught by eye. And a fallback I promised in a code comment and never wired, so a backend timeout would have dead-ended the new user instead of dropping them back to the old flow. Three real bugs, twice, caught by the check, not by me.&lt;/p&gt;

&lt;p&gt;A workflow-tester agent. On another job it caught a status-code bug: a database outage was reaching the client as the wrong HTTP code, a four hundred where it had to be a five hundred. The kind of thing that passes every happy-path test and pages you at 2am.&lt;/p&gt;

&lt;p&gt;That is the check. It is boring, it is most of the work, and it is the reason I can let the loop run on something without watching it.&lt;/p&gt;

&lt;p&gt;The one Fable finding I actually shipped went through exactly this. The goal was a failing test for a timeout bug it found, a path that advertised a sixty second limit in its own docstring while a hidden thirty second cap killed the request first. Opus wrote the fix. The check ran the full suite, eighty eight of eighty eight green, plus the review gate, before it ever became a pull request. Goal, act, check, repeat, then stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your codebase is the moat
&lt;/h2&gt;

&lt;p&gt;Charlie's line is that your data is the moat, because every model read the same internet and everyone's output sounds the same, so the differentiator is your own history fed into the loop. For code it is the same idea one layer over.&lt;/p&gt;

&lt;p&gt;Every model has read the same open source. What it has not read is your bugs.&lt;/p&gt;

&lt;p&gt;The learn step of my loop turns every bug the check catches into a dated rule the harness enforces next time. The reviewer's three mistakes became an eight-point review bar, so app number three cannot repeat what apps one and two did. The eleven Fable findings, the ten I deferred, the triage note for when they come back, all of it is a private test set that grows every week and belongs to nobody else. A general model finds a bug. My harness knows which bugs I keep making. That accumulation is the thing you cannot download.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F33e6crphh0aflvbka1mz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F33e6crphh0aflvbka1mz.png" alt="41 million tokens, a 9-day streak, active every single day." width="800" height="699"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;41 million tokens, a 9-day streak, active every single day. The loop is a habit, not a demo, and the rules it has ratcheted out of my bugs are the part nobody else has.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The check is the job
&lt;/h2&gt;

&lt;p&gt;Finding got cheap. Fable proved it on my own code, eleven real problems for the price of lunch, better than I did by eye. That skill, the one you used to pay a senior nine years in for, just got commoditized.&lt;/p&gt;

&lt;p&gt;The check did not.&lt;/p&gt;

&lt;p&gt;The tests you wrote, the rules you ratcheted out of your own mistakes, the judgment to ship one finding and defer ten in launch week because you know which ones touch the path that is actually shipping, none of that came in the box. A model in a loop with no check is a confident intern shipping unwatched. Slop is a failure of judgement, not tooling, as Charlie puts it. The loop scales you exactly as far as your check is good, and not one inch further.&lt;/p&gt;

&lt;p&gt;So that is how I actually use Fable 5. I do not chat with it. I pay it once for the honest read, I drop to a cheaper model for the grind, and I spend my own time on the check, because that is the part that is still mine.&lt;/p&gt;

&lt;p&gt;Finding what is wrong is free now. Checking it is the job.&lt;/p&gt;




&lt;p&gt;Want the loop itself? The &lt;a href="https://choumed.gumroad.com/l/loop-engineering-starter-kit?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;loop starter kit&lt;/a&gt; is the four-part loop plus the verifier and ratchet templates I actually run it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Written by Malik Chohra&lt;/strong&gt;, AI-first mobile engineer, 9 years building health, wellness, and coaching products (Mindshine, acquired by Greator; DocMorris; CoachHub). I build the AI-native infrastructure the next wave of mobile products runs on, including &lt;a href="https://getwireai.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;getwireai.com&lt;/a&gt; and &lt;a href="https://aimobilelauncher.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;aimobilelauncher.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This was one issue of Code Meet AI.&lt;/strong&gt; I document how I actually use AI to ship real products, receipts included, and new guides land there first. Subscribe at &lt;a href="https://codemeetai.substack.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=fable5-method" rel="noopener noreferrer"&gt;codemeetai.substack.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
    <item>
      <title>GLM 5.2 for 59 cents: the read is cheap, the build isn't</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Tue, 07 Jul 2026 17:21:40 +0000</pubDate>
      <link>https://dev.to/malik_chohra/glm-52-for-59-cents-the-read-is-cheap-the-build-isnt-18l1</link>
      <guid>https://dev.to/malik_chohra/glm-52-for-59-cents-the-read-is-cheap-the-build-isnt-18l1</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GLM 5.2 is the open-weight model everyone is benchmarking right now: a tenth of Claude's price, a one million token context window. Instead of reading takes, I ran it on my own SDK.&lt;/li&gt;
&lt;li&gt;The setup is five lines in your Claude Code settings, routed through OpenRouter. Pin the Z.ai provider and turn off fallbacks, or you might be testing a quantized knockoff.&lt;/li&gt;
&lt;li&gt;The architecture read: 41 files, every citation real, 59 cents, six minutes. The build: it worked, 92 tests green, but cost four dollars, most of it test-loop stamina.&lt;/li&gt;
&lt;li&gt;My split now: GLM for the reading, Claude for the building. Private code never leaves my machine, cheap or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This piece is from &lt;a href="https://codemeetai.substack.com/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=glm-5-2" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where I document how I actually use AI to ship real products, receipts included. New guides land there first.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My Claude Code bill had been bothering me for a while. Not scary numbers, just creeping ones. I run a lot of agents, sometimes a whole harness of them at once, and the number at the end of the month kept drifting up. So I went looking for a cheaper engine, and the thing everyone kept pointing at was a Chinese open-weight model called GLM 5.2.&lt;/p&gt;

&lt;p&gt;Two reasons I wanted to try it. One was pure cost. If a model a tenth of the price could do even half my work, that's real money back. The other was a curiosity I'd been avoiding, if I'm honest. The Chinese labs have been shipping fast, the benchmarks look absurd, and I had never actually run one of their models on my own code to see past the marketing.&lt;/p&gt;

&lt;p&gt;So I put five dollars on OpenRouter and decided to stop reading takes. I'd run GLM on the one codebase I know better than anyone, &lt;a href="https://getwireai.com/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=glm-5-2" rel="noopener noreferrer"&gt;my own generative UI SDK&lt;/a&gt;, and check every line of what it gave back.&lt;/p&gt;

&lt;p&gt;This is what I did, what it cost, and the part I got wrong before I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup, because it's shorter than you think
&lt;/h2&gt;

&lt;p&gt;GLM 5.2 is an open-weight model from Z.ai. It came out in the middle of June, it has a one million token context window, and the thing people keep saying about it is that it codes like a frontier model for a fraction of the price. The public numbers back the noise up: on OpenRouter's Design Arena board it sits in the top one percent for code, across more than three thousand head-to-head tournaments. I didn't want to take that on faith either. Benchmarks are somebody else's code.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnu425ldm8vdi4bciwc14.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnu425ldm8vdi4bciwc14.png" alt="OpenRouter Design Arena benchmarks for GLM 5.2: top 1% in code, across 3,243 tournaments." width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The public claim, as of this week: top one percent for code on Design Arena, 3,243 tournaments. This article is me checking it against my own repo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude Code doesn't care which model sits behind it. It speaks the Anthropic API format, and it reads two environment variables to decide where to send requests. Point those at a different endpoint and the whole tool keeps working, same agent, same file editing, same test running, different brain.&lt;/p&gt;

&lt;p&gt;I used OpenRouter as the endpoint. The reason is simple: one account, one API key, and it can route that key to dozens of model providers including Z.ai. I didn't want a separate billing relationship with a Chinese lab to run one experiment. OpenRouter sits in the middle, I top up a few dollars, and I can try any model behind one key.&lt;/p&gt;

&lt;p&gt;Here's the whole path, start to finish.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft541gycligg4mdcp41qb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft541gycligg4mdcp41qb.png" alt="How GLM gets into Claude Code through OpenRouter: Claude Code reads ANTHROPIC_BASE_URL, points at OpenRouter, which routes to a provider. Pin Z.ai first-party with fallbacks off." width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three steps to set it up.&lt;/p&gt;

&lt;p&gt;First, make the key. On OpenRouter you create an API key and put a few dollars of credit on the account. There's no free GLM 5.2 tier, but the credit goes a long way, my whole experiment ran on five dollars and I didn't finish 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmo67u8ka01rk1sfcieq6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmo67u8ka01rk1sfcieq6.png" alt="OpenRouter New Key dialog: name the key and set an optional hard credit limit." width="800" height="789"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Creating the key. The credit limit field is the safety net: mine got five dollars, hard cap.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flwiy0ad10gjsxx4rqmk3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flwiy0ad10gjsxx4rqmk3.png" alt="OpenRouter API Keys page showing the glm test key with $4.59 used of a $5 limit." width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same key after the experiment: $4.59 of the five dollar cap used. Everything in this article ran inside that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Second, point Claude Code at it. Five lines in your Claude Code settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ANTHROPIC_BASE_URL &lt;span class="o"&gt;=&lt;/span&gt; https://openrouter.ai/api
ANTHROPIC_AUTH_TOKEN &lt;span class="o"&gt;=&lt;/span&gt; your_openrouter_key
ANTHROPIC_DEFAULT_OPUS_MODEL &lt;span class="o"&gt;=&lt;/span&gt; z-ai/glm-5.2
ANTHROPIC_DEFAULT_SONNET_MODEL &lt;span class="o"&gt;=&lt;/span&gt; z-ai/glm-5.2
ANTHROPIC_DEFAULT_HAIKU_MODEL &lt;span class="o"&gt;=&lt;/span&gt; z-ai/glm-4.5-air
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop that in, start Claude Code, and you're talking to GLM. To go back to Claude you comment it out. That's the entire switch.&lt;/p&gt;

&lt;p&gt;Third, and this is the step most people skip, pin the provider. On OpenRouter the same model name can be served by a long list of different companies, and the prices are all over the place, from under a dollar per million tokens to over three. That spread is not a coincidence. Some of those hosts run quantized copies of the model, smaller and faster and measurably dumber, and the Providers tab even has a quantization filter because of it. If you let OpenRouter auto-route you might land on one of those, and then you're testing a compressed knockoff while thinking you're testing the real thing.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0c6ogrjnshbexnwj23z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0c6ogrjnshbexnwj23z.png" alt="The GLM 5.2 model page on OpenRouter, Providers tab: a dozen hosts serving the same model at different prices, latencies, and uptimes." width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Same model name, a dozen hosts, a real price spread. This is why you pin the provider.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I set the routing to Z.ai directly, the first-party host, and turned off fallbacks. Every request hit the real full-precision model and nothing else. If a fair comparison is the point, this toggle is the whole game.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I got wrong: my own code is not all mine to share
&lt;/h2&gt;

&lt;p&gt;Here's the mistake I almost made. I was about to point a third-party model at my whole monorepo.&lt;/p&gt;

&lt;p&gt;My SDK is open source. But sitting in the same repo are the things that are not open: the dynamic onboarding kit, the billing, the tenant logic, the work that's supposed to make money. Sending that to a hosted model in another country is exactly the kind of casual leak you only notice after it's gone.&lt;/p&gt;

&lt;p&gt;So before anything ran, I built a clean copy. I pulled out only the showable parts, the SDK package and the mental coach example with its agent backend, and I left the commercial code on my disk where it belongs. Then I did the boring but important step: I searched the copy for the words that would give the game away, onboarding, billing, tenant, stripe, and confirmed there were zero hits before a single token left my machine.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrlkw2th7whcnv6mflis.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrlkw2th7whcnv6mflis.png" alt="Before sending your repo to a third-party model: copy out only the showable parts, grep for leak words and confirm zero hits, then send only that." width="798" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That habit is the whole point. The model being cheap doesn't change the rule. Public code can go to a hosted API. Private code either stays local or it doesn't go at all. I wrote about &lt;a href="https://codemeetai.substack.com/p/how-i-run-claude-code-offline-the?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=glm-5-2" rel="noopener noreferrer"&gt;choosing a more expensive but EU-safe model for a client backend&lt;/a&gt; a while ago for the same reason, and the logic didn't change just because this one was fun to try.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task one: read my SDK and tell me where it breaks
&lt;/h2&gt;

&lt;p&gt;The first job was a pure reading test. I told GLM to audit the architecture as if I were about to build a new generation of tooling on top of it. Find the load-bearing seams. Name the files. Tell me what will crack first. And the rule that mattered most: cite a real file and line for every claim, and if you're not sure, say so instead of inventing something.&lt;/p&gt;

&lt;p&gt;It read forty-one files. Then it handed me an audit that found the three real problems I already knew were there.&lt;/p&gt;

&lt;p&gt;It found that my component types are sealed into the bundle when the app starts, which means an agent can't define a new component at runtime, which is the exact thing my next feature needs. It found that streaming is quietly dead on my main agent path, because the adapter that handles it never implemented the streaming method. And it found a drift bug I'd been ignoring, where my SDK can render thirteen components but the server only allows eleven of them and only tells the model about seven, so two perfectly good components were unreachable through the agent.&lt;/p&gt;

&lt;p&gt;I didn't take its word for any of this. I went through its citations and grepped each one against the code. They were real. The file paths were right, the line numbers were right, and it hadn't made up a single function. It even caught something I hadn't flagged: a comment in my backend that proudly says it uses the latest Claude models, sitting directly above code that actually calls a cheaper OpenAI model. A stale comment that became a small lie. Good eye, for a model I was ready to dismiss.&lt;/p&gt;

&lt;p&gt;That audit cost fifty-nine cents and took six minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task two: now fix one of them
&lt;/h2&gt;

&lt;p&gt;A read is one thing. Reading is where every model looks smart. So I said: ok, you can read my code. Now touch it.&lt;/p&gt;

&lt;p&gt;I gave it the hardest fix from its own audit: kill the component drift for good. Make the &lt;a href="https://github.com/chohra-med/wireai-rn" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; the single source of truth, generate a manifest from it, and have the server read that manifest instead of its own hand-typed list, so the two can never fall out of sync again. And write a test that fails if they ever do.&lt;/p&gt;

&lt;p&gt;It did it. It generated the manifest, rewired the server to read it, promoted the two orphaned components into real SDK built-ins so they were finally reachable, and wrote a drift guard test. When I ran the suite myself, ninety-two tests passed, the original eighty-seven untouched and five new ones added. Then I tried to break it on purpose. I deleted a component from the manifest by hand and re-ran the guard. It failed, loudly, exactly where it should. The safety net had teeth.&lt;/p&gt;

&lt;p&gt;It also hit a genuinely annoying toolchain trap along the way, a syntax issue in React Native that stops the test runner from loading certain files, and instead of hiding it or giving up it built a small workaround and then wrote the problem down in its report as a caveat. That honesty is worth more to me than a clean-looking result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch, because there is always a catch
&lt;/h2&gt;

&lt;p&gt;The build cost four dollars. The read cost fifty-nine cents.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2mo0xzxyhege3e1bgqr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2mo0xzxyhege3e1bgqr.png" alt="Bar chart: the same architecture audit cost $0.59 on GLM 5.2 versus roughly $5.90 at Claude list rates." width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The receipt behind the "ten times cheaper" line: same audit, same 41 files, priced twice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the number nobody in the hype videos mentions. On the reading task GLM was a clear win, ten times cheaper than what I usually run, and three times faster. On the build it succeeded, but it spent most of those four dollars not on the fix itself but on grinding through the test harness, run the tests, read the error, edit, run again, over and over, three hundred turns of it. The actual code changes were maybe thirty of those steps. The rest was stamina.&lt;/p&gt;

&lt;p&gt;So the lesson I'm keeping is not "GLM replaces my setup." It's narrower and more useful than that. For reading, reviewing, auditing, explaining a codebase, the kind of work where the model thinks hard once and hands you an answer, GLM 5.2 is a genuine bargain and I'll reach for it on purpose. For long unattended building, where the cost is paid in debugging loops, it works, but the price gap closes and the reasons I pay for a frontier model come back into focus.&lt;/p&gt;

&lt;p&gt;Five dollars, one afternoon, my own code, and a clear answer instead of a feed full of opinions. That's the cheapest research I've done all month.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I actually use this now
&lt;/h2&gt;

&lt;p&gt;Two routes, depending on the code.&lt;/p&gt;

&lt;p&gt;For anything public, I keep the OpenRouter config above in a commented block in my Claude Code settings. When I want a cheap second opinion on an open-source repo, an architecture read, a "what is wrong with this," I uncomment it, pin Z.ai, and let GLM do the heavy reading for cents. Claude stays my default for the building.&lt;/p&gt;

&lt;p&gt;For anything private, the model goes to the code, the code doesn't go to the model. Local weights or nothing.&lt;/p&gt;

&lt;p&gt;If you want the exact settings block, the provider-pinning step, and the little script I use to strip a repo down to the showable parts before sending it anywhere, reply LOCAL and I'll send it over.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This was one experiment in a longer thread I keep at &lt;a href="https://codemeetai.substack.com/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=glm-5-2" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, where I document how I actually use AI to ship real products, receipts included. It's the hosted-model sibling of my post on &lt;a href="https://codemeetai.substack.com/p/how-i-run-claude-code-offline-the?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=glm-5-2" rel="noopener noreferrer"&gt;running Claude Code offline with a local LLM&lt;/a&gt;. Next week: the full three-way comparison, GLM against the frontier models on the same tasks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you have run GLM 5.2 or another cheap model on real code, where did it hold up and where did it fall apart for you?&lt;/strong&gt; I'm still calibrating my own split, and the build-cost number surprised me most.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>The one habit that fixes generic AI answers (and 7 ways to ask)</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Mon, 06 Jul 2026 10:41:07 +0000</pubDate>
      <link>https://dev.to/malik_chohra/the-one-habit-that-fixes-generic-ai-answers-and-7-ways-to-ask-8bm</link>
      <guid>https://dev.to/malik_chohra/the-one-habit-that-fixes-generic-ai-answers-and-7-ways-to-ask-8bm</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't need to be technical to prompt well. You need to stop typing three words and hitting enter.&lt;/li&gt;
&lt;li&gt;The one habit that fixes almost everything is context: tell the AI who it should be, what you want, and what a good answer looks like.&lt;/li&gt;
&lt;li&gt;Seven simple ways of asking cover most of daily life, from summarizing an email to planning a week of meals.&lt;/li&gt;
&lt;li&gt;The best place to practice is your own life: your messages, your plans, your notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This piece is from &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap01" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where I document how I actually use AI to ship real things, receipts included. New guides land there first.&lt;/p&gt;

&lt;p&gt;Prompting is just how you ask an AI for something. The AI reads your words, not your mind, so a lazy question gets a lazy answer. The fix is context: tell it who you want it to be, what you actually need, and what a good result would look like. After that, a handful of simple patterns handle almost anything. No jargon. You get good by practising on the things you already do every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI reads your words, not your mind
&lt;/h2&gt;

&lt;p&gt;The first time a lot of people try one of these tools, they type something like "make me 1 million," read the bland thing that comes back, and quietly decide it is overrated. I did a version of this for months. I treated it like a smarter Google, typed three words, and was annoyed when i got three-word-quality answers back.&lt;/p&gt;

&lt;p&gt;Spoiler alert: the "make me 1 million" prompt doesn't work. Which i think you already know by now.&lt;/p&gt;

&lt;p&gt;What changed for me was not a better app. It was an afternoon in a park. Instead of firing one-line questions at it, i opened the AI on my phone and just talked to it for about three hours: what i was working on, what was stuck, what i had been avoiding. By the evening it could help me in a way it never could when i was firing one-liners at it.&lt;/p&gt;

&lt;p&gt;That is the whole game. When you leave a question vague, the model fills the empty space with something generic, because generic is the safest guess when it does not know what you actually meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a good prompt actually contains
&lt;/h2&gt;

&lt;p&gt;A good prompt is not longer; it is clearer. Four things usually do it, and you rarely need all four: who you want the AI to be, what you want, the bit of context it cannot see, and what a good answer looks like.&lt;/p&gt;

&lt;p&gt;Lazy: "give me dinner ideas." You get a generic list, half of which you would never make.&lt;/p&gt;

&lt;p&gt;Clear: "You're a practical home cook. Give me three vegetarian dinners for a tired weeknight. I have pasta, spinach, and eggs, i want each under twenty minutes, and just give me the three with a one-line reason, no essay." Same question, but now it knows the situation, the limits, and the shape you want back.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzpbepip5sh9jr90e28n.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzpbepip5sh9jr90e28n.png" alt="Anatomy of a good ask: lazy vs clear, broken into who, context, what, shape." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The same question, minus the guesswork.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven ways to prompt
&lt;/h2&gt;

&lt;p&gt;Friendly names first, the technical name in brackets for the curious.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Just ask it clearly (zero-shot).&lt;/strong&gt; "Summarize this email in three bullets and tell me whether i need to reply." Your default for anything simple.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show it an example (few-shot).&lt;/strong&gt; "Here's a thank-you note i wrote once that felt right [paste it]. Write one like it for my neighbour." It copies your taste instead of guessing at it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it think out loud (chain-of-thought).&lt;/strong&gt; "I'm choosing between two flats. Walk through commute, cost, and daylight step by step, then tell me which one and why." Forcing the thinking first beats a snap answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break the big thing into steps (decomposition).&lt;/strong&gt; Planning a five-day trip becomes: rough day-by-day, then one day in detail, then the packing list. Small steps you can check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask for the plan, then the work (reason then act).&lt;/strong&gt; "Tell me how you'd structure a monthly budget for an irregular income, then build it as a table i can fill in."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have it check its own answer (self-critique).&lt;/strong&gt; "Reread that message to my landlord and flag anything passive-aggressive, then give me a warmer version." The easiest quality check there is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep improving, and save what works (iterate).&lt;/strong&gt; Tell it exactly what was off, teach it your taste, and save the asks that work so you can reuse them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you only remember three: ask clearly for the simple stuff, make it think out loud for anything you are deciding, and have it check itself before you send anything that matters.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ns072hed0evq3ojryjk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ns072hed0evq3ojryjk.png" alt="The seven ways to prompt, at a glance, numbered 01 to 07." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The seven, one line each. This is the cheat sheet.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your own notes are the best place to practice
&lt;/h2&gt;

&lt;p&gt;You learn this on your own life, not from a course. I keep what people call a second brain, a plain folder of my own notes that the AI can read, and it is the best practice ground i have.&lt;/p&gt;

&lt;p&gt;Try the smallest version. Drop a week of messy notes into one place, then ask: "group these into themes, tell me what i keep circling back to, and what i seem to be avoiding." Giving it your real material instead of a blank question is patterns 1 through 7 at once. If you want the full setup, i wrote up &lt;a href="https://codemeetai.substack.com/p/how-to-build-a-second-brain-with?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap01" rel="noopener noreferrer"&gt;how i built mine with Obsidian&lt;/a&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxstojapgw4lj8om4746i.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxstojapgw4lj8om4746i.png" alt="The practice loop: ask, read, steer, save, then repeat." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ask, read what came back, steer, save what works. Then again.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a better question stops helping
&lt;/h2&gt;

&lt;p&gt;Asking well fixes one conversation. It does nothing about the fact that the AI forgets you the moment you close the chat. That is where the work moves from the question to what is around it: giving the AI a memory it can read, which is exactly what a second brain is for. That is the next part of this series.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get good: practise on your own life
&lt;/h2&gt;

&lt;p&gt;Try, look at what came back, adjust, go again. When an answer is bad, read it instead of deleting it, because it is telling you which of the four things you left out. And when a way of asking works, hand it back to the AI: "write me a cleaner version of this prompt i can reuse." Using the AI to improve how you talk to the AI is the fastest way i know to get good.&lt;/p&gt;

&lt;p&gt;The seven live on a one-page cheat sheet, plain language, ready to copy. &lt;a href="https://choumed.gumroad.com/l/seven-ways-to-ask-ai?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap01" rel="noopener noreferrer"&gt;Grab it free here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Malik. I build with AI every day and write about using it well, minus the hype. This is part 01 of Using AI, properly. Next: giving the AI a memory. New parts land first at &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=uap01" rel="noopener noreferrer"&gt;codemeetai.substack.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>writing</category>
    </item>
    <item>
      <title>Your AI agent checks its own work. That's not a loop, that's a confident intern with a cron job.</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Sun, 05 Jul 2026 16:24:29 +0000</pubDate>
      <link>https://dev.to/malik_chohra/your-ai-agent-checks-its-own-work-thats-not-a-loop-thats-a-confident-intern-with-a-cron-job-4hoo</link>
      <guid>https://dev.to/malik_chohra/your-ai-agent-checks-its-own-work-thats-not-a-loop-thats-a-confident-intern-with-a-cron-job-4hoo</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; a loop is memory + rules + verify + schedule. Most agent setups have three of the four. The one they skip is a separate verifier, and skipping it means the agent that does the work also grades the work. That is the difference between self-correcting and self-confirming.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This piece is from &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, my newsletter where I document how I actually use AI to ship real products, receipts included. New guides land there first.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I run background AI agents on a schedule. For months I was quietly proud of the setup, until I lined it up against what a real loop actually requires and found I had skipped the one part that makes it trustworthy. If you have any agent running unattended, this is the question I had to ask myself, and you should too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ladder, fast
&lt;/h2&gt;

&lt;p&gt;Prompt engineering tuned the words. Context engineering got the right things into the window. Harness engineering is the scaffolding around the model: tools, rules, sandboxes (&lt;a href="https://codemeetai.substack.com/p/harness-engineering-101prompt-engineering?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;I mapped the harness floor here&lt;/a&gt;). Loop engineering is the floor above, the harness running on a timer, spawning helpers, feeding itself. Each layer wrapped the last. Nobody got replaced, the edge just climbed a floor.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvty50p3i0rnq9hjkytfe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvty50p3i0rnq9hjkytfe.png" alt="The ladder: prompt, context, harness, loop" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A loop has four parts
&lt;/h2&gt;

&lt;p&gt;Memory it reads before acting and writes after. Rules it cannot break. A verifier that confirms the output before it counts. A schedule that triggers the cycle. Memory, rules, verify, schedule.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0eby67ywqxgzqg1urh1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0eby67ywqxgzqg1urh1.png" alt="The four parts of a loop, with verify highlighted" width="800" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I told on myself
&lt;/h2&gt;

&lt;p&gt;Three indexing layers per project, a curated memory bank, a structural index of what imports what, a temporal recall layer (&lt;a href="https://codemeetai.substack.com/p/how-to-build-a-second-brain-with?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;the full second-brain setup is here&lt;/a&gt;). Background agents on a schedule on top.&lt;/p&gt;

&lt;p&gt;Count it against the four parts. Memory, yes. Rules, yes. Schedule, yes. That is three. The fourth is verify, and I did not have it.&lt;/p&gt;

&lt;p&gt;I never built a separate checker. The loop produced work and then trusted its own work. No second model, no sub-agent whose only job is to read the output and return true or false. &lt;strong&gt;The agent that does the work also decides the work is fine.&lt;/strong&gt; In any human process you would flag that conflict of interest immediately. In an automated one it is somehow the default.&lt;/p&gt;

&lt;p&gt;That is the whole point. Memory plus rules plus schedule gives you an agent that runs a lot. It does not give you an agent you can trust to run unattended. Verification is the difference between self-correcting and self-confirming.&lt;/p&gt;

&lt;h2&gt;
  
  
  What verification actually means
&lt;/h2&gt;

&lt;p&gt;Not the agent re-reading its own output and saying "looks good." A &lt;em&gt;separate&lt;/em&gt; checker: a sub-agent or a second model, given the acceptance criteria of the goal, whose only output is true or false against a defined end-state. It does not see the reasoning that produced the work, it sees the work and the spec. That independence is the entire value. If you build one thing this week, build this, because it is what makes the rest safe to leave alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The governance angle most people miss
&lt;/h2&gt;

&lt;p&gt;The loop does not know what you are using it for. Two teams build the identical loop and get opposite results. One uses it to move faster on work they understand deeply. The other uses it to avoid understanding the work at all. Same files, same cron line, same checker, opposite outcomes. The responsibility moved up a floor alongside the capability.&lt;/p&gt;

&lt;p&gt;So, the one question: &lt;strong&gt;who checks the output?&lt;/strong&gt; If the answer is "the same agent that wrote it," you do not have a loop. You have a head start.&lt;/p&gt;

&lt;p&gt;I packaged the skeleton I am using to close my own gap, the memory bank, the rules file, a goal with a verifiable end-state, the checker sub-agent, the schedule, and guardrails so it cannot run off a cliff. It is free, name your price: &lt;a href="https://choumed.gumroad.com/l/loop-engineering-starter-kit?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;the Loop Engineering Starter Kit&lt;/a&gt;. The deeper write-up, with the diagrams, is on &lt;a href="https://codemeetai.substack.com/p/loop-engineering-what-happened-when?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I lean on these loops daily building &lt;a href="https://getwireai.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;Wire AI&lt;/a&gt;, my generative onboarding SDK for React Native, where unverified agent output would land in front of real users.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write &lt;a href="https://codemeetai.substack.com?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=loop" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;: real AI workflows, real numbers, from someone shipping with it every day.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How are you handling verification in your own agent setups? I am still wiring mine in and would take notes from anyone further along.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>How I built a Claude Code skill for on-brand UI</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Tue, 30 Jun 2026 09:01:21 +0000</pubDate>
      <link>https://dev.to/malik_chohra/how-i-built-a-claude-code-skill-for-on-brand-ui-4lgi</link>
      <guid>https://dev.to/malik_chohra/how-i-built-a-claude-code-skill-for-on-brand-ui-4lgi</guid>
      <description>&lt;p&gt;I have shipped mobile apps for nine years, and UI is still my weakest skill. I can architect a backend-for-frontend or wire up NFC health cards without sweating it. Ask me to make an onboarding screen feel premium and I stall out. For a long time I treated that as a fixed fact about myself and shipped slightly-off-looking apps because of it.&lt;/p&gt;

&lt;p&gt;I know app UX. I have shipped enough flows to feel where they break. The part I lack is the eye for detail: color matching, branding, fonts, spacing. That has never come naturally to me.&lt;/p&gt;

&lt;p&gt;If your AI-generated screens look generic, the fix is not a better model and it is not hiring a designer. Claude already knows what good design looks like. It does not know what your app looks like. Give it two things before it generates anything: a design tokens file (your colors, spacing, and type as named values) and a short rules block describing how your app uses them. With those in the prompt, the output lands on-brand and ships. Without them, you get a template you have to rebuild by hand.&lt;/p&gt;

&lt;p&gt;Tokens and rules are not a magic button. You still have to describe the app: who uses it, how it should feel, an app or two you want to borrow the direction from. The model needs that steer. What the tokens and rules do is stop it from guessing on the part you cannot put into words anyway.&lt;/p&gt;

&lt;p&gt;Then I stopped pretending the gap would close on its own. I treat it now the way I treat every skills gap: I use AI as a multiplier. The part that took me a while to learn was not prompting. It was what to hand the model so it covers the exact thing I am bad at, instead of guessing and handing me homework. Here is that setup, with the real before and after from my own React Native boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does Claude's design skill produce generic screens?
&lt;/h2&gt;

&lt;p&gt;Claude Code ships with a design skill. Out of the box it writes components that look fine alone and wrong next to each other. Generic spacing. A violet-and-white card look it falls back on. Hardcoded colors that ignore the palette you already picked.&lt;/p&gt;

&lt;p&gt;Nobody told the model your colors, your spacing, your fonts, or your rules, so it reaches for a 2021 template. The whole job is closing that gap. Same content, same app above. The right side is what happens when the model stops guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are design tokens, and why do they fix most of it?
&lt;/h2&gt;

&lt;p&gt;A design token is a named value. Instead of &lt;code&gt;#7C3AED&lt;/code&gt; scattered across forty files, you have &lt;code&gt;accent.primary&lt;/code&gt;. Instead of random padding, a spacing scale: 4, 8, 12, 16, 24. Instead of five fonts, one type ramp. You define them once, then paste them into every prompt so the model builds with your system instead of inventing a new one each 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdnulgs0d176hn0cw3wjy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdnulgs0d176hn0cw3wjy.png" alt="The design token set — named colors, spacing scale, and type ramp " width="800" height="1736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I skipped this for too long because it felt like overhead. The token file is the asset that keeps the next fifty screens consistent without me thinking about it. Everything downstream reads from it, mobile or web.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes wrong when you run the default skill on a real app?
&lt;/h2&gt;

&lt;p&gt;You install the skill, run it on your home screen, it looks decent, you ship it. Two weeks later you have nineteen one-off components that share no styles, and your design system has quietly forked into a mess. I have done this. It is how I learned the rest.&lt;/p&gt;

&lt;p&gt;The fix is not a better tool. It is giving the model four things before it generates anything:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your tokens, inlined into the prompt.&lt;/li&gt;
&lt;li&gt;A real component from your app, so it matches your conventions.&lt;/li&gt;
&lt;li&gt;The mistakes to avoid: no inline styles, no hardcoded colors, no generic look.&lt;/li&gt;
&lt;li&gt;Where the file goes, so you are not pasting output around by hand.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Give it those four and the output ships. Skip them and you get orphan components.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a non-designer actually get from this?
&lt;/h2&gt;

&lt;p&gt;The one design skill you do not have, applied on every screen for free. Every new screen matches the last because the model builds from the same tokens. The first screen takes setup, the fiftieth takes a sentence. And the product reads as funded instead of hacked together by someone who is good at code and shaky at design.&lt;/p&gt;

&lt;p&gt;That last part is not vanity. Researchers at Carleton University found people form a visual judgment of an interface in roughly 50 milliseconds, and that snap judgment colors how much they trust everything after it (Lindgaard et al., 2006, &lt;em&gt;Behaviour &amp;amp; Information Technology&lt;/em&gt;). A first-time user decides whether your app looks legit before they read a word. A coherent system buys that trust, even when a designer never touched the file.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqezll30ua1s65iezjxc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqezll30ua1s65iezjxc.png" alt="Before and after, settings screen " width="800" height="828"&gt;&lt;/a&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfibpsb49hfsg8ojiip5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfibpsb49hfsg8ojiip5.png" alt="Before and after, home screen" width="800" height="828"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you start this week?
&lt;/h2&gt;

&lt;p&gt;You do not need to redesign everything. Do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull your colors, spacing, and fonts into one short list. That is your token set.&lt;/li&gt;
&lt;li&gt;Pick your worst screen.&lt;/li&gt;
&lt;li&gt;Paste the tokens plus "here is the screen, refactor it to use only these, no inline styles" into Claude.&lt;/li&gt;
&lt;li&gt;Compare. Then do the next screen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is Claude Design 101. The system is the asset. The model is the labor. I have been running this exact setup for months. The onboarding in Morrow Self, my wellness app, came out of the agent already looking like the product instead of looking like AI. My two boilerplates ship with the same wiring: AI Mobile Launcher for React Native, and AI Web Launcher for Next.js. Different tokens, same workflow, whether it is a mobile app or a web app, same engineer who still cannot design a screen from scratch.&lt;/p&gt;

&lt;p&gt;Want the exact prompts? I packaged the two I ship with, the design-system refactor prompt and the token-block template, plus the open-source skill that runs the whole flow:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chohra-med" rel="noopener noreferrer"&gt;
        chohra-med
      &lt;/a&gt; / &lt;a href="https://github.com/chohra-med/claude_design_skill" rel="noopener noreferrer"&gt;
        claude_design_skill
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Claude Code skill that front-loads design tokens and rules so AI can only produce on-brand UI, then verifies the output.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;claude-design-idea-to-ready&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;From a one-line idea to on-brand, shippable design, in the right order.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A Claude Code skill that front-loads the constraints (design tokens + a &lt;code&gt;CLAUDE.md&lt;/code&gt; design-rules block) so the model can only produce on-brand UI, then runs generation last and verifies it against the rules.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/chohra-med/claude_design_skill/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/720cbc7e743e640f4751b21bcfaf0f6dc156504be19a2d0142f40e435414da24/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63686f6872612d6d65642f636c617564655f64657369676e5f736b696c6c2e737667" alt="license"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chohra-med/claude_design_skill" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a532f451e812a2ed926c277d3cc7d8cc1afda4b96caed937d0b77e5a17c40e1e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f63686f6872612d6d65642f636c617564655f64657369676e5f736b696c6c2e7376673f7374796c653d736f6369616c" alt="stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Created by &lt;a href="https://getwireai.com?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=creator" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Malik Chohra&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://codemeetai.substack.com?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=newsletter" rel="nofollow noopener noreferrer"&gt;Code Meet AI newsletter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sponsored by &lt;a href="https://aiweblauncher.com?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=sponsor" rel="nofollow noopener noreferrer"&gt;AI Web Launcher&lt;/a&gt; and &lt;a href="https://aimobilelauncher.com?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=sponsor" rel="nofollow noopener noreferrer"&gt;AI Mobile Launcher&lt;/a&gt; and &lt;a href="https://casainnov.com?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=sponsor" rel="nofollow noopener noreferrer"&gt;CasaInnov&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/chohra-med/claude_design_skill/assets/on-brand-output.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fchohra-med%2Fclaude_design_skill%2FHEAD%2Fassets%2Fon-brand-output.png" alt="Five screens from one app, all generated through this pipeline — one brand, because none of them were allowed to leave the tokens."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most AI-generated UI looks the same because it is handed zero constraints. This skill front-loads the constraints (design tokens + a &lt;code&gt;CLAUDE.md&lt;/code&gt; design-rules block) so the model can only produce on-brand output, then runs the generation last and verifies it against the rules.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Before / after&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Same screen, same prompt. The difference is the foundation the model was given before it generated.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generic (no constraints)&lt;/th&gt;
&lt;th&gt;On-brand (this pipeline)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/chohra-med/claude_design_skill/assets/before.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fchohra-med%2Fclaude_design_skill%2FHEAD%2Fassets%2Fbefore.png" alt="Before: generic violet card stack"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/chohra-med/claude_design_skill/assets/after.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fchohra-med%2Fclaude_design_skill%2FHEAD%2Fassets%2Fafter.png" alt="After: refactored against the tokens"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;It works because the brand lives in two files the model reads first:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/chohra-med/claude_design_skill/assets/tokens.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fchohra-med%2Fclaude_design_skill%2FHEAD%2Fassets%2Ftokens.png" alt="The design tokens as a real screen: palette + type scale, the single source of truth"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The pipeline&lt;/h2&gt;
&lt;/div&gt;
&lt;ol start="0"&gt;
&lt;li&gt;Idea…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chohra-med/claude_design_skill" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you would rather start from a boilerplate that already has the tokens, components, and design system wired in, that is AI Mobile Launcher Standard for React Native, or AI Web Launcher for the web.&lt;/p&gt;

&lt;p&gt;I write Code Meet AI weekly on this kind of AI-first building. I broke down the tool side of this in Stitch vs Claude Design, and the wider idea, own the structure and swap the model, in the harness engineering piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need to be a designer to use this?
&lt;/h3&gt;

&lt;p&gt;No, and the whole point is that you are not. The tokens and the rules hold the design decisions, so you make a few calls once (colors, spacing, type) and the model applies them after that. I am the proof. I still cannot design a screen on a blank canvas.&lt;/p&gt;

&lt;h3&gt;
  
  
  What exactly is a design token?
&lt;/h3&gt;

&lt;p&gt;A named value that stands in for a raw one. &lt;code&gt;accent.primary&lt;/code&gt; instead of a hex code, &lt;code&gt;space.4&lt;/code&gt; instead of a number. It gives the model and your codebase one source of truth instead of forty scattered copies that drift apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does Claude produce generic-looking UI by default?
&lt;/h3&gt;

&lt;p&gt;Because it has no information about your app. It knows good design in general, not your palette or conventions, so with no context it reaches for a safe template. Feed it your tokens and a short rules block and that stops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this work outside React Native?
&lt;/h3&gt;

&lt;p&gt;Yes. The tokens-plus-rules approach does not care about the framework. I run the same setup on the web with AI Web Launcher, my Next.js boilerplate, and the before and after looks the same. The examples here are React Native because that is most of what I ship.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the design skill enough on its own?
&lt;/h3&gt;

&lt;p&gt;Not on a real app. Run it blind and you get one-off components. The four inputs above are what turn it from a demo into something you can actually ship.&lt;/p&gt;

&lt;p&gt;Open your worst screen. Pull its colors into one file. Paste it in with "use only these." That is the entire on-ramp, and it is the same one I used to stop shipping apps that looked like I built them alone.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>reactnative</category>
      <category>webdev</category>
    </item>
    <item>
      <title>RN UI from Stitch vs Claude Design: which one ships a committable diff</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Fri, 26 Jun 2026 15:24:48 +0000</pubDate>
      <link>https://dev.to/malik_chohra/rn-ui-from-stitch-vs-claude-design-which-one-ships-a-committable-diff-39ib</link>
      <guid>https://dev.to/malik_chohra/rn-ui-from-stitch-vs-claude-design-which-one-ships-a-committable-diff-39ib</guid>
      <description>&lt;p&gt;I had the same prompt open in two tabs this week.&lt;/p&gt;

&lt;p&gt;On the left, &lt;a href="https://stitch.withgoogle.com" rel="noopener noreferrer"&gt;Google Stitch&lt;/a&gt;. On the right, &lt;a href="https://www.anthropic.com/news/claude-design-anthropic-labs" rel="noopener noreferrer"&gt;Claude Design&lt;/a&gt;. Same onboarding flow, same brand colors, same instruction: make these four screens look like they belong in the app, not like a Tailwind starter someone forgot to theme.&lt;/p&gt;

&lt;p&gt;I was going to write you the clean version of this. Stitch vs Claude Design, here is the table, here is the winner, pick one and move on. I ran the test, I had the verdict, the draft was basically written.&lt;/p&gt;

&lt;p&gt;Then Anthropic shipped a &lt;code&gt;/design&lt;/code&gt; command inside &lt;a href="https://code.claude.com" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; and quietly deleted the question I was answering.&lt;/p&gt;

&lt;p&gt;I will get to that. But the comparison still matters, because the thing that decides the winner is the same thing that decides whether the new &lt;code&gt;/design&lt;/code&gt; command is any good. So let me show you the test first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same prompt, two tools
&lt;/h2&gt;

&lt;p&gt;The job was a real one. Four onboarding screens in my &lt;a href="https://aimobilelauncher.com" rel="noopener noreferrer"&gt;AI Mobile Launcher&lt;/a&gt; Standard app, currently a generic violet stack of cards, and I wanted them to match the rest of the product. I gave both tools the same brief and timed each from first prompt to "I would actually commit this."&lt;/p&gt;

&lt;p&gt;Stitch is a UI generator. You describe a screen, it gives you a layout. And it is good at that. Inside a few minutes I had four mockups that looked tighter than what I would have drawn from a blank file. The hierarchy was right. The accent was used sparingly enough to read as intentional. If I needed something to drop in a deck or send to a designer, I was already done.&lt;/p&gt;

&lt;p&gt;Then I tried to use it. The React Native export came back as four standalone files with hardcoded hex values, inline styles, and import paths that pointed at a design system I do not have. None of it knew about my tokens, my &lt;code&gt;Screen&lt;/code&gt; wrapper, or where anything lived in my project. So I spent the longer half of the work hand-replacing color values with token references and rewiring imports. The whole Stitch run, cleanup included, came to about three and a half hours. The mockup was a gift. The code was homework.&lt;/p&gt;

&lt;p&gt;Claude Design, pointed at the same four screens, was slower to feel impressive and faster to actually finish. No mockup to admire. It read my existing screens, copied the visual direction already in the app, and wrote the refactor back into the original files, using my tokens, my wrapper, my prop types. About 45 minutes, most of it Claude reading and writing, and a few minutes of me reviewing the diff and changing one copy string.&lt;/p&gt;

&lt;p&gt;Here is the same screen after that run. Same question, same options, but it reads as the product now instead of a starter template.&lt;/p&gt;

&lt;p&gt;The honest verdict, before the news broke: &lt;strong&gt;Stitch to explore, Claude to ship.&lt;/strong&gt; Stitch wins when you have no design system yet and want a strong opinion on what a screen could look like. Claude Design wins when you have a real codebase and need the output to land in the right files without a cleanup pass. They are not competitors. They sit at different stages of the same workflow, and people kept treating them as substitutes.&lt;/p&gt;

&lt;p&gt;That was the article. Clean enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then they deleted the question
&lt;/h2&gt;

&lt;p&gt;This week, a &lt;code&gt;/design&lt;/code&gt; command landed inside the Claude Code terminal. You create, edit, and sync design straight from where you already write code: design system imports, code round-trips, no screenshot, no rebuild. The &lt;a href="https://venturebeat.com/technology/anthropic-ships-major-claude-design-overhaul-with-design-system-imports-code-round-trips-and-a-fix-for-its-token-burning-problem" rel="noopener noreferrer"&gt;same overhaul&lt;/a&gt; moved Claude Design from a flashy demo toward something closer to a design-system compliance layer, and it fixed the token burn that made the old version expensive to run.&lt;/p&gt;

&lt;p&gt;Read that back. The thing that made Stitch lose my test was that it could not see my codebase. The thing that made Claude Design win was that it could. And now the design step has moved inside the terminal that already has the whole codebase loaded.&lt;/p&gt;

&lt;p&gt;The seam between design and code did not get a better bridge. It disappeared. The tool-versus-tool fight I was refereeing became a sub-plot in a bigger story: the harness is eating the stack. First it absorbed the planning step, then the review step, and this week it reached over and took the design handoff too.&lt;/p&gt;

&lt;p&gt;One honest caveat, because I would want one from you. &lt;code&gt;/design&lt;/code&gt; shipped basically yesterday. Nobody has months on it. I am not going to tell you it is battle-tested, because it is not, and the first person who tells you a day-old command changed their life is selling something.&lt;/p&gt;

&lt;p&gt;So here is the part that is proven, and the part that actually matters whether you use Stitch, Claude Design, or the new &lt;code&gt;/design&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup that decides all three
&lt;/h2&gt;

&lt;p&gt;None of these tools output on-brand code because of the model. They do it because of the boring scaffolding underneath, and that scaffolding is the same in all three cases.&lt;/p&gt;

&lt;p&gt;Two pieces carry almost all the weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design tokens as one source of truth.&lt;/strong&gt; A single file that holds your color, type, spacing, and radius, with names instead of hex values. &lt;code&gt;color.bg&lt;/code&gt;, &lt;code&gt;color.accent&lt;/code&gt;, &lt;code&gt;space.4&lt;/code&gt;. Every tool I named can read a tokens file. None of them can guess your palette. The difference between "pretty picture I have to rebuild" and "diff I can commit" is almost entirely whether the tool was pointed at this file before it generated anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A &lt;code&gt;CLAUDE.md&lt;/code&gt; design-rules block.&lt;/strong&gt; A short section that tells the agent the things your tokens cannot. Which wrapper component every screen uses. That the accent color is for one call to action per screen, never decoration. That nothing animates faster than 240ms. That danger red never shows up on a celebration. The rules a designer on your team would learn in week one and an agent will violate forever unless you write them down.&lt;/p&gt;

&lt;p&gt;Give a tool those two things and it stops generating artifacts and starts producing changes that fit. Withhold them and even the smartest model hands you a cleanup pass. That was true for Stitch, it was true for Claude Design, and it is the exact thing that will decide whether &lt;code&gt;/design&lt;/code&gt; is useful in your repo or just another demo.&lt;/p&gt;

&lt;p&gt;This is the same lesson as the &lt;a href="https://codemeetai.substack.com/p/harness-engineering-101prompt-engineering" rel="noopener noreferrer"&gt;harness piece I wrote a couple of weeks ago&lt;/a&gt;. The model is the swappable half. The structure around it is the half you own, and the half that does the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The receipt
&lt;/h2&gt;

&lt;p&gt;I am not theorizing. The onboarding in &lt;a href="https://aimobilelauncher.com" rel="noopener noreferrer"&gt;Morrow Self&lt;/a&gt;, my own app, runs on this setup. Same approach, different tokens, a warm rust palette instead of the dark one from the test, and the screens came out of the agent already looking like the product instead of looking like AI.&lt;/p&gt;

&lt;p&gt;Same workflow, different tokens. That is the whole trick. When the design rules live in the repo, the tool you point at them almost stops mattering. Which, conveniently, is why I am not panicking that &lt;code&gt;/design&lt;/code&gt; just absorbed the comparison I spent a week on.&lt;/p&gt;

&lt;h2&gt;
  
  
  So which one do you use
&lt;/h2&gt;

&lt;p&gt;If you have no codebase yet, start with Stitch. Get a strong visual opinion on the page, commit to tokens and components, and the day you create that tokens file is the day you switch.&lt;/p&gt;

&lt;p&gt;If you have a real codebase, the design step now lives in Claude Code. Build the two pieces above first, then let &lt;code&gt;/design&lt;/code&gt; or the design skill work against them. Watch it for a few weeks before you trust it with anything you cannot review, because it is new, but build the scaffolding now, because the scaffolding is not new and it is what pays off.&lt;/p&gt;

&lt;p&gt;The tool you pick matters less every month. The setup you point it at matters more.&lt;/p&gt;

&lt;p&gt;I wrote up the exact tokens file and the &lt;code&gt;CLAUDE.md&lt;/code&gt; design-rules block I actually ship as a one-pager you can paste into your own repo today. It goes out free to newsletter readers at &lt;a href="https://codemeetai.substack.com" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Stitch better than Claude Design?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Neither, in the abstract. Stitch is better at proposing a look when you have no system. Claude Design is better at landing code when you do. Now that &lt;code&gt;/design&lt;/code&gt; lives in the terminal, the second job moved even closer to the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the &lt;code&gt;/design&lt;/code&gt; command?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A command inside Claude Code that lets you create, edit, and sync design work without leaving the terminal: design system imports, code round-trips, no screenshot handoff. It shipped in Anthropic's June 2026 Claude Design overhaul. New, so review its output before trusting it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need Stitch at all anymore?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, if you are early and want visual ideation before you have committed to a system. Once you have tokens, the center of gravity moves to whatever runs against them in your repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually makes the output on-brand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A tokens file plus a short &lt;code&gt;CLAUDE.md&lt;/code&gt; design-rules block. That is the part that is proven, and it works the same across every tool here.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>design</category>
    </item>
    <item>
      <title>Building a generative-UI SDK for React Native: registry, Zod, Hermes-safe streaming</title>
      <dc:creator>Malik Chohra</dc:creator>
      <pubDate>Mon, 22 Jun 2026 19:25:49 +0000</pubDate>
      <link>https://dev.to/malik_chohra/building-a-generative-ui-sdk-for-react-native-registry-zod-hermes-safe-streaming-47nm</link>
      <guid>https://dev.to/malik_chohra/building-a-generative-ui-sdk-for-react-native-registry-zod-hermes-safe-streaming-47nm</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generative UI lets an AI model assemble the interface at runtime instead of hard-coding every screen.&lt;/li&gt;
&lt;li&gt;The web already ships it (Vercel AI SDK, Tambo, Google's A2UI). Mobile has almost nothing native.&lt;/li&gt;
&lt;li&gt;React Native blocks it three ways: broken streaming, costly nested trees, no native agent renderers.&lt;/li&gt;
&lt;li&gt;So I'm building Wire RN, an open-source generative UI SDK for iOS and Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short version up front: the web already has good tools for generative UI, mobile has almost none, and I got tired of waiting. So I'm building one. The longer version is the more interesting part, and it starts with how interfaces have always changed.&lt;/p&gt;

&lt;p&gt;Every era of the interface moved in the same direction. You just have to squint to see it.&lt;/p&gt;

&lt;p&gt;Command lines made you learn the machine. Exact syntax, no forgiveness. The graphical UI flipped some of that: windows, a mouse, things you could see instead of memorize. Touch went further, the screen became the thing you manipulated directly. Then chat arrived and you could just type what you wanted in plain language. Each step moved a little more of the burden off the user and onto the software.&lt;/p&gt;

&lt;p&gt;Generative UI is the next step on that same line. And it's the biggest one yet.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vjwbljsdumvh8lhgie1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vjwbljsdumvh8lhgie1.png" alt="infographic — the evolution of the interface (command line to graphical UI to touch to conversational to generative" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm a React Native engineer, nine years in. I've spent the last six months building with this pattern daily. I want to show you the SDK I'm building and why. A sneak peek.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoybdjz94nhmb2kqhc4y.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoybdjz94nhmb2kqhc4y.gif" alt="GIF — onboarding screen changing component type turn to turn, rendered live by the model" width="360" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A flow in my own app, built on the pattern this whole piece is about. The screen changes shape between turns because the model is choosing what to render next.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What generative UI actually is
&lt;/h2&gt;

&lt;p&gt;Generative UI is when a model decides the interface at runtime, instead of a developer hard-coding every screen in advance. The model reads context (your last answer, your history, the task) and emits structured data that says "render this component, with these props." Your app maps that to a real component. The user never sees the structured data. They see a screen that happens to be different from the one their neighbor got.&lt;/p&gt;

&lt;p&gt;The distinction that matters: this is not a chatbot. A chatbot returns text and you read it. Generative UI returns interface. Things you tap and type into. The model is behind the screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/generative-ui" rel="noopener noreferrer"&gt;Google now defines it&lt;/a&gt; in almost exactly these terms: a front-end architecture where the interface is built by AI in real time rather than hard-coded by developers. They frame the old way as the "wall of text" problem. Models could reason and plan, then collapsed it all into a paragraph of markdown, which is what generative UI fixes. Let the natural output of a capable model be an actual interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why big tech suddenly cares
&lt;/h2&gt;

&lt;p&gt;Because the data backs it up. &lt;a href="https://research.google/blog/generative-ui-a-rich-custom-visual-interactive-user-experience-for-any-prompt/" rel="noopener noreferrer"&gt;Google's own evaluations&lt;/a&gt; show people strongly prefer generated interactive experiences over plain text answers. And Google is openly calling this work the first step toward fully AI-generated user experiences, where interfaces get tailored to the user instead of pulled from a fixed catalog of apps.&lt;/p&gt;

&lt;p&gt;Read that last part again. The endgame they're describing isn't "nicer chat answers." It's interfaces assembling themselves per user, per moment, personalized by user need, the fixed app catalog dissolving into something generated on demand. When the company that owns Android and Chrome writes that down as a direction, mobile teams should pay attention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tambo.co/blog/posts/what-is-generative-ui" rel="noopener noreferrer"&gt;Tambo&lt;/a&gt;, one of the web libraries leading here, puts the same idea in plainer language: we used to adapt to software, now software adapts to us.&lt;/p&gt;

&lt;h2&gt;
  
  
  What web companies already ship
&lt;/h2&gt;

&lt;p&gt;This is the uncomfortable part for mobile people. On the web, generative UI is past theory. It's npm-installable. The players worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ai-sdk.dev/docs/ai-sdk-ui/generative-user-interfaces" rel="noopener noreferrer"&gt;Vercel's AI SDK&lt;/a&gt;&lt;/strong&gt; wires a model's tool calls straight to React components. The model calls a tool, the tool returns data, and that result connects to a component instead of a string of text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tambo.co" rel="noopener noreferrer"&gt;Tambo&lt;/a&gt;&lt;/strong&gt; is the clearest template for the pattern. You register your React components with Zod schemas, and the agent picks which one to render from natural language. Zod validates the props at runtime, so a malformed output gets caught before it ever reaches render. No "undefined is not a function" in production. The catch: it's React-only, and "other frameworks" includes the one your phone runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.copilotkit.ai/generative-ui" rel="noopener noreferrer"&gt;CopilotKit's AG-UI&lt;/a&gt;&lt;/strong&gt; pushes toward a declarative middle ground, where agents emit a structured spec of cards, lists, forms, and widgets rather than free-form code, so one spec can render across React, mobile, and desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developers.googleblog.com/introducing-a2ui-an-open-project-for-agent-driven-interfaces/" rel="noopener noreferrer"&gt;Google's A2UI&lt;/a&gt;&lt;/strong&gt; (&lt;a href="https://a2ui.org/" rel="noopener noreferrer"&gt;a2ui.org&lt;/a&gt;) is the open protocol version of that idea: agents send declarative component descriptions, the client renders them with its own native widgets. The reference renderers shipped so far are Angular, Flutter, Lit, and web components. React Native is not on the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The registry-plus-schema pattern is the through-line in all of them, and it's the thing that makes this safe to ship. The model isn't writing UI code at runtime. It's filling out forms your components already defined. Creative freedom over the flow, zero freedom over what a component is.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsuieepri7y9eguwg10yk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsuieepri7y9eguwg10yk.png" alt="infographic — how generative UI stays safe (user context to model to schema gate to native render, with a fallback branch" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gemini moment
&lt;/h2&gt;

&lt;p&gt;Then there's the example everyone's actually seen now.&lt;/p&gt;

&lt;p&gt;Gemini &lt;a href="https://research.google/blog/generative-ui-a-rich-custom-visual-interactive-user-experience-for-any-prompt/" rel="noopener noreferrer"&gt;shipped generative UI&lt;/a&gt; into its own app as two experiments. Dynamic View uses agentic coding to design and code a fully custom interactive response per prompt. Visual Layout generates magazine-style multimodal responses with photos and interactive modules. Ask it to plan a three-day trip to Rome and you get a visual itinerary you can actually explore and adjust across multiple turns. Not a wall of text. A built thing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gemini generating an interface, not an answer. The image and the interactive steps get built into the chat itself. This is the version most people will meet first, and it's worth knowing exactly how it works.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's the part that matters for us. Even Gemini's mobile experience is the model writing HTML, CSS, and JavaScript and rendering it in an app shell. It generates web code in real time and shows it inside the app. Impressive. But it's generated web, displayed in an app. It is not native components, your design system, or your offline behavior. Which is exactly where mobile's real problem lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why is mobile still behind?
&lt;/h2&gt;

&lt;p&gt;Because every generative UI library that works is web-shaped, and mobile punishes web-shaped assumptions. Three walls, in the order you hit them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming doesn't work.&lt;/strong&gt; React Native's Hermes engine doesn't implement &lt;code&gt;ReadableStream&lt;/code&gt; on &lt;code&gt;fetch&lt;/code&gt;. Every LLM SDK that streams tokens through &lt;code&gt;response.body.getReader()&lt;/code&gt; breaks on a real device. OpenAI's, Anthropic's, Google's, all of them. The first thing every mobile AI developer learns is that the model provider's own quickstart doesn't run on their phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive component trees are a tax.&lt;/strong&gt; Web generative UI emits nested trees: a Card holding a Row holding Buttons. On mobile, that recursion multiplies validation work, hammers the JS thread mid-stream, and hands the model more places to invent a prop. Models are measurably worse at deep nested structures than flat ones. Token cost climbs, malformed output climbs with it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No agent rails.&lt;/strong&gt; The agent protocols (A2A, AG-UI, &lt;a href="https://a2ui.org/" rel="noopener noreferrer"&gt;Google's A2UI&lt;/a&gt;) were spec'd web-first. A2UI ships native renderers for Angular, Flutter, Lit, and web. If you want an agent to drive native React Native screens today, you're writing the adapter yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And look at what mobile actually has in 2026. The "best React Native UI libraries" lists are all static kits: Tamagui, NativeWind, gluestack, Restyle. Excellent component libraries. Not one of them is generative. The category just doesn't exist on mobile yet the way it does on web.&lt;/p&gt;

&lt;p&gt;So mobile teams do what teams always do. They patch a polyfill, give up on streaming, hand-roll a JSON-to-component mapper, and accidentally write 1,200 lines of glue code. I know the number because I wrote that glue for a client in 2024, and it broke every time the model invented a prop name.&lt;/p&gt;

&lt;h2&gt;
  
  
  How far does this go?
&lt;/h2&gt;

&lt;p&gt;Worth zooming out before I get to the building part. The designer Andy Budd recently sketched a ladder of "adaptive software," borrowing the metaphor from the autonomy levels we use for self-driving cars. At the bottom, humans author every screen. Near the top, a product stops shipping one best version and starts assembling a different experience per cluster of users, then eventually per individual, per session, per task. The reframe that stuck with me is his: the question stops being "what's the best version of this flow?" and becomes best for whom? At the far end, each interaction becomes a design problem of its own.&lt;/p&gt;

&lt;p&gt;He names the catch too, and it's a real one. A product that can adapt to your needs can adapt to your weaknesses just as easily. Personalization and manipulation run on the same engine. Anything that assembles interfaces per user needs rules about what it's allowed to optimize for, and in whose interest. That isn't a mobile problem or a web problem. It's a "we can suddenly do this" problem, and it shows up whether or not anyone writes the rules first.&lt;/p&gt;

&lt;p&gt;Here's the bridge back to my corner of it. You don't reach the top of that ladder with hard-coded screens. Per-user, per-session interfaces need a system that builds UI at runtime from validated components, and that mechanism is what generative UI actually is. The web has it. Mobile, as we've covered, mostly doesn't. Which is the gap I'm building into.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I'm building it
&lt;/h2&gt;

&lt;p&gt;I'm building the thing I kept needing: an open-source generative UI SDK for iOS and Android, built on React Native. Wire RN.&lt;/p&gt;

&lt;p&gt;Same core pattern the web libraries proved. A fixed registry of components, strict schema validation between the model and the screen, the model choosing the flow and never inventing a component. But built for the walls above instead of around them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming that survives Hermes&lt;/strong&gt;, so token streaming actually works on a real device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flat components instead of recursive trees&lt;/strong&gt;, because mobile screens are sequential anyway, and flat is where models make fewer mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The registry stays yours&lt;/strong&gt;, so your brand, design system, and accessibility never leave your control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I rebuilt my own app's onboarding on it first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three turns of the same onboarding flow, left to right: the model rendered a text field, then a "reading your answer" beat, then a different choice-chips component. Same code, a different screen per user, no release cycle to change it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first version confidently rendered a date picker when it should have asked about sleep habits. So no, the robots are not running the show yet. Validation matters. And a rule of thumb on where to even use this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Good fits:&lt;/strong&gt; onboarding, check-ins, recommendations, anything high-variance where the right next screen depends on the last answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad fits:&lt;/strong&gt; settings, billing, anything you want stable and predictable. Please do not make your settings screen generative.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So that's the why. The interface has always drifted toward adapting to the user instead of the other way around. The web got the generative version first. Mobile is late, but it's the surface where most people actually live, and being late means whoever picks it up now gets a personalization lever their competitors can only iterate on through App Store review cycles. I'd rather build the tool than keep writing the glue.&lt;/p&gt;

&lt;p&gt;I'm shipping Wire RN open-source this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is generative UI the same as a chatbot?
&lt;/h3&gt;

&lt;p&gt;No. A chatbot returns text that you read. Generative UI returns interface: real native components you tap, type into, and swipe. The model decides which component renders next from your context, and your code decides what components are allowed to exist. The conversation happens through the UI, not in a chat bubble.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the AI write code at runtime?
&lt;/h3&gt;

&lt;p&gt;No, and this is the part most people get wrong. The model emits structured data that maps to pre-built, schema-validated components from a registry you control. It never writes React Native at runtime. If it emits something malformed, your validation layer rejects it before render and the user sees a fallback, not a crash.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can't I just use Tambo or the Vercel AI SDK in React Native?
&lt;/h3&gt;

&lt;p&gt;They're built on web assumptions. They expect browser streaming APIs that React Native's Hermes engine doesn't implement, and they emit recursive component trees that perform badly on mobile and give the model more room to hallucinate props. They're excellent on the web. Mobile needs a runtime shaped for mobile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is generative UI safe for production apps?
&lt;/h3&gt;

&lt;p&gt;Yes, if it's validated. The registry-plus-schema pattern means the model can only ever pick from components you shipped, with props checked against a schema before anything renders. The risk profile is closer to "remote config with opinions" than to "AI writes my app." The model owns the flow, never the component definitions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does generative UI make sense first?
&lt;/h3&gt;

&lt;p&gt;Onboarding, check-ins, recommendation flows, coaching: anywhere the ideal next screen depends on what the user just did. These are high-variance and conversational, so personalization pays off. Static utility screens like settings and billing should stay hard-coded. Please do not make your settings screen generative.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write &lt;a href="https://codemeetai.substack.com" rel="noopener noreferrer"&gt;Code Meet AI&lt;/a&gt;, a weekly newsletter on AI-native mobile engineering. Wire RN goes open-source this month — the build, the bugs, and the repo are the next issue.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ai</category>
      <category>typescript</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
