<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
        <title>Dev Notes</title>
        <link>https://blog.mohith16.com/</link>
        <description>Technical deep dives on backend systems, infrastructure, and performance.</description>
        <language>en</language>
        <item>
            <title>The Sandbox Had No Internet. The Agents Found One Anyway.</title>
            <link>https://blog.mohith16.com/posts/the-sandbox-had-no-internet/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/the-sandbox-had-no-internet/</guid>
            <description>How OpenAI&apos;s evaluation agents turned a package mirror into a message board, escaped their sandbox, and compromised Hugging Face production systems.</description>
            <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>The Invariants I Didn&apos;t Hold</title>
            <link>https://blog.mohith16.com/posts/building-wal-10-invariants-i-didnt-hold/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-10-invariants-i-didnt-hold/</guid>
            <description>An honest accounting of a write-ahead log: what it guarantees, where the documentation outran the code, and the pattern in every gap.</description>
            <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Testing a Thing Whose Whole Job Is Surviving a Crash</title>
            <link>https://blog.mohith16.com/posts/building-wal-09-testing-crash-recovery/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-09-testing-crash-recovery/</guid>
            <description>You can&apos;t unit test a power cut. What I built instead, and the gap I left in the middle of it.</description>
            <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Checkpoints, and What the Benchmark Wasn&apos;t Measuring</title>
            <link>https://blog.mohith16.com/posts/building-wal-08-checkpoints/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-08-checkpoints/</guid>
            <description>A 2.55x speedup that was real, produced by a mechanism that doesn&apos;t exist, hiding a bug that resurrects deleted keys.</description>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Three Ways to Recover, and What a Torn Tail Costs</title>
            <link>https://blog.mohith16.com/posts/building-wal-07-three-ways-to-recover/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-07-three-ways-to-recover/</guid>
            <description>Recovery isn&apos;t about salvaging as much as possible. It&apos;s about knowing exactly where you stopped believing the file.</description>
            <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Segments, and the fsync That Hit the Wrong File</title>
            <link>https://blog.mohith16.com/posts/building-wal-06-segments-and-rotation/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-06-segments-and-rotation/</guid>
            <description>Splitting the log into files makes almost everything easier. The seam between writing and rotating is where a durability bug was hiding.</description>
            <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Backpressure, and a Cancel That Doesn&apos;t Cancel</title>
            <link>https://blog.mohith16.com/posts/building-wal-05-backpressure-and-cancellation/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-05-backpressure-and-cancellation/</guid>
            <description>A bounded queue forces you to decide who waits. Cancellation forces you to decide what an error means.</description>
            <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Group Commit, or Refusing to Pay for fsync Alone</title>
            <link>https://blog.mohith16.com/posts/building-wal-04-group-commit/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-04-group-commit/</guid>
            <description>Getting from 255 writes a second to nearly ten thousand, without weakening a single durability guarantee.</description>
            <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>The Sequence Number That Was Never Written Down</title>
            <link>https://blog.mohith16.com/posts/building-wal-03-lsn-never-written-down/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-03-lsn-never-written-down/</guid>
            <description>The LSN is the identity of every record in the log. It isn&apos;t stored on disk, and three problems follow from that.</description>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Twenty-Two Bytes in Front of Every Record</title>
            <link>https://blog.mohith16.com/posts/building-wal-02-twenty-two-bytes/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-02-twenty-two-bytes/</guid>
            <description>A length prefix tells you where a record ends. A checksum tells you whether to believe the length prefix.</description>
            <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>What a Write-Ahead Log Actually Promises</title>
            <link>https://blog.mohith16.com/posts/building-wal-01-what-a-wal-promises/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-wal-01-what-a-wal-promises/</guid>
            <description>The durability primitive underneath every database, and the one number that shapes every decision in it.</description>
            <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>The Reliability Envelope I Didn&apos;t Finish</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-10-reliability-envelope/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-10-reliability-envelope/</guid>
            <description>An honest accounting of what this job queue guarantees, what it doesn&apos;t, and the config settings that do nothing at all.</description>
            <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Tracing a Job That Outlives Its Request</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-09-tracing-async-boundary/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-09-tracing-async-boundary/</guid>
            <description>Parent and child is a claim about containment. Queued work isn&apos;t contained by anything, so it needs a different relationship.</description>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>The Load Test That Was Supposed to Fail</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-08-load-test-that-failed/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-08-load-test-that-failed/</guid>
            <description>173,000 requests with zero errors told me nothing useful. The test that broke its own thresholds told me everything.</description>
            <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>What &apos;Processing&apos; Means When the Worker Is Gone</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-07-crash-recovery/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-07-crash-recovery/</guid>
            <description>A status column records what a job was doing. It cannot record whether anyone is still doing it.</description>
            <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>A Timeout Doesn&apos;t Stop the Work</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-06-deadlines-and-blocking-work/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-06-deadlines-and-blocking-work/</guid>
            <description>Deadlines protect the worker, not the job. Once blocking code is involved, the difference stops being academic.</description>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Idempotency Is a Race Until the Database Says Otherwise</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-05-idempotency/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-05-idempotency/</guid>
            <description>Check-then-insert looks correct and isn&apos;t. The only reliable fix is to stop checking and let a constraint decide.</description>
            <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Retries, Backoff, and Why Jitter Is Not Optional</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-04-retries-backoff-jitter/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-04-retries-backoff-jitter/</guid>
            <description>Retrying is easy. Deciding when to retry, and making sure everyone doesn&apos;t decide the same thing, is the actual work.</description>
            <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Three Priority Tiers in One Number</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-03-priority-sorted-set/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-03-priority-sorted-set/</guid>
            <description>A single Redis sorted set gives strict priority and FIFO inside each tier. Then I checked the arithmetic.</description>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Two Stores, One Job, and the Gap Between Them</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-02-two-stores-one-job/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-02-two-stores-one-job/</guid>
            <description>Splitting durable truth from fast dispatch buys a lot. It also creates a dual write I never made atomic.</description>
            <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Why I Didn&apos;t Just Use Celery</title>
            <link>https://blog.mohith16.com/posts/building-jobqueue-01-why-not-celery/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-jobqueue-01-why-not-celery/</guid>
            <description>A job queue is a promise that work you accepted will eventually happen. Making that promise honestly is the hard part.</description>
            <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Ten Posts Later: What I&apos;d Do Differently</title>
            <link>https://blog.mohith16.com/posts/building-canvas-10-what-id-do-differently/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-10-what-id-do-differently/</guid>
            <description>Looking back at a collaborative canvas app, the decisions that held up, the ones that didn&apos;t, and what&apos;s still broken.</description>
            <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Undo Is a Stack of Your Own Mistakes</title>
            <link>https://blog.mohith16.com/posts/building-canvas-09-collaborative-undo/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-09-collaborative-undo/</guid>
            <description>Ctrl+Z is trivial in a single user app. Add one collaborator and the obvious implementation starts erasing other people&apos;s work.</description>
            <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>The Server Forgets Everything and That&apos;s Fine</title>
            <link>https://blog.mohith16.com/posts/building-canvas-08-offline-and-reconnect/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-08-offline-and-reconnect/</guid>
            <description>Rooms live in memory and get thrown away. The client is the persistence layer, which changes what reconnecting means.</description>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>What Happens When One Client Can&apos;t Keep Up</title>
            <link>https://blog.mohith16.com/posts/building-canvas-07-backpressure/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-07-backpressure/</guid>
            <description>Every broadcast loop contains an assumption that send() works. Backpressure is what you build when it doesn&apos;t.</description>
            <pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Cursors Are Not Part of the Document</title>
            <link>https://blog.mohith16.com/posts/building-canvas-06-presence-and-cursors/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-06-presence-and-cursors/</guid>
            <description>Presence looks like the easiest feature in a collaborative app. It has the tightest constraints of anything in the system.</description>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Writing a Binary WebSocket Protocol by Hand</title>
            <link>https://blog.mohith16.com/posts/building-canvas-05-binary-protocol/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-05-binary-protocol/</guid>
            <description>What actually goes over the wire in a collaborative canvas, and why the ready made library didn&apos;t fit.</description>
            <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Real-Time Collaboration Is Not Just Sending Updates</title>
            <link>https://blog.mohith16.com/posts/building-canvas-04-realtime-collaboration/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-04-realtime-collaboration/</guid>
            <description>Two people editing the same canvas is not a networking problem. It&apos;s an agreement problem.</description>
            <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Why Freehand Drawing Becomes a Bottleneck</title>
            <link>https://blog.mohith16.com/posts/building-canvas-03-freehand-drawing/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-03-freehand-drawing/</guid>
            <description>Freehand input looks simple, but the amount of data it generates can quickly overwhelm your rendering system.</description>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>Inside the Rendering Engine of a Canvas App</title>
            <link>https://blog.mohith16.com/posts/building-canvas-02-rendering-engine/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-02-rendering-engine/</guid>
            <description>Rendering isn’t just about drawing shapes. It’s about controlling how much work happens per frame.</description>
            <pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title>What Building a Drawing App Taught Me About Performance</title>
            <link>https://blog.mohith16.com/posts/building-canvas-01-about/</link>
            <guid isPermaLink="true">https://blog.mohith16.com/posts/building-canvas-01-about/</guid>
            <description>Performance issues don’t show up immediately, they build up quietly until your assumptions stop working.</description>
            <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
        </item>
    </channel>
</rss>