<?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: Mayank rajput</title>
    <description>The latest articles on DEV Community by Mayank rajput (@trynocoder).</description>
    <link>https://dev.to/trynocoder</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%2F4068903%2F33ab4c26-bfef-438a-ab56-20cd8b38e562.jpg</url>
      <title>DEV Community: Mayank rajput</title>
      <link>https://dev.to/trynocoder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trynocoder"/>
    <language>en</language>
    <item>
      <title>We read every message our first six users sent. The worst bug was our own progress report.</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Thu, 27 Aug 2026 15:02:06 +0000</pubDate>
      <link>https://dev.to/trynocoder/we-read-every-message-our-first-six-users-sent-the-worst-bug-was-our-own-progress-report-20lh</link>
      <guid>https://dev.to/trynocoder/we-read-every-message-our-first-six-users-sent-the-worst-bug-was-our-own-progress-report-20lh</guid>
      <description>&lt;p&gt;We build a cloud AI coding agent. Over 21 days, six real people signed up and used it.&lt;/p&gt;

&lt;p&gt;Six. Not a launch, not traction, not a growth story — six people, small enough that we could sit down and read every message they ever sent it. So we did.&lt;/p&gt;

&lt;p&gt;Here is everything that broke, including the one that was our fault in a way we didn't expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. "No file changes were made in this turn."
&lt;/h3&gt;

&lt;p&gt;That string appears three times across six users. One of them typed &lt;code&gt;Continue&lt;/code&gt;, waited, and got it back. It was the last message of their session. They didn't return.&lt;/p&gt;

&lt;p&gt;Our first assumption was that the agent had stalled — a hung tool call, a dead model, something obvious. It hadn't.&lt;/p&gt;

&lt;p&gt;The message comes from a fallback. When the model returns no prose, we describe what it did instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fullResponse&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describeTurnActions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;turnActions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;describeTurnActions&lt;/code&gt; counted this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;write_file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;edit_file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run_command&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writes and commands. That is the whole census.&lt;/p&gt;

&lt;p&gt;Now the turn that ended that user's session: &lt;strong&gt;117 seconds. 254,000 tokens. 8 file reads. 10 searches.&lt;/strong&gt; The agent opened the codebase, searched it, read through it, and then stopped without editing anything.&lt;/p&gt;

&lt;p&gt;Every one of those actions was invisible to the counter. So the product took two minutes of real work and reported it to a paying-attention human as &lt;em&gt;nothing happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There were two separate bugs sitting inside one sentence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the agent terminating a turn without acting, and&lt;/li&gt;
&lt;li&gt;us being unable to tell that apart from a crash — including in our own logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We spent our first hour debugging (2) while believing it was (1).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 73 commands, 2 files
&lt;/h3&gt;

&lt;p&gt;Another user's first turn produced 48 files and 41 commands — a real application skeleton. Then they typed &lt;code&gt;continue.&lt;/code&gt; and got &lt;strong&gt;2 files and 73 commands&lt;/strong&gt;. Then again: &lt;strong&gt;2 files, 59 commands&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dozens of shell commands producing almost nothing. From the outside that reads as thrash, and it may well be.&lt;/p&gt;

&lt;p&gt;But look at what I just told you about that turn. File counts and command counts. It is the same instrument as #1, and I do not yet know whether those 73 commands were flailing or were one long legitimate diagnosis. We are not currently equipped to tell the difference. That is the actual finding.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The token budget ended a build early
&lt;/h3&gt;

&lt;p&gt;One user wrote a 518-character casual prompt — the kind of thing you type without thinking hard about it. The agent worked, hit its token budget partway through, and wrote an honest handoff explaining where it had got to.&lt;/p&gt;

&lt;p&gt;That is the correct behaviour, and I will take it over a confident lie every time. It is still a build that stopped short of a working app, and the user experienced it as the product giving up.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. "I can't see a thing in the preview"
&lt;/h3&gt;

&lt;p&gt;Same user, very next message. Their words, not our paraphrase.&lt;/p&gt;

&lt;p&gt;The cause: scaffolded Vite apps were going out without a &lt;code&gt;base&lt;/code&gt; set, so behind our preview proxy every asset resolved to a path that did not exist. A blank white page, underneath a promise of a live preview.&lt;/p&gt;

&lt;p&gt;That one is fixed and deployed. It had also been sitting fixed in a branch for a while before anyone noticed it was not in production, which is its own small lesson.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The one that redeems the list
&lt;/h3&gt;

&lt;p&gt;One user wrote a genuinely principal-architect-grade PRD, ran it, and got 36 files — prisma schema, auth, API routes, middleware. Then they closed the tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They came back 12.8 hours later and kept building.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No onboarding sequence. No email. No nudge. They came back the next day because the thing they had started was worth continuing. At six users that is not a statistic, but it is the single most encouraging thing in the data.&lt;/p&gt;

&lt;p&gt;And in that same session the agent hit a Next.js 16 async-params breakage across three route handlers, diagnosed it, and fixed all three unprompted. Nobody asked it to.&lt;/p&gt;

&lt;h3&gt;
  
  
  The pattern underneath
&lt;/h3&gt;

&lt;p&gt;Twice in one week we looked at a bad number, concluded the model was underperforming, and were wrong — because the thing doing the counting was broken.&lt;/p&gt;

&lt;p&gt;The first is the one above: reads and searches were not in the census, so work looked like idleness.&lt;/p&gt;

&lt;p&gt;The second was our evaluation harness. Fixtures were scoring high on trajectory quality while failing nearly all of their acceptance checks. Two measurements of the same run, disagreeing wildly. We spent real money iterating on the agent before anyone asked the obvious question — and the acceptance check was the thing that was wrong. The agent had been fine.&lt;/p&gt;

&lt;p&gt;Both times, the fault was in the ruler and we went looking in the thing being measured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check what your instrument counts before you conclude the model is bad at its job.&lt;/strong&gt; It costs about twenty minutes. We skipped it twice.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we changed
&lt;/h3&gt;

&lt;p&gt;The empty-turn message now knows the difference between "investigated and stopped" and "genuinely nothing":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reads&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;searches&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`**I looked, but I did not change anything this turn.** I &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;looked&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="s2"&gt;`and stopped without editing — usually that means I could not work out `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="s2"&gt;`the next step on my own.\n\n`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="s2"&gt;`Tell me what to do next and I will act on it.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`**That turn produced nothing — that is a fault on our side, not `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s2"&gt;`something you did wrong.**\n\nSend your last message again.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is live in production as of this week — I checked the running build rather than the branch, and the old string is gone from the bundle.&lt;/p&gt;

&lt;p&gt;Two things worth saying about that snippet.&lt;/p&gt;

&lt;p&gt;One: it does not fix the agent stopping early. It fixes us lying about it. Those are different jobs, and conflating them is how you end up shipping a nicer error message and calling the bug closed.&lt;/p&gt;

&lt;p&gt;Two: read the second branch again. When it really is our fault, the product says so, in those words. A user who is told "no file changes were made" concludes they prompted it wrong. That is the worst available outcome — they blame themselves, and they leave.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we deliberately did not publish
&lt;/h3&gt;

&lt;p&gt;Two of those six prompts are 15,000-character specifications for named products. Those are somebody's business, written into a text box they reasonably assumed was private. They would have made a far more interesting post than this one.&lt;/p&gt;

&lt;p&gt;There are no names, no product concepts and no prompt text anywhere above, and there will not be unless the person says yes.&lt;/p&gt;




&lt;p&gt;If you would rather watch the agent working than read about it failing, there is an uncut run here: &lt;a href="https://youtu.be/2sR4H1q9QCQ" rel="noopener noreferrer"&gt;https://youtu.be/2sR4H1q9QCQ&lt;/a&gt; — the interesting part is at 1:12, where its own build check fails and it goes and fixes the config itself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>My AI agent wasn't dumb — my guardrail was lying to it</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Sun, 23 Aug 2026 16:37:08 +0000</pubDate>
      <link>https://dev.to/trynocoder/my-ai-agent-wasnt-dumb-my-guardrail-was-lying-to-it-1eme</link>
      <guid>https://dev.to/trynocoder/my-ai-agent-wasnt-dumb-my-guardrail-was-lying-to-it-1eme</guid>
      <description>&lt;p&gt;I record demos of my own AI app builder. Last week one of them made the agent look incompetent, and chasing why turned into a lesson about diagnosing agents in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looked like
&lt;/h2&gt;

&lt;p&gt;The agent wrote a file. Then it wrote the same file again. Then it said this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"the writes report success but the files aren't there"&lt;/p&gt;

&lt;p&gt;"Many files aren't persisting despite success reports — likely a parallel-write race condition. Let me write them one at a time"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then it did exactly that, slowly, for most of the run — defending against a problem that did not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first theory, which was wrong
&lt;/h2&gt;

&lt;p&gt;NoCoder has an approval gate: in review mode the agent stops before each file write and waits for you to approve the diff. My immediate theory was that gated writes were being &lt;em&gt;queued&lt;/em&gt; — so the agent's next read hit the real filesystem, found nothing, and panicked.&lt;/p&gt;

&lt;p&gt;It explains the symptom perfectly. It is also completely wrong.&lt;/p&gt;

&lt;p&gt;The gate is blocking, not queueing. At the call site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;approvalGate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shouldGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestChangeApproval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;podName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* returns a normal failed ToolResult */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// only now does the write reach the pod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comment above it says the quiet part out loud: the gate sits &lt;em&gt;before anything touches the pod, so the diff shown is exactly what gets written and a rejected change never reaches disk.&lt;/em&gt; The agent is parked on that await the entire time a request is pending. There is no window in which it can write, move on, and read a file that isn't there yet.&lt;/p&gt;

&lt;p&gt;I found this by reading the call site. I would not have found it by reading the transcript, because the transcript supported my wrong theory beautifully.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual cause
&lt;/h2&gt;

&lt;p&gt;A loop guard I wrote.&lt;/p&gt;

&lt;p&gt;If the agent issues a second write to a path it already wrote, the guard assumes the model is spinning, skips the write, and feeds back: &lt;em&gt;"You already wrote X. Do NOT rewrite it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the right behaviour when the file is sitting on disk. It is the wrong behaviour when the file is gone — and it is often gone, because the agent's own cleanup of node_modules, a config regeneration, or a scaffold step removed it between the two attempts.&lt;/p&gt;

&lt;p&gt;So the agent was told it had already written a file that did not exist. It checked. It found nothing. It concluded the workspace was broken — which, from where it was standing, was a &lt;em&gt;reasonable&lt;/em&gt; inference. Everything downstream was careful reasoning from a false premise handed to it by my own guardrail.&lt;/p&gt;

&lt;p&gt;No data was ever lost, incidentally. Every claimed write was on disk once approvals landed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Make the guard check instead of assume. It now probes the workspace for the file and only skips the rewrite when the file is genuinely still present.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually took from this
&lt;/h2&gt;

&lt;p&gt;Two things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails are part of the model's world.&lt;/strong&gt; We spend a lot of effort on prompts and tools and comparatively little on what our safety rails &lt;em&gt;say&lt;/em&gt; when they fire. This one lied — confidently, in the imperative — and the agent believed it, because why wouldn't it. An agent can only be as sane as the feedback it is given.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A transcript is evidence of symptoms, not of causes.&lt;/strong&gt; The agent's own explanation ("parallel-write race condition") was wrong, my first explanation was wrong, and both were wrong in the same direction: blaming the layer we could see instead of the one we had to go read. If you are debugging an agent and your theory came from its output, go read the call site before you ship a fix.&lt;/p&gt;

&lt;p&gt;If you want to watch the run this came from, it is here: &lt;a href="https://youtu.be/2sR4H1q9QCQ" rel="noopener noreferrer"&gt;https://youtu.be/2sR4H1q9QCQ&lt;/a&gt; — the model catching a &lt;em&gt;different&lt;/em&gt; mistake of its own, a missing Tailwind plugin, is the more flattering part.&lt;/p&gt;

&lt;p&gt;NoCoder is what I am building: an AI app builder that proposes every change as a diff you approve before it touches your code. &lt;a href="https://nocoder.codes/?utm_source=devto&amp;amp;utm_campaign=guardrail" rel="noopener noreferrer"&gt;https://nocoder.codes/?utm_source=devto&amp;amp;utm_campaign=guardrail&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I made our AI agent ask permission before writing a single file</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Sat, 22 Aug 2026 11:54:13 +0000</pubDate>
      <link>https://dev.to/trynocoder/i-made-our-ai-agent-ask-permission-before-writing-a-single-file-4am0</link>
      <guid>https://dev.to/trynocoder/i-made-our-ai-agent-ask-permission-before-writing-a-single-file-4am0</guid>
      <description>&lt;p&gt;Most AI app builders write files and tell you afterwards. You send a prompt, the agent works, and some time later you have a diff to audit — or worse, you don't, and you find out what changed when something breaks.&lt;/p&gt;

&lt;p&gt;We built ours the other way round: the agent proposes a file, and then it stops.&lt;/p&gt;

&lt;p&gt;Here is a full run, one sentence in to a working landing page out:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2sR4H1q9QCQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What the approval gate actually does
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;write_file&lt;/code&gt; and &lt;code&gt;edit_file&lt;/code&gt; is intercepted before it touches disk. You get the path, the diff, and three choices: accept it, reject it, or approve the rest of the run so it stops asking.&lt;/p&gt;

&lt;p&gt;The escape hatch matters as much as the gate. A review step you cannot turn off is a review step people click through without reading — so "Approve the rest" is a first-class button, not something you find by giving up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I did not script
&lt;/h2&gt;

&lt;p&gt;Around 1:12 in the video, the agent's own build check fails. It reads &lt;code&gt;vite.config.ts&lt;/code&gt;, notices the &lt;code&gt;plugins&lt;/code&gt; array is &lt;code&gt;[react()]&lt;/code&gt; with no Tailwind plugin, runs a dry-run edit to confirm the string it wants to change exists, applies the fix, and then notes that Vite config changes are not picked up by HMR — so it restarts the dev server and verifies the CSS is actually being served.&lt;/p&gt;

&lt;p&gt;That is the real trajectory, not a demo edit. It is also the strongest argument for the gate: you can watch the reasoning that produced each change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we charge for the sandbox and not the tokens
&lt;/h2&gt;

&lt;p&gt;The agent runs in a real Kubernetes workspace you can open in VS Code. Bring your own API key — or point it at a local Ollama — and the tokens cost you nothing, because they never go through our provider account.&lt;/p&gt;

&lt;p&gt;What you pay for is the machine it runs on. No credits, no overage, and a failed build does not spend one of your runs.&lt;/p&gt;

&lt;p&gt;What comes out is an ordinary Vite or Next project with a normal &lt;code&gt;package.json&lt;/code&gt;. No proprietary format, nothing that needs us to keep running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Free tier, no credit card: &lt;a href="https://nocoder.codes/?utm_source=devto&amp;amp;utm_campaign=demo" rel="noopener noreferrer"&gt;https://nocoder.codes/?utm_source=devto&amp;amp;utm_campaign=demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it and the agent does something dumb, I would genuinely like to see the trajectory — that is the fastest way we fix things.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>We shipped the feature we are named for. It was off by default.</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:30:41 +0000</pubDate>
      <link>https://dev.to/trynocoder/we-shipped-the-feature-we-are-named-for-it-was-off-by-default-eho</link>
      <guid>https://dev.to/trynocoder/we-shipped-the-feature-we-are-named-for-it-was-off-by-default-eho</guid>
      <description>&lt;p&gt;96% of developers don't fully trust AI-generated code. Only 48% of them verify it before it ships (&lt;a href="https://www.sonarsource.com/company/press-releases/sonar-data-reveals-critical-verification-gap-in-ai-coding/" rel="noopener noreferrer"&gt;Sonar, 2026&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That gap is the reason our product exists: you review every AI change as a diff before it touches your project.&lt;/p&gt;

&lt;p&gt;Last week I found our review gate was off by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feature worked. Nobody met it.
&lt;/h2&gt;

&lt;p&gt;The mechanism was never the problem. The agent is intercepted at the tool boundary, before anything reaches disk. You get a real unified diff, and the run waits. There's no timeout, because a user who walked away hasn't approved anything.&lt;/p&gt;

&lt;p&gt;There is also an "Approve the rest" button, deliberately. A cold build writes dozens of files, and asking dozens of times produces rubber-stamping — which defeats the entire point of a gate.&lt;/p&gt;

&lt;p&gt;All of that shipped and worked. And &lt;code&gt;reviewChanges&lt;/code&gt; defaulted to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So a new user got the same write-without-asking behaviour as every prompt-to-app tool we describe as the problem. We had quietly joined the 52% who do not verify.&lt;/p&gt;

&lt;p&gt;I found it the only way this class of bug can be found: by running a real build and watching the agent create a file in the workspace without asking me a single question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things underneath were worse
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The diff you approved was not always the diff that got written
&lt;/h3&gt;

&lt;p&gt;The gate ran on the original tool arguments. Pre-write hooks — which can rewrite file content — were applied &lt;em&gt;after&lt;/em&gt; the user answered.&lt;/p&gt;

&lt;p&gt;So if a hook rewrote &lt;code&gt;content&lt;/code&gt;, you approved one change and a different one reached disk. On a review feature, that is not a bug, it is a lie.&lt;/p&gt;

&lt;p&gt;The order is now: safety hooks → hook modifications → user review of the final arguments → write.&lt;/p&gt;

&lt;h3&gt;
  
  
  One retry ended the whole run
&lt;/h3&gt;

&lt;p&gt;When a user rejects a change, models sometimes re-propose it. We cap that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MAX_REPEATS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// repeats allowed before the turn is ended outright&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The check read &lt;code&gt;seen + 1 &amp;gt;= MAX_REPEATS&lt;/code&gt;, and &lt;code&gt;seen&lt;/code&gt; is already the count of previous rejections. So the &lt;em&gt;first&lt;/em&gt; repeat satisfied it, and the orchestrator turns that into a full run abort.&lt;/p&gt;

&lt;p&gt;One innocuous retry killed everything the user was doing.&lt;/p&gt;

&lt;p&gt;The existing test asserted that the third request stopped the run. It never asserted the second one did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take from it
&lt;/h2&gt;

&lt;p&gt;A feature flag defaulting to off is indistinguishable from never having built the feature. Your tests pass either way. Your changelog says you shipped it either way. Nothing in your pipeline knows the difference between "built" and "reachable".&lt;/p&gt;

&lt;p&gt;61% of developers say AI produces code that looks correct but is not — silent failures. A review gate that quietly defaults to off is exactly that failure mode, turned on your own product.&lt;/p&gt;

&lt;p&gt;The fix was one boolean. Finding it took running the thing like a user and watching what it actually did.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://nocoder.codes/blog/we-shipped-the-review-gate-off-by-default" rel="noopener noreferrer"&gt;nocoder.codes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Bolt.new and Replit Agent alternatives that let you review the code before it ships</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Sun, 09 Aug 2026 17:29:33 +0000</pubDate>
      <link>https://dev.to/trynocoder/boltnew-and-replit-agent-alternatives-that-let-you-review-the-code-before-it-ships-354i</link>
      <guid>https://dev.to/trynocoder/boltnew-and-replit-agent-alternatives-that-let-you-review-the-code-before-it-ships-354i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cross-posted from &lt;a href="https://nocoder.codes/blog/bolt-new-alternatives" rel="noopener noreferrer"&gt;nocoder.codes/blog/bolt-new-alternatives&lt;/a&gt; — see the canonical URL for the latest version.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;People leave Bolt.new and Replit Agent for the same reason they leave Lovable: the demo is fast, but the code is a black box you can't easily trust, extend, or own.&lt;/p&gt;

&lt;p&gt;Judge alternatives on control, not just speed: reviewable diffs, rollback, a real workspace, code ownership, full-stack, and predictable pricing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nocoder.codes/register?utm_source=devto&amp;amp;utm_campaign=bolt-replit-alternatives" rel="noopener noreferrer"&gt;NoCoder&lt;/a&gt; is a diff-first alternative — every change is a per-file diff you approve, in a real code workspace, with code you own and can run anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people look beyond Bolt.new and Replit Agent
&lt;/h2&gt;

&lt;p&gt;Both tools optimize for one thing: getting from idea to running app in as few steps as possible. For a throwaway demo it's hard to beat. The friction shows up afterward, when the app has to survive contact with reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Black-box edits.&lt;/strong&gt; The agent applies changes automatically. The preview works, but you can't see what changed, why, or whether it rewrote something that worked before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code that's hard to own or extend.&lt;/strong&gt; When the app is generated behind the scenes, handing it to a developer — or picking it up yourself in three months — gets painful. You're reverse-engineering your own app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replit's path to production is the cloud IDE.&lt;/strong&gt; Ties your app and your deploy to one platform. If you want to own the stack, the agent isn't built for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpredictable cost as you iterate.&lt;/strong&gt; Each "just fix this one thing" round-trip can burn more credits than you expect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to look for in a Bolt.new / Replit Agent alternative
&lt;/h2&gt;

&lt;p&gt;Judge alternatives on what happens &lt;strong&gt;after&lt;/strong&gt; the demo, not just generation speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it show every change as a reviewable diff before applying it — or does it edit for you automatically?&lt;/li&gt;
&lt;li&gt;Can you roll back a bad change to a clean checkpoint?&lt;/li&gt;
&lt;li&gt;Is there a real code workspace (full editor + live preview) where you can run, edit, and verify?&lt;/li&gt;
&lt;li&gt;Do you own and can you export the code, or is it locked to the platform?&lt;/li&gt;
&lt;li&gt;Can it do full-stack (backend, auth, database) — not just a frontend demo?&lt;/li&gt;
&lt;li&gt;Is pricing predictable, with a usable free path?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The case for a diff-review builder
&lt;/h2&gt;

&lt;p&gt;The most important difference between alternatives is not which one writes prettier React. It's &lt;strong&gt;whether you stay in control of what ships&lt;/strong&gt;. A diff-first builder proposes each change as a per-file diff and applies nothing until you accept it. You keep the speed of AI generation without inheriting code you've never actually looked at.&lt;/p&gt;

&lt;h3&gt;
  
  
  The honest trade-off
&lt;/h3&gt;

&lt;p&gt;Pure prompt-to-app tools will usually feel faster for a throwaway demo — that's what they're built for. A diff-review workflow adds a short review beat, and that beat is exactly what makes the output something you can trust, extend, and maintain. If your app is disposable, the fastest demo wins. If your app has to live, control wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where NoCoder fits
&lt;/h2&gt;

&lt;p&gt;NoCoder is built around reviewable diffs and a real code workspace. Every change is shown as a per-file diff you approve; the app runs in a full code-server (VS Code in the browser) environment with a live preview; and you can roll back to any checkpoint. The code is yours to read, extend, and run anywhere.&lt;/p&gt;

&lt;p&gt;For a head-to-head on speed, ownership, and control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nocoder.codes/compare/bolt" rel="noopener noreferrer"&gt;NoCoder vs Bolt.new&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nocoder.codes/compare/replit" rel="noopener noreferrer"&gt;NoCoder vs Replit Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nocoder.codes/compare" rel="noopener noreferrer"&gt;Full AI app builder comparison&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or &lt;a href="https://nocoder.codes/register?utm_source=devto&amp;amp;utm_campaign=bolt-replit-alternatives" rel="noopener noreferrer"&gt;start free on NoCoder&lt;/a&gt; and review your first diff.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  What is the best Bolt.new alternative for developers?
&lt;/h3&gt;

&lt;p&gt;If you care about reading and owning the code, choose an alternative that gives you a real workspace and shows changes as reviewable diffs instead of applying them automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a Replit Agent alternative where I own the code?
&lt;/h3&gt;

&lt;p&gt;Yes. NoCoder is built around a diff-first workflow: the agent proposes every change as a per-file diff, nothing is written until you approve it, and the code is yours to export and run anywhere — not locked to a hosted IDE.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is a diff-review builder different from Bolt.new or Replit Agent?
&lt;/h3&gt;

&lt;p&gt;Bolt.new and Replit Agent optimize for getting a running app as fast as possible and apply edits automatically. A diff-review builder adds a short review beat — you see each change before it lands and can revert to a checkpoint.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Canonical URL:&lt;/strong&gt; &lt;a href="https://nocoder.codes/blog/bolt-new-alternatives" rel="noopener noreferrer"&gt;https://nocoder.codes/blog/bolt-new-alternatives&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nocode</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What Our AI Agent Still Can't Do</title>
      <dc:creator>Mayank rajput</dc:creator>
      <pubDate>Sat, 08 Aug 2026 14:11:06 +0000</pubDate>
      <link>https://dev.to/trynocoder/what-our-ai-agent-still-cant-do-fm3</link>
      <guid>https://dev.to/trynocoder/what-our-ai-agent-still-cant-do-fm3</guid>
      <description>&lt;p&gt;Most AI tools only tell you what they're good at. That's how you end up discovering the gaps in production. So here's the other half: where our AI agent still misses, specifically, and what we're doing about each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's genuinely good at
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Targeted bug-fixing (~85–90%)&lt;/strong&gt; — given real broken code, it produces a fix that compiles clean and makes the specific change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple full-stack builds&lt;/strong&gt; — it scaffolds working SPAs reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt → full-stack app → live deploy&lt;/strong&gt; with a real database — validated end to end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it still misses
&lt;/h2&gt;

&lt;p&gt;From our own correctness-gated evals, the honest gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex full-stack scaffolding.&lt;/strong&gt; On a notes app with auth, it built the database schema but missed declaring the &lt;code&gt;bcrypt&lt;/code&gt; / &lt;code&gt;jsonwebtoken&lt;/code&gt; dependencies — the kind of gap that compiles in isolation but breaks the build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run-to-run consistency.&lt;/strong&gt; A landing-page fixture's dev-server check passed on one run and failed on another. Non-determinism is real, and we measure it instead of hiding it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small correctness slips.&lt;/strong&gt; Using &lt;code&gt;React.Fragment&lt;/code&gt; without importing it; a to-do app that skipped localStorage persistence. Individually minor — exactly the sort of thing you'd want to catch in a diff review, not in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only tasks.&lt;/strong&gt; On a task that only asked it to &lt;em&gt;find&lt;/em&gt; and report something, it wrote files instead of answering. Knowing when &lt;em&gt;not&lt;/em&gt; to act is its own skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we do about it
&lt;/h2&gt;

&lt;p&gt;Every genuine failure feeds a closed &lt;strong&gt;self-improvement loop&lt;/strong&gt;: the run is analyzed, a prompt change is proposed, and the candidate is validated against the same correctness gate — with a holdout set guarding against regressions — before anything reaches production. Some of the misses above already have fixes in flight; some don't yet. We publish both states.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why publish this at all
&lt;/h2&gt;

&lt;p&gt;Because you're going to hit these limits either way — the only question is whether you find out from us now or from a broken build later. It's also why &lt;a href="https://nocoder.codes" rel="noopener noreferrer"&gt;NoCoder&lt;/a&gt; puts diff review at the center: the agent isn't perfect, so you stay in the loop. Every change is a per-file diff you approve before it applies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; Our agent is strong at bug-fixing (~85–90%) and simple full-stack builds, and weaker on complex scaffolding, consistency, and a few specific tasks (missed auth deps, a skipped localStorage step, a Fragment import, a read-only find task). We fix what we can via a validated self-improvement loop and publish the rest. See &lt;a href="https://nocoder.codes/blog/how-we-benchmark-our-ai-agent" rel="noopener noreferrer"&gt;how we benchmark&lt;/a&gt; or &lt;a href="https://nocoder.codes/register?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=crosspost" rel="noopener noreferrer"&gt;try NoCoder free&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This post originally appeared on the &lt;a href="https://nocoder.codes/blog/what-our-ai-agent-cant-do" rel="noopener noreferrer"&gt;NoCoder blog&lt;/a&gt;. NoCoder is an AI full-stack app builder that shows every change as a diff you approve before it ships — build at AI speed, ship only what you've reviewed. Free to start on free models.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
