<?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: Mirza Iqbal</title>
    <description>The latest articles on DEV Community by Mirza Iqbal (@mjmirza).</description>
    <link>https://dev.to/mjmirza</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%2F1235534%2F747e1cbd-2637-4cd5-9bb8-a536f31a8980.jpg</url>
      <title>DEV Community: Mirza Iqbal</title>
      <link>https://dev.to/mjmirza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mjmirza"/>
    <language>en</language>
    <item>
      <title>I fixed the same kind of mistake five times this month before I changed how I work</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Fri, 24 Jul 2026 19:28:54 +0000</pubDate>
      <link>https://dev.to/mjmirza/i-fixed-the-same-kind-of-mistake-five-times-this-month-before-i-changed-how-i-work-hec</link>
      <guid>https://dev.to/mjmirza/i-fixed-the-same-kind-of-mistake-five-times-this-month-before-i-changed-how-i-work-hec</guid>
      <description>&lt;p&gt;I fixed the same kind of mistake again this week.&lt;/p&gt;

&lt;p&gt;Not the same mistake. The same KIND.&lt;/p&gt;

&lt;p&gt;Building in public is supposed to be the wins. Shipped things, clean befores and afters, momentum you can point at. What nobody posts is the quiet version. Sitting alone, patching something I had already patched in a different shape last week, realising I was on roughly my fifth round of the same lesson this month, feeling a bit stupid about it.&lt;/p&gt;

&lt;p&gt;Here is the confession under the confession. I was not learning. I was coping. Each time it broke, I fixed that one instance, felt the small relief of a green check, and moved on. Five reliefs. Zero progress.&lt;/p&gt;

&lt;p&gt;If you build anything alone, you know this feeling. Knowing and doing are two different muscles, and the gap between them is where momentum quietly dies. You lack no skill here. You are stuck because you keep re-solving a thing you have technically already solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  A lie I was telling myself with a green check
&lt;/h2&gt;

&lt;p&gt;My work was full of small checks. Little walls I had built so a mistake could not slip through. One test here, one guard there, a rule that says stop before you do the dumb thing.&lt;/p&gt;

&lt;p&gt;Every one of them had a green tick beside it. And I trusted that tick the way you trust a smoke alarm you have never heard go off.&lt;/p&gt;

&lt;p&gt;Here is what took me years to actually feel.&lt;/p&gt;

&lt;p&gt;Green checks do not prove the thing is right. They prove the thing survived the cases I thought of.&lt;/p&gt;

&lt;p&gt;Those two are barely related.&lt;/p&gt;

&lt;p&gt;Whenever I write a check, I am writing down the situations already in my head. Whatever seems obvious. An empty case. One weird thing I happened to remember. My check becomes a mirror of my imagination on the day I built it, nothing more.&lt;/p&gt;

&lt;p&gt;Whatever actually breaks is, almost always, the case that was not in my head. Had it been in my head, I would have handled it. So the check that would have caught it does not exist, because you cannot defend against a failure you have never imagined.&lt;/p&gt;

&lt;p&gt;For a feature, fine. Annoying, survivable. For the walls you trust to keep you safe, it is quiet ruin. When a feature is wrong, you find out. When your safety net is wrong, nobody tells you. It hangs there with its green tick, letting the exact thing through that it was built to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  I thought there were two ways to be wrong
&lt;/h2&gt;

&lt;p&gt;Sitting down to look at my mis-firing walls honestly, I reached for the two words everyone knows.&lt;/p&gt;

&lt;p&gt;It blocks a thing that was fine.&lt;br&gt;
It misses a thing that was not fine.&lt;/p&gt;

&lt;p&gt;For about a day I thought that was the whole story. Cover both, done, clever.&lt;/p&gt;

&lt;p&gt;Then I wrote down every one of these failures I had actually fixed. Not the ones I could imagine, the real ones, the ones I had already lived. And my list refused to fit in two boxes.&lt;/p&gt;

&lt;p&gt;One had crashed. Not right, not wrong, dead on a weird input, and a dead safeguard protects nobody.&lt;/p&gt;

&lt;p&gt;One, while tidying up, had quietly overwritten something it should have left alone. It did not block me, it did not miss anything, it destroyed. Its own category, and the one that scares me most, because you do not get that back.&lt;/p&gt;

&lt;p&gt;Sneakiest of all said yes anyway. Green tick, all good. Except it waved through something only half finished, and the missing half turned up as a problem three steps later, somewhere nobody was watching.&lt;/p&gt;

&lt;p&gt;So my honest list was never two. Count at least five.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It blocks good work.&lt;/li&gt;
&lt;li&gt;It misses bad work.&lt;/li&gt;
&lt;li&gt;It crashes on something ugly.&lt;/li&gt;
&lt;li&gt;It destroys while trying to help.&lt;/li&gt;
&lt;li&gt;It says yes to a thing that is not actually done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those wears a green check on the day you ship it. Every one hides perfectly in a demo. And I had been testing for exactly two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the annoying one is the one that actually ends you
&lt;/h2&gt;

&lt;p&gt;Here is the part that surprised me, and it maps straight onto the build-in-public freeze.&lt;/p&gt;

&lt;p&gt;Missing a real problem feels like the dangerous failure. It let the bad thing through, obviously bad.&lt;/p&gt;

&lt;p&gt;Blocking legitimate work is what actually kills the whole thing.&lt;/p&gt;

&lt;p&gt;Picture it. You are in flow, finally moving, and a wall you built yourself stands in your way saying no to something you KNOW is fine. What do you do? You override it. Once. Then again. Then overriding becomes a reflex. Then one tired day you tear the wall down.&lt;/p&gt;

&lt;p&gt;Now the wall that was ALSO catching real problems is gone, because it cried wolf too many times.&lt;/p&gt;

&lt;p&gt;That is the exact shape of every abandoned system, every dropped habit, every tracker you stopped opening. It annoyed you while you were trying to move, so you routed around it, so it quietly died while still showing green. What was meant to protect your momentum is what broke it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small shift, honestly
&lt;/h2&gt;

&lt;p&gt;For the longest time my answer was to fix the one broken thing and move on. Patch it, watch the tick go green, close the tab.&lt;/p&gt;

&lt;p&gt;Which is precisely why the same KIND of thing kept coming back. I was fixing instances forever. Never once the class.&lt;/p&gt;

&lt;p&gt;When it finally landed, it was almost embarrassing to say out loud.&lt;/p&gt;

&lt;p&gt;Stop testing your imagination. Start replaying your scars.&lt;/p&gt;

&lt;p&gt;Now, every single time one of these walls fails for real and I fix it, I do not get to call it done. That exact failure becomes a permanent, replayable memory. Whatever precisely broke, frozen, quietly re-checked against the live work on a schedule, forever.&lt;/p&gt;

&lt;p&gt;Never a neat example I made up to feel thorough. Always the real failure that actually happened to me.&lt;/p&gt;

&lt;p&gt;One version of the work says the cases I thought of still pass. Another says every way this has ever genuinely burned me is still handled. First one mirrors my imagination. Second one remembers my scars. And scars are the only honest teacher I have.&lt;/p&gt;

&lt;p&gt;One rule fell out of it that changed how the whole thing feels. Nothing is finished when the thing is patched. It is finished when the failure that caused it can never quietly come back. Patch it and fail to record it, and you did not finish, you handed the repeat to a future, more tired version of yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually buys you
&lt;/h2&gt;

&lt;p&gt;Let me be honest, because building in public is worthless without honesty. It does not buy me "no more problems." Quieter than that.&lt;/p&gt;

&lt;p&gt;Whole categories of failure lose the ability to come back without me noticing.&lt;/p&gt;

&lt;p&gt;Some brand new kind of problem still costs me the first time. I still trip over it, feel the sting, fix it. That never goes away and I am done pretending it does.&lt;/p&gt;

&lt;p&gt;But it can only cost me once. Second time that exact thing tries to sneak back, through a careless edit or a clever shortcut or a tidy-up that undoes an old fix, something catches it before it reaches anyone. Not because I remembered. Because the memory lives outside my head now, and my head forgets everything.&lt;/p&gt;

&lt;p&gt;That is the whole game, and it is the whole build-in-public game too. You will never become someone who never fails, so aim smaller. Make sure no failure you have already survived ever gets a free second run at you.&lt;/p&gt;

&lt;h2&gt;
  
  
  One honest limit
&lt;/h2&gt;

&lt;p&gt;None of this makes me safe. It only makes me un-repeatable in the bad way.&lt;/p&gt;

&lt;p&gt;Old failures get caught. Some brand new one does not, and the first time it walks in, my green check lies to me exactly like before, because I never gave it that memory, because I did not know yet.&lt;/p&gt;

&lt;p&gt;Anyone selling you a system that makes you bulletproof is selling you a feeling. Its real promise is smaller and worth far more over the years. Same mistake stops coming back. Your list of ways the work can surprise you only ever shrinks. Every fire you put out stays out.&lt;/p&gt;

&lt;p&gt;For someone building alone, that is the difference between drowning in your own past mistakes and slowly getting lighter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sit with this for a second
&lt;/h2&gt;

&lt;p&gt;Look at whatever you trust most in your own setup. Some check, some habit, a rule, a little system you lean on so you do not slip.&lt;/p&gt;

&lt;p&gt;It is showing you green.&lt;/p&gt;

&lt;p&gt;Does that green mean it survived the cases you imagined, or every way it has genuinely broken on you before?&lt;/p&gt;

&lt;p&gt;For almost everyone, honestly, it is the first one. Mine was, for years, and I called it discipline.&lt;/p&gt;

&lt;p&gt;That gap is the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is one thing in your own setup you TRUST completely but have never actually watched fail?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 of my 8 answers were wrong and the table hid it</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Thu, 23 Jul 2026 07:32:03 +0000</pubDate>
      <link>https://dev.to/mjmirza/5-of-my-8-answers-were-wrong-and-the-table-hid-it-4ppo</link>
      <guid>https://dev.to/mjmirza/5-of-my-8-answers-were-wrong-and-the-table-hid-it-4ppo</guid>
      <description>&lt;p&gt;Yesterday my agent wrote the sentence "I cannot verify this" and meant it.&lt;/p&gt;

&lt;p&gt;Forty lines later, in the same reply, it put the unverified thing in a markdown table with a column header and a row per item.&lt;/p&gt;

&lt;p&gt;I read both. I acted on the table.&lt;/p&gt;

&lt;p&gt;Neither of us did anything wrong at the level of intent. The disclaimer was honest. The table was confident. Confidence won.&lt;/p&gt;

&lt;h2&gt;
  
  
  You have shipped this
&lt;/h2&gt;

&lt;p&gt;Before I make this about the machine, I have done the identical thing myself, more than once.&lt;/p&gt;

&lt;p&gt;You caveat something in a Slack thread, then paste a clean summary underneath it.&lt;/p&gt;

&lt;p&gt;You write "rough numbers" above a spreadsheet where every cell is right-aligned to two decimal places.&lt;/p&gt;

&lt;p&gt;You tell your lead the estimate is soft, then put it in a Gantt chart with a start date and an end date.&lt;/p&gt;

&lt;p&gt;The hedge goes in the sentence. The answer goes in the structure. And structure wins, every single time, because structure is what people act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the verification did
&lt;/h2&gt;

&lt;p&gt;The task was ordinary. Recommend some films, note whether they were on a specific streaming service in a specific country.&lt;/p&gt;

&lt;p&gt;It knew, and said, that regional streaming catalogs rotate and that its recall of one was not trustworthy. Correct instinct, stated plainly, in writing.&lt;/p&gt;

&lt;p&gt;Then it produced a recommendation table anyway.&lt;/p&gt;

&lt;p&gt;When I finally made it check against a live availability source, per title, one request each, five of the eight titles in that table were not on the platform at all. Not close. Not recently removed. Simply not there, in that country, that day.&lt;/p&gt;

&lt;p&gt;The strongest pick in the list, the one described to me as the best match for what I had asked, was among them.&lt;/p&gt;

&lt;p&gt;Here is the part that should bother you more than the miss.&lt;/p&gt;

&lt;p&gt;Nothing in that output looked uncertain. The film knowledge was solid. The quality judgments held up fine. Every rating was close enough. Only one narrow class of fact was rotten, and it was the class that changes monthly while feeling permanent.&lt;/p&gt;

&lt;p&gt;Confident recall and correct recall produce identical-looking output. There is no tell, and that is as true of me writing an estimate as it is of a model writing a table.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding, which is not "verify things"
&lt;/h2&gt;

&lt;p&gt;Everyone already knows to verify things. That advice has never once changed anyone's behavior, mine included, as demonstrated above.&lt;/p&gt;

&lt;p&gt;The useful finding is narrower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A disclaimer in prose cannot cancel an assertion in structure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They are not weighted equally by the reader and they never were. A table is an authority format. So is a numbered list, a comparison matrix, a confidence percentage, a chart with axes, a schema with types. These carry an implicit claim that the values inside them were sourced rather than generated.&lt;/p&gt;

&lt;p&gt;When you put unverified content into one of those containers, the container upgrades it. Your caveat sits above, in soft prose, doing nothing.&lt;/p&gt;

&lt;p&gt;This matters more with agent output than with human output, for a boring mechanical reason. Agents produce structured output constantly, because structured output is easier to parse, easier to render, and easier to feed into the next step. The format that makes output machine-usable is the same format that makes it look verified.&lt;/p&gt;

&lt;p&gt;So the failure scales with how well-formatted your pipeline is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would change
&lt;/h2&gt;

&lt;p&gt;Stop auditing the hedging language. It is decorative and everyone skims it.&lt;/p&gt;

&lt;p&gt;Audit the shape.&lt;/p&gt;

&lt;p&gt;Ask which claims in the output are sitting inside an authority container. Tables, matrices, typed fields, percentages, anything with a header row. For each one, ask whether the values came from a source or from recall.&lt;/p&gt;

&lt;p&gt;If they came from recall, they do not get the container. They get a sentence, in the same soft register as the doubt, so the confidence signal and the epistemic status finally match.&lt;/p&gt;

&lt;p&gt;That is the whole fix. Downgrade the format to match the sourcing.&lt;/p&gt;

&lt;p&gt;The corollary is uncomfortable and I think correct. If a claim is not worth the cost of verifying, it is also not worth a table row. Either check it or say it loosely. The middle option, checking nothing and formatting it beautifully, is the one that produces the confident wrongness people get burned by.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing verification gave back
&lt;/h2&gt;

&lt;p&gt;Worth saying, because verification usually gets sold as pure insurance and it is not.&lt;/p&gt;

&lt;p&gt;Running the real check surfaced something that recall could not have produced at all. One of the titles missing from the platform we were checking turned out to be free, with ads, on a service neither of us had thought to mention.&lt;/p&gt;

&lt;p&gt;That is a better answer than the one I nearly shipped. Not a corrected answer. A better one.&lt;/p&gt;

&lt;p&gt;Verification is usually framed as the tax you pay to avoid being wrong. In practice it is also where the non-obvious answers live, because the live source knows things recall cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is the last thing you formatted more confidently than you knew it?&lt;/p&gt;

&lt;p&gt;Table, chart, estimate, schema, does not matter. I want the format, not the topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>discuss</category>
      <category>agents</category>
    </item>
    <item>
      <title>My AI agent almost merged its own pull request</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Thu, 23 Jul 2026 07:28:15 +0000</pubDate>
      <link>https://dev.to/mjmirza/my-ai-agent-almost-merged-its-own-pull-request-23nk</link>
      <guid>https://dev.to/mjmirza/my-ai-agent-almost-merged-its-own-pull-request-23nk</guid>
      <description>&lt;p&gt;Tuesday night, in one of my app repos.&lt;/p&gt;

&lt;p&gt;My coding agent finished a feature, pushed the branch, opened the pull request, and typed the merge command.&lt;/p&gt;

&lt;p&gt;Same session. Same hands. Ninety seconds between opening the PR and merging it.&lt;/p&gt;

&lt;p&gt;I stopped it and sat there for a moment.&lt;/p&gt;

&lt;p&gt;Code quality had nothing to do with why I stopped. Nobody had read a line of it.&lt;/p&gt;

&lt;p&gt;Author and reviewer were about to be the same machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own queue
&lt;/h2&gt;

&lt;p&gt;How many of the PRs waiting on you this morning were written by a model?&lt;/p&gt;

&lt;p&gt;And how honestly did your last "LGTM" reflect what you actually read?&lt;/p&gt;

&lt;p&gt;Sixteen years of building enterprise integrations, and I still caught myself doing this. Approving my own agent's diffs on momentum, because tests were green, everything looked plausible, and I wanted the feature.&lt;/p&gt;

&lt;p&gt;Call that what it is. A signature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source hit the wall before we did
&lt;/h2&gt;

&lt;p&gt;Watch what happened across open source in the last few months.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;curl shut down its bug bounty after years of low-quality AI-generated reports made triage unaffordable&lt;/li&gt;
&lt;li&gt;Ghostty moved to zero tolerance on undisclosed AI pull requests&lt;/li&gt;
&lt;li&gt;tldraw now auto-closes external PRs entirely&lt;/li&gt;
&lt;li&gt;GitHub is publicly weighing a kill switch for PR floods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One maintainer said it plainly this month. Letting AI write the code might be fine. Reviewing on vibes is not.&lt;/p&gt;

&lt;p&gt;None of this reads as anti-AI to me. It reads as triage by people whose scarcest resource ran out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers we already had
&lt;/h2&gt;

&lt;p&gt;None of it should surprise anyone, because the research is two decades old.&lt;/p&gt;

&lt;p&gt;SmartBear's study of 2,500 reviews at Cisco found reviewers catch 60 to 90 percent of defects, at roughly a tenth of what the same bug costs once it reaches production.&lt;/p&gt;

&lt;p&gt;Buried in the same research sits a finding almost nobody quotes. Detection collapses once a single sitting passes about 400 changed lines. Past that point you are scrolling.&lt;/p&gt;

&lt;p&gt;Microsoft's internal studies found 20 to 30 percent fewer production defects in reviewed code.&lt;/p&gt;

&lt;p&gt;And CodeRabbit measured AI-generated PRs at roughly 1.7 times the issue rate of human ones.&lt;/p&gt;

&lt;p&gt;Put those together. More defects per line, arriving faster than ever, into a review practice that was already saturated at human writing speed.&lt;/p&gt;

&lt;p&gt;Here is my opinion, stated plainly.&lt;/p&gt;

&lt;p&gt;Code production stopped being the bottleneck. Review capacity is the scarce resource now, and most teams still plan as if typing speed is what limits them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed after Tuesday
&lt;/h2&gt;

&lt;p&gt;I stopped trusting my own discipline and made the sequence mechanical.&lt;/p&gt;

&lt;p&gt;In my repos, a merge command now refuses to run unless a review verdict was recorded on the pull request itself. On the PR, as a comment the next reader will find in two years, rather than in my head or a chat log.&lt;/p&gt;

&lt;p&gt;An approval on a large diff refuses to arm the merge unless the verdict says how the review was actually done, in passes, section by section. A single-pass approve on a thousand-line diff is a signature, whoever signs it.&lt;/p&gt;

&lt;p&gt;And every merge runs in one shape. Squashed, with the branch deleted behind it, so history stays honest and nothing is left to rot.&lt;/p&gt;

&lt;p&gt;One thing surprised me. This gate exists for me as much as for the agent.&lt;/p&gt;

&lt;p&gt;My agent was never the problem. My repos had a merge path with no review step in it, and the agent found that path by doing what I asked, quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a gate cannot do
&lt;/h2&gt;

&lt;p&gt;Honesty requires this section.&lt;/p&gt;

&lt;p&gt;A gate cannot make a lazy review a good one. I can still skim a diff and type a verdict that claims more than I checked.&lt;/p&gt;

&lt;p&gt;What it can do is make silence impossible. No path remains where code lands on my default branch without a recorded human judgment.&lt;/p&gt;

&lt;p&gt;That turns out to be most of the battle. My failure mode was never "I reviewed badly". It was "I did not review and nothing noticed".&lt;/p&gt;

&lt;p&gt;If you lead a team, whether people use AI to write code stopped being an interesting question. They do, and they should.&lt;/p&gt;

&lt;p&gt;Where, precisely, does a human judgment get recorded before that code reaches your default branch? Answer that one.&lt;/p&gt;

&lt;p&gt;If your answer is "the approve button", read the 400-line finding again and then look at the size of the last PR you approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Who reviews the machine's work on your team, and where does that review actually live?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>codereview</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Two AI models that attack each other beat one that agrees with itself</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Wed, 22 Jul 2026 05:38:01 +0000</pubDate>
      <link>https://dev.to/mjmirza/two-ai-models-that-attack-each-other-beat-one-that-agrees-with-itself-4hk2</link>
      <guid>https://dev.to/mjmirza/two-ai-models-that-attack-each-other-beat-one-that-agrees-with-itself-4hk2</guid>
      <description>&lt;h1&gt;
  
  
  Two AI models that attack each other beat one that agrees with itself
&lt;/h1&gt;

&lt;p&gt;Four times I asked the same question.&lt;/p&gt;

&lt;p&gt;Four times I got a confident answer. All four were wrong.&lt;/p&gt;

&lt;p&gt;Not vague. Not hedged. Each one arrived with the tone of something settled, and each one was produced the same way, by the same reasoning, looking in the same place.&lt;/p&gt;

&lt;p&gt;We solved this exact problem in software a long time ago. Code review exists because one pair of eyes misses things. A pull request exists so somebody who did not write the change is the one who reads it.&lt;/p&gt;

&lt;p&gt;Then we started asking a machine to check its own work, and quietly dropped the entire principle.&lt;/p&gt;

&lt;p&gt;You have probably done what I did next. Reworded the question. Started a fresh session. Turned the thinking effort up. Asked it to double check itself.&lt;/p&gt;

&lt;p&gt;None of that helps, and I took an embarrassingly long time to understand why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it twice is one eye used twice
&lt;/h2&gt;

&lt;p&gt;When your model answers the same way twice, that feels like corroboration. Nothing about it is.&lt;/p&gt;

&lt;p&gt;You are watching the same failure arrive a second time, wearing the confidence of agreement.&lt;/p&gt;

&lt;p&gt;A model has a shape to how it searches, what it treats as evidence, what it forgets to check. Run it again and you get that same shape back. If the blind spot caused the first wrong answer, the blind spot causes the second one, and now two answers match and you believe them more.&lt;/p&gt;

&lt;p&gt;Four attempts sharing one blind spot is one eye used four times.&lt;/p&gt;

&lt;p&gt;So the fix had nothing to do with better questions. What I needed was a different pair of eyes, from a model trained differently, failing differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two tools that had never spoken to each other
&lt;/h2&gt;

&lt;p&gt;I already had both installed. Most of us do in 2026.&lt;/p&gt;

&lt;p&gt;They sat on the same machine for months, doing separate work, never once checking each other. Two capable colleagues in the same building who had never been introduced.&lt;/p&gt;

&lt;p&gt;So I introduced them, and set one rule that changed everything about how useful this is.&lt;/p&gt;

&lt;p&gt;Ask the other model to refute. Never to review.&lt;/p&gt;

&lt;p&gt;That distinction sounds small and carries the whole thing. A reviewer looks for agreement, and models are agreeable by construction. Ask one to review and you get "this looks solid, here are two small suggestions". Ask one to find where the reasoning breaks, and to default to broken when uncertain, and you get something you can actually use.&lt;/p&gt;

&lt;p&gt;First time I ran it properly, the answer came back in a single line and took apart something I had been quietly proud of for a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it fire without me
&lt;/h2&gt;

&lt;p&gt;Here is the awkward truth about self-checking. The moment you most need a second opinion is exactly the moment you are least likely to ask for one, because you are confident.&lt;/p&gt;

&lt;p&gt;I was never going to remember to invoke this while being wrong. Nobody is.&lt;/p&gt;

&lt;p&gt;So the trigger runs on my frustration instead of my judgement.&lt;/p&gt;

&lt;p&gt;When I am irritated, or repeating myself, or typing the same complaint in capital letters, that pattern is a reliable tell that the machine is confidently off and I have noticed before it has. Those moments now demand a cross-model check before any further answer. Two of them in one session and the check stops being optional.&lt;/p&gt;

&lt;p&gt;I want to be honest that this catches the problem late. The trigger fires after the damage, never before it. Anyone selling you frustration detection as prevention is selling you something. The loop shortens from four wrong answers down to one, which is worth having, and the first wrong answer still lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a naive second opinion worthless
&lt;/h2&gt;

&lt;p&gt;Here is the part I would have missed entirely, found only because I turned the method on itself.&lt;/p&gt;

&lt;p&gt;I described the setup to the rival model and asked it to attack the design. That attack found something real.&lt;/p&gt;

&lt;p&gt;When the first model writes the summary that the second model reviews, the first model launders its own error. The summary frames the problem defensively. Out goes the exact output that broke. In comes a slightly softer question, one the first model is more comfortable answering. You get agreement, and the agreement is worthless, because the real question was never asked.&lt;/p&gt;

&lt;p&gt;So the handoff carries the unedited original. The exact broken output, word for word. The exact correction, word for word. What correct would concretely look like. No summaries anywhere in that chain.&lt;/p&gt;

&lt;p&gt;That single change separates a second opinion from a rubber stamp, and I would not have found it without asking the tool to attack the thing that consults the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What nine rounds actually looked like
&lt;/h2&gt;

&lt;p&gt;One day. Nine cross-model consultations. Seven of them ended with me being corrected.&lt;/p&gt;

&lt;p&gt;Seven. On my own work, in my own domain, where I was confident enough to have shipped without asking.&lt;/p&gt;

&lt;p&gt;Three of the things it caught.&lt;/p&gt;

&lt;p&gt;I proposed a guard that would inspect written code for a layout problem. Reading source text cannot compute what a screen actually renders, so the guard would fire on healthy code, miss real breakage, and get switched off inside a week. Correct on every count. I rebuilt it to check something a machine can genuinely verify.&lt;/p&gt;

&lt;p&gt;I proposed measuring a screenshot to find a display bug. Its answer pointed out that the thing being measured already knows its own dimensions exactly, so inferring them from pixels throws away precision I already had. Correct again.&lt;/p&gt;

&lt;p&gt;And when I asked it to attack the consultation system itself, it opened with "it mostly fails" and then explained why, accurately, on two of four counts.&lt;/p&gt;

&lt;p&gt;A tool willing to tell you your idea mostly fails is worth more than one telling you it looks solid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrections that repeat become permanent
&lt;/h2&gt;

&lt;p&gt;Every round gets logged. Agreed, disagreed, corrected.&lt;/p&gt;

&lt;p&gt;The log has one purpose. A pattern needs enough rounds before its shape becomes visible.&lt;/p&gt;

&lt;p&gt;When the other model corrects me twice on the same class of thing, bad luck stops being the explanation. That is a blind spot with a shape, and it graduates into a permanent check that runs whether or not I remember to ask.&lt;/p&gt;

&lt;p&gt;There is the compounding part. One correction fixes one mistake. A correction that repeats builds something catching the next twenty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is honestly worth
&lt;/h2&gt;

&lt;p&gt;This will not stop you being wrong. Nothing does.&lt;/p&gt;

&lt;p&gt;What it shortens is how long you stay wrong, and it makes the expensive kind of wrong, the confident kind that ships to a client, much rarer.&lt;/p&gt;

&lt;p&gt;The cost is a habit and a little humility. You have to be willing to hear a rival tool say no about work you were proud of, then agree with it out loud rather than quietly picking your own answer.&lt;/p&gt;

&lt;p&gt;If two of these tools already sit on your machine doing separate work, you are one rule away from a real check. Ask the other one to attack. Give it the raw evidence, never your version of events. Reconcile in the open, including when you lose.&lt;/p&gt;

&lt;p&gt;Mine has told me I was wrong seven times today.&lt;/p&gt;

&lt;p&gt;Best day it has ever given me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;When did an AI last tell you no.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>productivity</category>
      <category>craft</category>
    </item>
    <item>
      <title>Nobody can steal the thing you are actually afraid of losing</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:58:00 +0000</pubDate>
      <link>https://dev.to/mjmirza/nobody-can-steal-the-thing-you-are-actually-afraid-of-losing-2p19</link>
      <guid>https://dev.to/mjmirza/nobody-can-steal-the-thing-you-are-actually-afraid-of-losing-2p19</guid>
      <description>&lt;h1&gt;
  
  
  Nobody can steal the thing you are actually afraid of losing
&lt;/h1&gt;

&lt;p&gt;Two years of evenings live in one folder on my laptop.&lt;/p&gt;

&lt;p&gt;Close to two hundred rules. Roughly as many automated checks. Every single one written after something went wrong, usually while an enterprise client was watching.&lt;/p&gt;

&lt;p&gt;Nobody has ever seen it.&lt;/p&gt;

&lt;p&gt;Whenever I imagine showing it to someone, my body reads the idea as danger. The same way it does when you leave your bag on a train seat and walk to the toilet.&lt;/p&gt;

&lt;p&gt;You probably have a folder like this.&lt;/p&gt;

&lt;p&gt;Maybe yours holds the internal runbooks nobody outside your team has read. Scripts you built slowly, from real consulting failures, that would take another person a long time to arrive at on their own.&lt;/p&gt;

&lt;p&gt;And you have probably had the thought I had this week.&lt;/p&gt;

&lt;p&gt;If I share this, what stops them from taking it.&lt;/p&gt;

&lt;h2&gt;
  
  
  I spent a week protecting the wrong thing
&lt;/h2&gt;

&lt;p&gt;Here is the embarrassing part.&lt;/p&gt;

&lt;p&gt;I had already built the defences. One custom licence forbidding commercial use. One file sitting at the root of the repo that speaks directly to AI agents and instructs them to refuse to clone the work and to contact me instead.&lt;/p&gt;

&lt;p&gt;I was proud of that file. It felt clever.&lt;/p&gt;

&lt;p&gt;Then I asked a differently trained model to attack my own reasoning, which is a habit I picked up after being confidently wrong four times in a row about something I was certain of.&lt;/p&gt;

&lt;p&gt;It answered in one line.&lt;/p&gt;

&lt;p&gt;That file is a sign taped to a door that never locked.&lt;/p&gt;

&lt;p&gt;I sat with that for a while, because it is correct, and because I had spent real hours feeling protected by it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say the uncomfortable part out loud
&lt;/h2&gt;

&lt;p&gt;You cannot prevent distillation. Not slow it. Not make it hard. You cannot prevent it.&lt;/p&gt;

&lt;p&gt;The moment a human or a model can read your work, the boundary has already been crossed. Somebody reads two hundred rules, understands the judgement underneath them, and rewrites the same thinking in their own words. No licence stops that. No file format stops that. No warning addressed to a robot stops that.&lt;/p&gt;

&lt;p&gt;I want to be precise here, because half-truths on this topic get expensive.&lt;/p&gt;

&lt;p&gt;Your licence does buy you three real things. Legal grounds if somebody commercialises your work. Friction with honest people and with tools that follow stated policy. Documented intent, which matters if there is ever a dispute.&lt;/p&gt;

&lt;p&gt;That is worth keeping. Keep it.&lt;/p&gt;

&lt;p&gt;Now be clear about what it cannot touch. Somebody who reads your work and rebuilds the ideas in their own language. Any local model that ignores your instructions entirely. Screenshots. Copy and paste. Embeddings. The client who absorbs your judgement over six months and then hires somebody cheaper to reproduce it.&lt;/p&gt;

&lt;p&gt;That last one is the one that actually happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Move the boundary instead of reinforcing the wall
&lt;/h2&gt;

&lt;p&gt;If prevention is impossible, the goal becomes placement.&lt;/p&gt;

&lt;p&gt;Almost everyone makes the same mistake, myself included until this week. We treat a knowledge artifact like a software binary. We assume a licence plus a warning protects the value. Once the value is readable, the protection has already failed.&lt;/p&gt;

&lt;p&gt;So the boundary has to sit somewhere else. Around access, around execution, around updates, around the relationship. Never around files that somebody can open and read.&lt;/p&gt;

&lt;p&gt;In practice that means sharing the running of the thing rather than the contents of the thing.&lt;/p&gt;

&lt;p&gt;Somebody sends a task, they get an output. They never receive the two hundred rules. Your source stays private. What reaches them is the minimum they need to get a result, and what you licence is the usage.&lt;/p&gt;

&lt;p&gt;Every serious tooling business already works this way. What surprised me was how long I resisted applying it to my own work, because my instinct said the files were the asset, and my instinct was wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a copy cannot capture
&lt;/h2&gt;

&lt;p&gt;Here is what changed my mind completely.&lt;/p&gt;

&lt;p&gt;Snapshots can be distilled. Living systems cannot.&lt;/p&gt;

&lt;p&gt;Today alone, that folder gained three new enforcement systems. Every one of them exists because something broke in front of a real person. One client received an email from me that arrived as unreadable markup, in the middle of a competitive bid against another vendor. One layout looked correct on my own watch and would have clipped on half the models people actually wear. Each failure wrote a permanent rule.&lt;/p&gt;

&lt;p&gt;Then the part I did not expect. I asked a rival model to attack all three designs before shipping them. It corrected me seven times in one day. Seven. On my own work, in my own domain, where I was confident.&lt;/p&gt;

&lt;p&gt;Anyone who copies that folder today owns a photograph of a moving thing.&lt;/p&gt;

&lt;p&gt;Six weeks from now their copy is a fossil, and mine has absorbed six more weeks of real failures, in front of real clients, with real money on the line. That gap lives in whoever keeps running the loop, and no file contains it.&lt;/p&gt;

&lt;p&gt;The honest answer to what is protectable is the rate at which you improve, never the artifact itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guarding it too hard has a cost nobody warns you about
&lt;/h2&gt;

&lt;p&gt;I need to say the other half, because it is my own weakness and it may be yours.&lt;/p&gt;

&lt;p&gt;For years I did excellent private work and shipped almost nothing in public. It felt productive. It was invisible. Nobody hires the person whose best work nobody has ever seen.&lt;/p&gt;

&lt;p&gt;Four separate organisations chose me as an ambassador for their tools. That happened because of things I put out, never because of the folder I hid. Every euro I have earned came from something visible.&lt;/p&gt;

&lt;p&gt;So the fear of being copied and the fear of being judged wear the same coat, and I have spent years mistaking one for the other. If you are guarding a system that has never earned you anything, you are avoiding exposure and calling it strategy.&lt;/p&gt;

&lt;p&gt;The split that resolves it is easy to say and hard to do.&lt;/p&gt;

&lt;p&gt;Publish the pattern. Never publish the machine.&lt;/p&gt;

&lt;p&gt;Write about the failure and the shape of the fix, in enough detail that a reader genuinely understands the problem and roughly what to do about it. Leave out the wiring that makes executing it clean. If somebody can read your article and ship your exact solution by pasting, you gave away the machine. If they finish it able to see the problem clearly for the first time, you gave away the pattern, and that is what brings people back to you.&lt;/p&gt;

&lt;p&gt;I have been on the wrong side of that line in both directions. Too closed for years, then briefly too open once.&lt;/p&gt;

&lt;p&gt;The folder is still private. The licence is still there, doing the small honest job it can actually do. What changed is that I stopped believing it was a wall, and started treating the next six weeks of failures as the part worth having.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What are you sitting on that nobody has seen yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
      <category>consulting</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I overrode my own safety rules 38 times in one session</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Mon, 20 Jul 2026 16:54:43 +0000</pubDate>
      <link>https://dev.to/mjmirza/i-overrode-my-own-safety-rules-38-times-in-one-session-1eac</link>
      <guid>https://dev.to/mjmirza/i-overrode-my-own-safety-rules-38-times-in-one-session-1eac</guid>
      <description>&lt;p&gt;Past one in the morning, I typed an environment variable in front of a command to make a check stop talking to me.&lt;/p&gt;

&lt;p&gt;I had written that check.&lt;/p&gt;

&lt;p&gt;I had been proud of it.&lt;/p&gt;

&lt;p&gt;Sixteen years in, four vendor titles, enterprise work behind me, and there I was at one in the morning going around my own safety rail so I could finish before I fell asleep.&lt;/p&gt;

&lt;p&gt;Then a report came up at the end of the session with a line in it I have not stopped thinking about.&lt;/p&gt;

&lt;p&gt;Guard blocks hit, sixteen.&lt;/p&gt;

&lt;p&gt;Guard overrides used, thirty eight.&lt;/p&gt;

&lt;p&gt;I had gone around my own rules more than twice as often as they had stopped me.&lt;/p&gt;

&lt;h2&gt;
  
  
  You already know which one it is
&lt;/h2&gt;

&lt;p&gt;Before I go further, think of yours.&lt;/p&gt;

&lt;p&gt;Every engineer reading this has one.&lt;/p&gt;

&lt;p&gt;That lint rule your team disables at the top of three files.&lt;/p&gt;

&lt;p&gt;A pre-commit hook somebody taught the whole team to skip on Fridays.&lt;/p&gt;

&lt;p&gt;An approval step that exists on paper and happens as a message in a channel instead.&lt;/p&gt;

&lt;p&gt;You did not have to look it up. You knew before you finished the sentence.&lt;/p&gt;

&lt;p&gt;That instant recognition is the whole point here.&lt;/p&gt;

&lt;p&gt;We can all name the process we walk around. Almost none of us count it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built so many rails
&lt;/h2&gt;

&lt;p&gt;I am not a careless engineer. Opposite problem, and that is exactly the issue.&lt;/p&gt;

&lt;p&gt;Every one of those rules exists because something once went wrong and I decided it would never go wrong again.&lt;/p&gt;

&lt;p&gt;A check that stops stale documentation from shipping, because I once shipped documentation that lied.&lt;/p&gt;

&lt;p&gt;A gate that refuses a push while a queue of follow-up work sits open, because I once left one open for two months.&lt;/p&gt;

&lt;p&gt;A deletion guard, because losing work you cannot get back is the mistake with no undo.&lt;/p&gt;

&lt;p&gt;Each one was a reasonable answer to a real scar.&lt;/p&gt;

&lt;p&gt;Each one, alone, made sense.&lt;/p&gt;

&lt;p&gt;Nobody sits down and designs a system that annoys them. You arrive at it one sensible decision at a time, and every step of that walk feels like diligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rent, not protection
&lt;/h2&gt;

&lt;p&gt;Here is my opinion, held harder than anything else I learned this year.&lt;/p&gt;

&lt;p&gt;A rule you routinely override charges you rent.&lt;/p&gt;

&lt;p&gt;You pay in attention every time it fires. You pay again in the half second where you read it, judge it, and dismiss it. Most of all you pay in the habit it teaches, which is that a warning on your screen is noise to clear rather than information to read.&lt;/p&gt;

&lt;p&gt;That last cost is the expensive one.&lt;/p&gt;

&lt;p&gt;Because on the day a real warning appears, you have trained yourself for months to make it go away.&lt;/p&gt;

&lt;p&gt;Some of my sixteen genuine blocks were things I needed to hear. I know, because I read those and fixed the underlying problem instead of overriding.&lt;/p&gt;

&lt;p&gt;But sixteen useful signals sat in a stream with thirty eight I dismissed, and at speed I could not tell them apart.&lt;/p&gt;

&lt;p&gt;I built a smoke alarm that goes off when I make toast, then acted surprised that I stopped trusting smoke alarms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually made me faster
&lt;/h2&gt;

&lt;p&gt;So, an answer to the question that sent me down this road. Somebody asked it on Reddit this week, and I have been quietly answering it wrong for years.&lt;/p&gt;

&lt;p&gt;What habit made you more efficient as a senior engineer.&lt;/p&gt;

&lt;p&gt;Not a tool. Not a shortcut. Not a better morning routine.&lt;/p&gt;

&lt;p&gt;Counting my own bypasses.&lt;/p&gt;

&lt;p&gt;Once a month I look at what I actually overrode rather than what I intended to follow, and I sort that list into three piles.&lt;/p&gt;

&lt;p&gt;Right rule, lazy me. Fix the human.&lt;/p&gt;

&lt;p&gt;Right rule, wrong moment. Move it, do not delete it.&lt;/p&gt;

&lt;p&gt;Scar from a problem I no longer have. Retire it, and say so out loud.&lt;/p&gt;

&lt;p&gt;Third pile is the one nobody opens, and it holds most of the weight.&lt;/p&gt;

&lt;p&gt;Process accumulates because deleting a safety rail feels reckless in a way that adding one never does. Adding feels responsible. Removing feels like tempting fate.&lt;/p&gt;

&lt;p&gt;So the pile grows in one direction, forever, until you are at one in the morning writing an override in front of your own work.&lt;/p&gt;

&lt;h2&gt;
  
  
  One detail that stung
&lt;/h2&gt;

&lt;p&gt;This changed how I read every number I produce.&lt;/p&gt;

&lt;p&gt;My first count of those blocks was wrong. Badly wrong.&lt;/p&gt;

&lt;p&gt;It came from searching for a word in a log, and most of what it matched turned out to be my own writing rather than the system's. A typed record, one that could not be confused with prose, gave the real number.&lt;/p&gt;

&lt;p&gt;I had been about to build a conclusion on a figure that was mostly an echo of myself.&lt;/p&gt;

&lt;p&gt;Which, said plainly, is the same failure as the overrides.&lt;/p&gt;

&lt;p&gt;Both are what happens when you stop checking whether the thing you set up still tells you the truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is the one rule at your company that everybody bypasses and nobody will delete.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>devops</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I spent a day proving my own idea wrong and it saved me a year</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Sun, 19 Jul 2026 21:03:51 +0000</pubDate>
      <link>https://dev.to/mjmirza/i-spent-a-day-proving-my-own-idea-wrong-and-it-saved-me-a-year-1o65</link>
      <guid>https://dev.to/mjmirza/i-spent-a-day-proving-my-own-idea-wrong-and-it-saved-me-a-year-1o65</guid>
      <description>&lt;p&gt;Sunday morning. Coffee going cold.&lt;/p&gt;

&lt;p&gt;The whole thing was already drawn out in my head.&lt;/p&gt;

&lt;p&gt;A platform where you upload once and it goes everywhere. One button. No friction. The upload pipeline, the queue, the retry logic, the little green checkmarks lighting up one by one as each destination confirmed.&lt;/p&gt;

&lt;p&gt;Not a line of it written.&lt;/p&gt;

&lt;p&gt;Nor had anyone checked whether the problem existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  You have done this
&lt;/h2&gt;

&lt;p&gt;Be honest.&lt;/p&gt;

&lt;p&gt;You have opened an editor and started building before you finished asking whether the thing needed building.&lt;/p&gt;

&lt;p&gt;Excitement is when it happens most. Excitement feels like clarity. Wrong. It is momentum without a direction check, and it is the most expensive feeling in this job.&lt;/p&gt;

&lt;p&gt;So before building anything, a Sunday went into the boring version. Reading the actual specifications. Pulling the actual documentation. Checking what every platform does rather than what I assumed it does.&lt;/p&gt;

&lt;p&gt;The day cost me a Sunday.&lt;/p&gt;

&lt;p&gt;It saved me something closer to a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the research said first
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;You cannot have the thing you described. Two of the destinations require the end user's own account credentials. No amount of engineering removes that. It is a legal boundary, not a technical one.&lt;/p&gt;

&lt;p&gt;That stung for about ten minutes.&lt;/p&gt;

&lt;p&gt;Then the research said something far more useful, and this is the part worth taking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimising a phase that was already free
&lt;/h2&gt;

&lt;p&gt;The whole category does not work the way I assumed.&lt;/p&gt;

&lt;p&gt;Push was the mental model. My system sends the file out to every destination, every time, forever. That model produces a queue, a retry system, a status dashboard, and about three months of work.&lt;/p&gt;

&lt;p&gt;It is pull.&lt;/p&gt;

&lt;p&gt;Every destination polls on its own schedule. After a one-time connection, every future upload propagates with zero calls from me and zero action from the user. Forever.&lt;/p&gt;

&lt;p&gt;So the thing I was going to spend three months automating was already automatic. It had been automatic for twenty five years.&lt;/p&gt;

&lt;p&gt;The hard part, the only part worth building, was the one-time setup. The part mentally filed as trivial onboarding.&lt;/p&gt;

&lt;p&gt;The entire difficulty gradient of my own idea was backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong twice in one afternoon
&lt;/h2&gt;

&lt;p&gt;Two things stated with total confidence turned out to be false. The confidence is the interesting part, not the errors.&lt;/p&gt;

&lt;p&gt;First. One major platform had supposedly removed a whole ingestion route. Their own documentation says it works and has never stopped working. That belief came from somewhere, was never verified, and got repeated as fact.&lt;/p&gt;

&lt;p&gt;Second. Another platform supposedly had a partner interface for the main content type. It has one for a different content type entirely. That distinction changes the whole integration plan.&lt;/p&gt;

&lt;p&gt;Neither was flagged as a guess. Both would have been architected around.&lt;/p&gt;

&lt;p&gt;The error itself is survivable. Conviction that skipped the check is what costs you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three numbers that reframed it
&lt;/h2&gt;

&lt;p&gt;Three figures did more for my thinking than the previous week of daydreaming.&lt;/p&gt;

&lt;p&gt;The open protocol underneath this whole category has existed since 1999 and has carried this content type since 2001. Nobody owns it. Three separate platform giants have tried to own it and failed. Twenty five years of surviving exactly the companies I was worried about competing with.&lt;/p&gt;

&lt;p&gt;Roughly four hundred and eighty five machine-generated feeds now appear every single day in this space. More new machine-made shows than human ones. That is a cost problem for anyone hosting and a discovery problem for everyone else.&lt;/p&gt;

&lt;p&gt;A component I had assumed would be an expensive licensing conversation turned out to be dual-licensed open source. Zero to build. The cost sits somewhere else entirely, somewhere I had not thought to look.&lt;/p&gt;

&lt;p&gt;None of that came from thinking harder. All of it came from reading primary sources for one day.&lt;/p&gt;

&lt;h2&gt;
  
  
  My actual opinion
&lt;/h2&gt;

&lt;p&gt;Research IS building. Same category, different output, higher return per hour than anything else you will do on a new idea.&lt;/p&gt;

&lt;p&gt;Most of us skip it because it feels like procrastination, and because there is a real risk attached.&lt;/p&gt;

&lt;p&gt;The risk is that it kills your idea.&lt;/p&gt;

&lt;p&gt;Mine survived. My reasoning did not. The version that would have shipped in three months was technically competent and aimed at a problem that solved itself in 2001.&lt;/p&gt;

&lt;p&gt;That would have come from users instead. Slowly. Expensively. After launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed recently
&lt;/h2&gt;

&lt;p&gt;Ten years ago a proper day of this meant sitting with a stack of specifications and hoping you were reading the current version.&lt;/p&gt;

&lt;p&gt;Now twelve primary sources come in an afternoon, my own notes contradict me twice, and the correction lands before anything is committed.&lt;/p&gt;

&lt;p&gt;That is the honest answer to whether this era has pushed me further into personal projects.&lt;/p&gt;

&lt;p&gt;It has. Not because building got faster.&lt;/p&gt;

&lt;p&gt;Because being wrong got cheap.&lt;/p&gt;

&lt;p&gt;Testing a bad idea used to cost months. It now costs roughly a Sunday.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is one idea you would test if being wrong only cost you a day?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>discuss</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>I was hired before I could speak German, and that CV would be filtered out today</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Sun, 19 Jul 2026 07:21:58 +0000</pubDate>
      <link>https://dev.to/mjmirza/i-was-hired-before-i-could-speak-german-and-that-cv-would-be-filtered-out-today-lah</link>
      <guid>https://dev.to/mjmirza/i-was-hired-before-i-could-speak-german-and-that-cv-would-be-filtered-out-today-lah</guid>
      <description>&lt;p&gt;My German was good enough to order bread.&lt;br&gt;
It was not good enough to defend an idea.&lt;/p&gt;

&lt;p&gt;There is a room in Germany I still think about, an interview I had no business sitting in.&lt;/p&gt;

&lt;p&gt;No local network, and an accent that made every sentence take longer than it needed to.&lt;/p&gt;

&lt;p&gt;Everything on paper said no.&lt;/p&gt;

&lt;p&gt;Somebody in that room said yes anyway.&lt;/p&gt;

&lt;p&gt;Sixteen years of building software have happened since. Four ambassador titles, earned honestly. None of it exists if one person had not looked past a file that told them not to bother.&lt;/p&gt;

&lt;p&gt;Before you read another line, do one thing for me.&lt;/p&gt;

&lt;p&gt;Think of the person who said yes to you before you had earned it.&lt;/p&gt;

&lt;p&gt;You have one. Almost everybody does. A manager who ignored the years-of-experience line. A lead who took your strange side project seriously. Someone who let you into a room you were not qualified for.&lt;/p&gt;

&lt;p&gt;Now look at the last five people your team passed on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I read this week
&lt;/h2&gt;

&lt;p&gt;A thread is going around from experienced developers, and the title does all the work.&lt;/p&gt;

&lt;p&gt;Juniors are valuable, and not hiring them is a mistake.&lt;/p&gt;

&lt;p&gt;Underneath it, hundreds of people describing the same market. Five years of experience and nobody calls back. One big company on the CV and that is somehow held against you. Early-career developers sending applications into a silence so complete it feels personal.&lt;/p&gt;

&lt;p&gt;On the other side, teams that would swear they are hiring, quietly filtering out everyone who does not arrive fully formed.&lt;/p&gt;

&lt;p&gt;Both rooms are familiar to me. I have been in each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody hires you for what you already know
&lt;/h2&gt;

&lt;p&gt;Here is the plain opinion. Argue with it.&lt;/p&gt;

&lt;p&gt;A team refusing to hire juniors is borrowing speed from next year and calling it discipline.&lt;/p&gt;

&lt;p&gt;The reasoning always sounds responsible. We are lean. We have no time to teach. We need someone who ships on day one. Every one of those sentences is true in the moment it is said. That is what makes them so easy to keep saying, quarter after quarter, until the team is five senior people who all already agree with each other.&lt;/p&gt;

&lt;p&gt;Watch what happens to that team.&lt;/p&gt;

&lt;p&gt;Nobody asks why anymore. Everybody knows why. The reason a thing works the way it works stopped being a question years ago, and now it is furniture. A config nobody touches. A service nobody opens. A rule everybody follows without being able to say where it came from.&lt;/p&gt;

&lt;p&gt;The person who breaks that open is the person who does not know yet.&lt;/p&gt;

&lt;p&gt;When I arrived, my German was too poor to be polite. So the questions came out directly, in the clumsiest possible shape, because the softer version of the sentence was beyond my vocabulary. Why does this run twice. Who owns this. What happens when it fails at night.&lt;/p&gt;

&lt;p&gt;Half the time the answer was obvious and I looked like a fool.&lt;/p&gt;

&lt;p&gt;Half the time nobody in the room knew.&lt;/p&gt;

&lt;p&gt;That second half is what a junior gives you, and there is no way to buy it from someone senior. Seniority is partly the ability to stop noticing. A real skill. Also how a codebase quietly rots while everyone competent nods at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost the person who hired me
&lt;/h2&gt;

&lt;p&gt;Nothing on their scorecard went up that quarter.&lt;/p&gt;

&lt;p&gt;They took on someone who needed correcting. Someone whose written German had to be read twice. Someone who would take longer to do a thing they could have finished themselves in an afternoon.&lt;/p&gt;

&lt;p&gt;They did it anyway.&lt;/p&gt;

&lt;p&gt;Kindness was probably not the reason. My guess is they were doing arithmetic over years while everyone around them did arithmetic over months.&lt;/p&gt;

&lt;p&gt;That is the whole disagreement, and it never sounds like one. It sounds like a person saying we need someone who can ship immediately, and another person saying yes, and also we need to be a team that still knows how to teach in three years.&lt;/p&gt;

&lt;p&gt;Only one of those two shows up in this quarter's numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready was never real
&lt;/h2&gt;

&lt;p&gt;Here is the part nobody puts in the conference talk.&lt;/p&gt;

&lt;p&gt;Sixteen years in, with the titles and the enterprise work and the clients, things still sit unpublished on my desk. The waiting-to-feel-ready reflex never left. Ready has not once arrived, not at year one, not at year sixteen. The only thing that changed is that moving without it got easier.&lt;/p&gt;

&lt;p&gt;Which means the version of me who got hired, the one with the unfinished degree and the borrowed vocabulary, was never less ready than the version writing this.&lt;/p&gt;

&lt;p&gt;He was less experienced. A different word, and hiring keeps confusing the two.&lt;/p&gt;

&lt;p&gt;If applications are going into silence for you right now, nobody should pretend that is fair, because it is not. But the file is not you. It was not me either. Someone eventually read past mine, and sixteen years have gone into being worth that.&lt;/p&gt;

&lt;p&gt;And if you are the person deciding, you are allowed to be the one who says yes early. It will cost you a quarter. It might make you a team that still knows how to think in five years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Who said yes to you before you had earned it, and what did it cost them?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>beginners</category>
      <category>community</category>
    </item>
    <item>
      <title>I named the same side project nine times before I wrote any of it down</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Fri, 17 Jul 2026 15:12:42 +0000</pubDate>
      <link>https://dev.to/mjmirza/i-named-the-same-side-project-nine-times-before-i-wrote-any-of-it-down-gm7</link>
      <guid>https://dev.to/mjmirza/i-named-the-same-side-project-nine-times-before-i-wrote-any-of-it-down-gm7</guid>
      <description>&lt;p&gt;Sunday night, three weeks ago.&lt;/p&gt;

&lt;p&gt;I opened a folder called for instance &lt;code&gt;amzapp&lt;/code&gt; looking for a developer secret I was sure I had saved somewhere. Six other folders turned up instead. &lt;code&gt;larify&lt;/code&gt;. &lt;code&gt;arify&lt;/code&gt;. &lt;code&gt;amz&lt;/code&gt;. &lt;code&gt;Amzs&lt;/code&gt;. &lt;code&gt;skayel360&lt;/code&gt;. &lt;code&gt;brevlin&lt;/code&gt;. Every one of them held a piece of the same side project. An Amazon seller profit tracker I had been building on and off for months.&lt;/p&gt;

&lt;p&gt;None of them held the whole picture.&lt;/p&gt;

&lt;p&gt;If you keep a side project alive between real work, you already know this feeling. You open it up after a gap, and the first hour goes to onboarding yourself back into it instead of building. Which folder is current. Which key still works. What you tried last time and why it failed.&lt;/p&gt;

&lt;p&gt;I spent that hour again, then finally did the thing I should have done the first time. I stopped trying to remember and wrote it all down in one place instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The confusion was never the API
&lt;/h2&gt;

&lt;p&gt;Amazon's Selling Partner API has real sharp edges. Four logins that look identical but grant completely different access. Two credential types that sound interchangeable and are not. Three separate approval processes hiding behind what looks like one login.&lt;/p&gt;

&lt;p&gt;None of that explains months of stalling.&lt;/p&gt;

&lt;p&gt;What explains it is nine names, spread across six folders, and nothing connecting them. Every session started from zero. The blocker was never Amazon. It was that a single place holding the truth never existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four logins, one table
&lt;/h2&gt;

&lt;p&gt;This part is worth stealing even if you never touch Amazon's API. Any platform with a separate developer console and business console has some version of this trap.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Login&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Grants access to seller data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer account&lt;/td&gt;
&lt;td&gt;The app-building console&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selling partner account&lt;/td&gt;
&lt;td&gt;The seller's own console&lt;/td&gt;
&lt;td&gt;Yes, this is where the data lives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary user of that account&lt;/td&gt;
&lt;td&gt;Same console, one specific person&lt;/td&gt;
&lt;td&gt;Yes, only this one can approve your app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The seller's retail login&lt;/td&gt;
&lt;td&gt;The storefront itself&lt;/td&gt;
&lt;td&gt;No, but its cookie can hijack the approval screen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I burned real time on one wrong assumption. Full access in the developer console grants nothing on a seller's actual data. Two systems that share a login page and share nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two credentials, one has a permanent kill switch
&lt;/h2&gt;

&lt;p&gt;The other trap worth writing down. Your app has a client id and secret. Every seller who connects gives you a separate refresh token. You need both to call anything.&lt;/p&gt;

&lt;p&gt;Here is the part that should be printed on every API onboarding page and rarely is. Generating a new refresh token does not invalidate the old one. Amazon says this outright in the console. If a refresh token ever leaks, re-authorizing does nothing at all.&lt;/p&gt;

&lt;p&gt;Rotating the client secret is the only way to kill it. The token exchange cannot happen without one.&lt;/p&gt;

&lt;p&gt;I would not have known that without reading the fine print twice, and I would not have remembered it three weeks later without writing it down where I could find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What fixed the stall
&lt;/h2&gt;

&lt;p&gt;One file. A single page naming every identity, every credential, where each key lives, and which assumption already cost real time.&lt;/p&gt;

&lt;p&gt;Every time something changes, that page changes with it, in the same sitting, never later.&lt;/p&gt;

&lt;p&gt;The API had not gotten any simpler when the stall broke. I had stopped re-discovering the same three facts every time I came back to the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number that made me fix this
&lt;/h2&gt;

&lt;p&gt;Nine names. Six folders. Zero of them cross-referenced. That count came from sitting down and checking, the night the map finally got written.&lt;/p&gt;

&lt;p&gt;A scattered set of folders. A half-remembered decision from two months ago. A key you are pretty sure still works. If your own long-running project has a version of this, the fix here is small, smaller than it probably feels like it should be.&lt;/p&gt;

&lt;p&gt;One page. Updated the moment anything changes. Read before you touch anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;How many names does your oldest side project have right now, and do you know which folder is the real one?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>macOS runs out of application memory because your dead dev servers never die</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Thu, 16 Jul 2026 22:18:04 +0000</pubDate>
      <link>https://dev.to/mjmirza/macos-runs-out-of-application-memory-because-your-dead-dev-servers-never-die-4h3c</link>
      <guid>https://dev.to/mjmirza/macos-runs-out-of-application-memory-because-your-dead-dev-servers-never-die-4h3c</guid>
      <description>&lt;p&gt;It was past midnight and my Mac threw a box I had not seen in years.&lt;/p&gt;

&lt;p&gt;Your system has run out of application memory.&lt;/p&gt;

&lt;p&gt;Force Quit Applications.&lt;/p&gt;

&lt;p&gt;I had four things open. A browser, an editor, a terminal, and a music app that uses about nothing. None of that should fill 36 gigabytes of RAM and then push into swap until the kernel begs you to start closing things.&lt;/p&gt;

&lt;p&gt;You have seen this popup. You closed the browser, you closed the editor, you felt a little betrayed by your own machine, and you got maybe twenty minutes before it came back.&lt;/p&gt;

&lt;p&gt;Here is the part nobody tells you.&lt;/p&gt;

&lt;p&gt;Your memory was not being eaten by the apps you could see. It was being eaten by the ones you could not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev servers you thought you closed are still running
&lt;/h2&gt;

&lt;p&gt;Every time you run a local dev server, you spawn a process. next dev, vite, webpack, an esbuild watcher, a tsc watcher, nodemon, or a plain pnpm start. It listens on a port, it watches your files, it holds memory.&lt;/p&gt;

&lt;p&gt;When you press Ctrl plus C, it dies. Most of the time.&lt;/p&gt;

&lt;p&gt;But close the terminal tab instead of pressing Ctrl plus C, and the signal that would have killed it never arrives cleanly. A wrapper you launched dies and the real worker underneath keeps running. On my machine the actual server runs as a child process, and killing the parent left the child alive, still bound to the port, still holding memory.&lt;/p&gt;

&lt;p&gt;Do that across a week of work. Open a tab, start a server, close the tab, move to the next project. Each one leaves a quiet survivor behind.&lt;/p&gt;

&lt;p&gt;By the time the popup fired, I had three production style servers still running from sessions I had ended days earlier. Each one was small on its own. Together with the file watchers, they were the whole problem.&lt;/p&gt;

&lt;p&gt;Here is what makes local infrastructure rot nasty. It never shows up in a demo. It shows up at midnight on your own machine, and it looks like your Mac is broken when your Mac is fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why closing the terminal is not the same as stopping the server
&lt;/h2&gt;

&lt;p&gt;If you want one line to remember, here it is.&lt;/p&gt;

&lt;p&gt;A dead terminal does not mean a dead server.&lt;/p&gt;

&lt;p&gt;Three common ways this happens.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You close the terminal tab or window instead of stopping the process. A GUI close does not deliver the interrupt the same way Ctrl plus C does, so the server is orphaned rather than killed.&lt;/li&gt;
&lt;li&gt;You start a server through a wrapper like npm start, then Ctrl plus C kills the wrapper shell but leaves the node process it spawned running in the background.&lt;/li&gt;
&lt;li&gt;A tool launches the server as a child of a child. Signalling the top process never reaches the leaf, and the leaf is the one holding the port.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you pay the daily tax. You start the server again and the terminal shouts EADDRINUSE, address already in use. A leftover you forgot about is still sitting on port 3000, and now you cannot even start the thing you actually want.&lt;/p&gt;

&lt;p&gt;So you do what every answer on the internet tells you to do.&lt;/p&gt;

&lt;p&gt;You run killall node.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why kill all node is the worst possible fix
&lt;/h2&gt;

&lt;p&gt;killall node feels great for about one second.&lt;/p&gt;

&lt;p&gt;Then you notice your editor's language server is dead. Your other project's dev server is dead. Your database GUI is dead. And if you run AI tooling with local model context servers, those are gone too, because they are node processes, and killall node does not care which node you meant.&lt;/p&gt;

&lt;p&gt;killall node does not target one thing. It matches by name and stops every match on the entire machine. So does pkill dash f node. So does the classic ps piped into grep piped into xargs kill. They are all the same weapon pointed at your own foot.&lt;/p&gt;

&lt;p&gt;Here is my strongest opinion in this whole piece.&lt;/p&gt;

&lt;p&gt;You should never stop a process by name. Not node, not next, not anything. You stop the exact process by its process id, so nothing else can get caught in the blast.&lt;/p&gt;

&lt;p&gt;People reach for the name based version because finding the one right process id is annoying, and the popup makes you panic. Panic plus a blunt instrument is how you turn a small leftover into a lost afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a safe cleanup actually has to get right
&lt;/h2&gt;

&lt;p&gt;I lost that afternoon. So I stopped hand hunting process ids and built a small system that finds the genuine leftovers and stops only those, and I put it through a hard review before I trusted it to run on its own.&lt;/p&gt;

&lt;p&gt;I am not going to hand you the whole recipe, because the value is in the safety reasoning, not the shell. But here is everything you need to think clearly about it, and to know why the naive version is dangerous.&lt;/p&gt;

&lt;p&gt;A safe reaper has to answer five questions before it stops anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a leftover, or a server I am using right now. An orphaned process on macOS reparents to the system launcher, which also legitimately owns real daemons. A parentless process on its own is not proof of anything. You have to combine it with a dev server signature before you trust it.&lt;/li&gt;
&lt;li&gt;Is it actually a server, or a one shot build. Stopping a running build halfway corrupts the artifact. A real server listens on a port. A build does not. That difference is your safest gate.&lt;/li&gt;
&lt;li&gt;Is anyone using it. A dev server with a browser tab open has live connections. A truly abandoned one has none. Stop the idle one, spare the connected one.&lt;/li&gt;
&lt;li&gt;Is it something the user set up on purpose. A background service someone installed as a launch agent looks identical to an orphan, and stopping it starts a fight where the launcher keeps respawning it and your cleanup keeps stopping it.&lt;/li&gt;
&lt;li&gt;Am I about to hit my own tools. Model context servers, editor language servers, browsers, and the agent itself all have to be excluded by design, not by luck.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only when all of those line up is a process a genuine, safe target.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more trap, measuring the wrong number
&lt;/h2&gt;

&lt;p&gt;Here is a subtle one that cost me real time.&lt;/p&gt;

&lt;p&gt;That out of application memory popup fires on swap and kernel memory pressure, never on how much RAM looks free.&lt;/p&gt;

&lt;p&gt;I measured it live during the incident. My machine reported a comfortable percentage of memory free while swap was ninety six percent full with barely a gigabyte left. Trigger your cleanup on free memory percentage and it will sleep through the exact moment the popup is about to fire, because the number it reads looks fine.&lt;/p&gt;

&lt;p&gt;What matters is the kernel's own memory pressure level and how much swap is actually left. Watch those, not the friendly percentage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made it reliable
&lt;/h2&gt;

&lt;p&gt;A single script version was not enough, because one point of enforcement is one point of failure. My version has layers that each cover the others.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A detection and cleanup core that classifies leftovers and stops them gracefully, by process id, oldest and idlest first.&lt;/li&gt;
&lt;li&gt;A check that runs when a new session starts, surfaces the pileup, and cleans the safe ones.&lt;/li&gt;
&lt;li&gt;A background timer so it also runs when I am not looking, because pileup happens while you sleep.&lt;/li&gt;
&lt;li&gt;A guard that blocks me from ever typing the name based mass kill in the first place and points me at the safe path instead.&lt;/li&gt;
&lt;li&gt;Tests that spawn fake servers and prove the thing stops the leftover and never touches the process next to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Graceful shutdown matters. You send the polite signal first and wait. You only escalate to the hard stop for the stragglers that ignore you. You never lead with the hard stop, because that skips cleanup, can corrupt the terminal, and orphans the very children you were trying to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now the honest part
&lt;/h2&gt;

&lt;p&gt;I got the first version wrong.&lt;/p&gt;

&lt;p&gt;I had it group stopping more aggressively than it should, and in one early test it very nearly signalled my own shell. I had it measuring the wrong memory number. I had a guard that could be sidestepped by a command that merely mentioned the safe tool by name.&lt;/p&gt;

&lt;p&gt;I only caught those because I refused to trust my own code and ran it past a hard, adversarial review from a systems angle and a safety angle before it went live. Its verdict on my first draft was blunt. Not safe to auto run as is. Every one of those holes is closed now, and the fact that they existed is the whole point. This class of tool is easy to write and easy to write dangerously.&lt;/p&gt;

&lt;p&gt;That is the real lesson, bigger than the popup.&lt;/p&gt;

&lt;p&gt;Scary infrastructure is the kind that runs on your behalf and can quietly do the wrong thing. A cleanup that stops your editor is worse than the mess it cleaned. So you build it to be paranoid, you make it prove itself against the exact things it must never touch, and you never let it act on a signal it only half understands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check tonight
&lt;/h2&gt;

&lt;p&gt;Before you close your machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for dev servers you thought you already stopped. Odds are you have a few.&lt;/li&gt;
&lt;li&gt;When you find a stuck one, stop it by its process id, not by its name.&lt;/li&gt;
&lt;li&gt;Never reach for killall node. It is the fix that creates three new problems.&lt;/li&gt;
&lt;li&gt;If you build any automation that stops processes, make it target one id, exclude your own tools by design, and act on real memory pressure, not a comfortable percentage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I run the hardened, reviewed version on my own machine now, and I help teams clean up exactly this kind of invisible infrastructure rot, the stuff that never breaks a demo and quietly eats a Tuesday. If that is a fire you are fighting, the ideas above are enough to start, and safe execution is where it gets interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is still running on your machine right now that you thought you closed hours ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the messy afternoons both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>devops</category>
    </item>
    <item>
      <title>Doing the work was the easy part, hitting Submit was the whole fight</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Thu, 16 Jul 2026 08:44:47 +0000</pubDate>
      <link>https://dev.to/mjmirza/doing-the-work-was-the-easy-part-hitting-submit-was-the-whole-fight-fkc</link>
      <guid>https://dev.to/mjmirza/doing-the-work-was-the-easy-part-hitting-submit-was-the-whole-fight-fkc</guid>
      <description>&lt;p&gt;I do the work in private without a flinch.&lt;/p&gt;

&lt;p&gt;Then a form asks me to claim it, and my whole body locks up.&lt;/p&gt;

&lt;p&gt;Today it was a partner application. Real credentials in every box, 16 years of them. And still, the cursor sat on the Submit button far longer than I want to admit.&lt;/p&gt;

&lt;p&gt;You know this freeze.&lt;/p&gt;

&lt;p&gt;You can grind for weeks on something real, ship it to nobody, and feel fine. Then the moment comes to put your name on it in public, and your hand hovers over the button.&lt;/p&gt;

&lt;p&gt;The work was never the hard part.&lt;/p&gt;

&lt;p&gt;Claiming the work is.&lt;/p&gt;

&lt;p&gt;Here is what the freeze actually is.&lt;/p&gt;

&lt;p&gt;Call it laziness and you would be wrong. Laziness does not sit up polishing a form that is already done.&lt;/p&gt;

&lt;p&gt;Call it a skills gap and you would be wrong too. The skill is right there in the boxes, filled in and true.&lt;/p&gt;

&lt;p&gt;The freeze is fear wearing a productivity costume. It lets you keep polishing, keep tweaking the wording, keep getting it right, because polishing feels like progress while Submit feels like a verdict.&lt;/p&gt;

&lt;p&gt;So you stay in the safe part. The private part. The part where nobody can tell you no.&lt;/p&gt;

&lt;p&gt;A long time went into that safe part for me. Finishing everything quietly. Freezing on everything public.&lt;/p&gt;

&lt;p&gt;Here is what finally moved my cursor.&lt;/p&gt;

&lt;p&gt;The rooms I am scared of have already said yes.&lt;/p&gt;

&lt;p&gt;Four separate organisations made me an ambassador for their tools. Not because I asked nicely, because the work was real. Real companies put me on real projects. A conference put me on a stage.&lt;/p&gt;

&lt;p&gt;Those gatekept doors already opened, more than once.&lt;/p&gt;

&lt;p&gt;So the freeze is a feeling, not a verdict.&lt;/p&gt;

&lt;p&gt;The Submit button is not judging whether the work is good. The work is already good. The button only decides whether anyone gets to see it.&lt;/p&gt;

&lt;p&gt;And a thing nobody sees cannot hire you, pay you, or find you.&lt;/p&gt;

&lt;p&gt;Here is what I did, and what I would tell you to do.&lt;/p&gt;

&lt;p&gt;Shrink the exposed thing until it is almost embarrassingly small.&lt;/p&gt;

&lt;p&gt;Not launch the brand. One form.&lt;/p&gt;

&lt;p&gt;Not become known. One post.&lt;/p&gt;

&lt;p&gt;Not build the audience. One person sees one thing today.&lt;/p&gt;

&lt;p&gt;You do not wait for momentum to arrive. You make it, one small public rep done scared, then again tomorrow. Showing up while your hand still shakes is the whole skill.&lt;/p&gt;

&lt;p&gt;I hit Submit today.&lt;/p&gt;

&lt;p&gt;The sky did not fall. It never does.&lt;/p&gt;

&lt;p&gt;The only gap between the version of me that stays invisible and the version that gets found is a few seconds of pressing the button before the fear finishes its sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What have you already finished that nobody has seen yet?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Hetzner was cheaper at every size I tested and I still chose managed Postgres</title>
      <dc:creator>Mirza Iqbal</dc:creator>
      <pubDate>Wed, 15 Jul 2026 06:43:27 +0000</pubDate>
      <link>https://dev.to/mjmirza/hetzner-was-cheaper-at-every-size-i-tested-and-i-still-chose-managed-postgres-6k2</link>
      <guid>https://dev.to/mjmirza/hetzner-was-cheaper-at-every-size-i-tested-and-i-still-chose-managed-postgres-6k2</guid>
      <description>&lt;p&gt;Twelve pricing tabs open. Neon, Hetzner, Supabase, Prisma, Scaleway, OVH.&lt;/p&gt;

&lt;p&gt;My database is half a gigabyte. I was comparing ten-terabyte price curves.&lt;/p&gt;

&lt;p&gt;At some point this week I typed the words "I am super lost here" about my own infrastructure. I advise companies on this exact class of decision. That sentence still came out of my hands.&lt;/p&gt;

&lt;p&gt;If you have ever spent an evening deep in provider pricing pages for a workload that fits on a USB stick from 2009, this one is for you. All numbers below come from the live pricing pages as of July 2026. Rates move, so verify before you commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three fears, all pointed at the wrong layers
&lt;/h2&gt;

&lt;p&gt;I went in worried about getting attacked, running out of space, and being locked in.&lt;/p&gt;

&lt;p&gt;All three dissolved under ten minutes of honest reading.&lt;/p&gt;

&lt;p&gt;DDoS lands on the website edge, not the database. My site already sits behind Cloudflare and Vercel, and a database is never publicly exposed. Only the app talks to it. Whichever provider I picked, that attack surface stayed identical.&lt;/p&gt;

&lt;p&gt;Here is the shape of the stack, and where each fear lives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              MANAGED (what I run today)

  visitors ──&amp;gt; Cloudflare edge ──&amp;gt; Vercel app ──&amp;gt; managed Postgres
               [DDoS absorbed]     [stateless]    [never public,
                                                   app-only access,
                                                   provider patches,
                                                   provider backups,
                                                   provider on-call]

              SELF-HOSTED (the alternative I priced)

  visitors ──&amp;gt; Cloudflare edge ──&amp;gt; Vercel app ──&amp;gt; Hetzner CAX11
               [DDoS absorbed]     [stateless]    [Postgres :5432
                                                   firewalled to app,
                                                   SSH hardened,
                                                   fail2ban + auto-
                                                   patching = MINE]
                                                        │
                                     pg_dump every 6h   ▼
                                     encrypted ────&amp;gt; Cloudflare R2
                                                     [off-site copies]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same edge, same app, same attack surface. Everything in the right-hand box is what changes owners.&lt;/p&gt;

&lt;p&gt;Storage was a rounding error. My data is 0.5 GB. Even the cheapest self-hosted box includes 40 GB, eighty times headroom before the first extra cent.&lt;/p&gt;

&lt;p&gt;Lock-in was a phantom too. Managed Postgres is still stock Postgres. Exiting means a dump, a restore, and one connection string change in the deployment environment. Minutes of cutover, no rewrite anywhere.&lt;/p&gt;

&lt;p&gt;Three fears, zero of them real. What remained was a variable I had never once billed for in my head.&lt;/p&gt;

&lt;h2&gt;
  
  
  Egress, the number that bites
&lt;/h2&gt;

&lt;p&gt;Transfer out is where small databases produce surprising invoices, and it is where providers differ by orders of magnitude.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Egress included&lt;/th&gt;
&lt;th&gt;Overage&lt;/th&gt;
&lt;th&gt;Storage note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Neon Launch/Scale&lt;/td&gt;
&lt;td&gt;500 GB/mo (raised from 100 GB, June 2026)&lt;/td&gt;
&lt;td&gt;$0.10/GB&lt;/td&gt;
&lt;td&gt;$0.35/GB-month, no base fee, usage metered hourly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon Free&lt;/td&gt;
&lt;td&gt;5 GB/mo&lt;/td&gt;
&lt;td&gt;connections blocked until reset or upgrade&lt;/td&gt;
&lt;td&gt;0.5 GB cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prisma Postgres&lt;/td&gt;
&lt;td&gt;unlimited, free on every plan&lt;/td&gt;
&lt;td&gt;none for egress, billed per operation instead&lt;/td&gt;
&lt;td&gt;operation quota is the real limiter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase Pro&lt;/td&gt;
&lt;td&gt;250 GB/mo&lt;/td&gt;
&lt;td&gt;$0.09/GB&lt;/td&gt;
&lt;td&gt;$25/mo base also bundles Auth, Storage, Realtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner CAX11 (self-managed)&lt;/td&gt;
&lt;td&gt;20 TB/mo&lt;/td&gt;
&lt;td&gt;~€1/TB&lt;/td&gt;
&lt;td&gt;40 GB NVMe included, volumes ~€0.057/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaleway / OVH managed&lt;/td&gt;
&lt;td&gt;bundled per instance tier&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;fixed storage tiers per plan size&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Twenty terabytes next to 250 gigabytes stops being a comparison and turns into a different sport.&lt;/p&gt;

&lt;p&gt;One trap worth naming. Prisma removes egress from the bill entirely but meters queries instead, and blog traffic is exactly the pattern of many small frequent reads that makes per-operation billing hurt. Free egress can still be the expensive option for the wrong workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage cost from 1 GB to 10 TB
&lt;/h2&gt;

&lt;p&gt;I priced the whole curve so the upper end stops being abstract.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Neon ($0.35/GB-mo)&lt;/th&gt;
&lt;th&gt;Supabase Pro ($25 base, $0.125/GB over 8 GB)&lt;/th&gt;
&lt;th&gt;Hetzner (server ~€7/mo, volume €0.057/GB past 40 GB)&lt;/th&gt;
&lt;th&gt;Prisma (tier-based)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;$0.35&lt;/td&gt;
&lt;td&gt;$25 (included)&lt;/td&gt;
&lt;td&gt;€0 extra&lt;/td&gt;
&lt;td&gt;$10 Starter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;td&gt;$3.50&lt;/td&gt;
&lt;td&gt;~$25.25&lt;/td&gt;
&lt;td&gt;€0 extra&lt;/td&gt;
&lt;td&gt;$10 Starter, at the limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;$14&lt;/td&gt;
&lt;td&gt;~$29&lt;/td&gt;
&lt;td&gt;€0 extra, included&lt;/td&gt;
&lt;td&gt;$49 Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;td&gt;$35&lt;/td&gt;
&lt;td&gt;~$36.50&lt;/td&gt;
&lt;td&gt;~€3.42 extra&lt;/td&gt;
&lt;td&gt;custom tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 GB&lt;/td&gt;
&lt;td&gt;$175&lt;/td&gt;
&lt;td&gt;~$86.50&lt;/td&gt;
&lt;td&gt;~€33 total&lt;/td&gt;
&lt;td&gt;custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;~$358&lt;/td&gt;
&lt;td&gt;~$152&lt;/td&gt;
&lt;td&gt;~€63 total&lt;/td&gt;
&lt;td&gt;custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 TB&lt;/td&gt;
&lt;td&gt;~$3,584&lt;/td&gt;
&lt;td&gt;~$1,304&lt;/td&gt;
&lt;td&gt;~€590 total&lt;/td&gt;
&lt;td&gt;custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the curve, not one row.&lt;/p&gt;

&lt;p&gt;Neon is the steepest line. Simple to reason about, no volume discount ever, and by 1 TB it runs nearly six times Hetzner.&lt;/p&gt;

&lt;p&gt;Supabase flattens better because the base fee absorbs early growth, then meters steadily.&lt;/p&gt;

&lt;p&gt;Prisma moves in steps. Fine up to each plan limit, then a jump to the next tier's base fee, and past roughly 50 GB you leave published pricing entirely.&lt;/p&gt;

&lt;p&gt;Hetzner stays cheapest at every single size I tested. At 40 GB, at 100, at one terabyte. I expected a break-even point somewhere. None exists. Self-hosting wins the spreadsheet from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it would cost ME, this month, per option
&lt;/h2&gt;

&lt;p&gt;Abstract curves are one thing. Here is my actual workload priced. 0.5 GB of data, blog-shaped read traffic, egress nowhere near any allowance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;My realistic monthly bill&lt;/th&gt;
&lt;th&gt;What I own at 3am&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Neon Free&lt;/td&gt;
&lt;td&gt;$0, I sit exactly at the 0.5 GB cap edge&lt;/td&gt;
&lt;td&gt;nothing, but one growth spurt blocks connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon paid (pay-as-you-go)&lt;/td&gt;
&lt;td&gt;~$0.18 storage + metered compute hours, realistically single-digit dollars&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prisma Starter&lt;/td&gt;
&lt;td&gt;$10 flat&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase Pro&lt;/td&gt;
&lt;td&gt;$25 flat, mostly paying for bundled services I would not use&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner CAX11 self-managed&lt;/td&gt;
&lt;td&gt;~€5 to €8 all-in (server + snapshot backups)&lt;/td&gt;
&lt;td&gt;patching, hardening, backups, restores, incidents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaleway / OVH managed&lt;/td&gt;
&lt;td&gt;entry tiers vary, quote per tier before committing&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Transparency note. if you want to try Neon, &lt;a href="https://neon.com/signup?refcode=BWAT4C92" rel="noopener noreferrer"&gt;this signup link&lt;/a&gt; is my referral and gives me a small credit. The comparison above stands either way, and Hetzner still wins the raw spreadsheet.&lt;/p&gt;

&lt;p&gt;So the true spread at my size is roughly $0 to $25 a month. Which is exactly why the spreadsheet could not make this decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I still chose managed
&lt;/h2&gt;

&lt;p&gt;Because a spreadsheet prices the server and never the pager.&lt;/p&gt;

&lt;p&gt;Self-hosting a database means I own patching, hardening, backup scripts, health checks, the restore drill, and the incident at 3am when a runaway query eats the box. Every one of those is automatable, and I would enjoy building it. That is exactly the trap. I have a client engagement, a launch, and a talk to prepare. Cheap servers get expensive when they are bought with the hours I sell.&lt;/p&gt;

&lt;p&gt;Managed means the provider owns the 3am page. That single sentence is the product. Everything else on the pricing page is decoration around it.&lt;/p&gt;

&lt;p&gt;My honest math. a few euros per month separate the options at my size. One unbilled evening debugging Postgres memory settings costs more than a year of that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the backup plan looks like in real numbers
&lt;/h2&gt;

&lt;p&gt;Whichever side you pick, write these numbers down before you need them.&lt;/p&gt;

&lt;p&gt;Self-hosted, the setup I would run on Hetzner has two layers, because one layer only protects against half the disasters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provider snapshots of the whole server. daily, seven rolling copies, ~20 percent of the server price (about €1/mo here). Covers OS corruption and bad deploys.&lt;/li&gt;
&lt;li&gt;Postgres dumps shipped OFF the server to object storage (R2 in my case). every 6 hours, encrypted. Daily kept 30 days, weekly kept 6 months, monthly kept a year. Covers the server itself being destroyed, which the on-server snapshot never can.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  BACKUP AND RESTORE PATH (self-hosted)

  Hetzner box ──[daily snapshot, 7 rolling]──&amp;gt; Hetzner backup space
       │
       └──[pg_dump every 6h, encrypted]──&amp;gt; R2 bucket
                                             ├─ daily,   kept 30 days
                                             ├─ weekly,  kept 6 months
                                             └─ monthly, kept 12 months

  DISASTER: box destroyed
  R2 latest dump ──&amp;gt; fresh box ──&amp;gt; restore ──&amp;gt; repoint conn string
  [ 15 to 30 minutes, scripted ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Translate that into the two numbers that matter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worst-case data loss (RPO). up to 6 hours, the dump interval. Tighten to 1 hour or continuous WAL streaming the day the site takes real transactional writes. For a content site, 6 hours is plenty.&lt;/li&gt;
&lt;li&gt;Time back online (RTO). 15 to 30 minutes with a scripted restore. fresh box, latest dump, repoint the connection string.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Managed providers answer both numbers in their SLA instead. You are paying for the answers to already exist.&lt;/p&gt;

&lt;p&gt;And a rule I hold either way. if you have never run the restore once, what you own is hope, and hope restores nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the database goes down anyway
&lt;/h2&gt;

&lt;p&gt;Worth having answered before it happens, never during.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A health check pings the DB every minute. Three consecutive failures fire an alert.&lt;/li&gt;
&lt;li&gt;Reads degrade before they die. Edge cache and static pages keep serving, only dynamic DB-backed paths fail.&lt;/li&gt;
&lt;li&gt;Restart comes before restore. Most outages are transient, an OOM, a runaway query, a bad migration.&lt;/li&gt;
&lt;li&gt;Restart fails, restore fires. Latest off-site dump onto a fresh box, the 15 to 30 minute path.&lt;/li&gt;
&lt;li&gt;Postmortem after recovery. Root cause, and whether it needs RAM, a query fix, or connection pooling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On managed, items 1 through 4 collapse into "their on-call team handles it". You get notified instead of paged. That is the actual product you buy, named precisely.&lt;/p&gt;

&lt;h2&gt;
  
  
  One threshold ended the back-and-forth
&lt;/h2&gt;

&lt;p&gt;I stopped trying to make an eternal choice and wrote a trigger instead.&lt;/p&gt;

&lt;p&gt;Below 50 euros a month total, I stay managed and spend zero brain on infrastructure.&lt;/p&gt;

&lt;p&gt;When egress or external traffic grows enough that the managed bill approaches that line, self-hosting earns its ops ownership and I revisit with the tables above.&lt;/p&gt;

&lt;p&gt;That is the whole decision. One threshold, one revisit condition, written down. My paralysis came from treating a reversible, cheap-to-exit choice like a marriage. Stock Postgres on both sides makes switching a Tuesday afternoon, so choosing wrong costs nearly nothing, and a decision with near-zero switching cost deserves near-zero deliberation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Managed or self-hosted for your database, and what tipped it?&lt;/p&gt;

&lt;h2&gt;
  
  
  If this was useful
&lt;/h2&gt;

&lt;p&gt;I work through this in public, the wins and the freezes both, mostly on &lt;a href="https://www.linkedin.com/in/mirzajhanzaib/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@mirzaiqbal" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If the real version of building in the open is useful to you, that is where it lives. Find me on &lt;a href="https://x.com/mirzajhanzaib" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://github.com/mjmirza" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and the work at &lt;a href="https://next8n.com" rel="noopener noreferrer"&gt;next8n.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
