<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Manveer Bhullar — Writing</title><description>Technical writing on platform engineering, infrastructure, AI tooling, and shipping real products.</description><link>https://manveerbhullar.com/</link><language>en-us</language><item><title>A supervisor, a status file, and a worktree per agent</title><link>https://manveerbhullar.com/writing/agent-fleet-orchestration/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/agent-fleet-orchestration/</guid><description>Running several AI coding agents in parallel against one repo needs an orchestrator, not a chat window. The mechanics that make it work: disposable git worktrees, an append-only status protocol, and a watcher that sleeps until an agent actually has something to say.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>orchestration</category><category>git-worktrees</category><category>workflow</category><author>Manveer Bhullar</author></item><item><title>No testcontainers, no rollback: how I actually test a SaaS</title><link>https://manveerbhullar.com/writing/testing-a-real-saas/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/testing-a-real-saas/</guid><description>Almost 500 test files behind a real product: unit tests that mock everything and run in seconds, integration tests against a real Postgres with manual cleanup, and a deliberate decision to never test the LLM. The pragmatic version, with the tradeoffs named.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><category>testing</category><category>vitest</category><category>postgres</category><category>ci</category><author>Manveer Bhullar</author></item><item><title>One keystroke to capture a job: inside a Chrome extension</title><link>https://manveerbhullar.com/writing/chrome-extension-capture/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/chrome-extension-capture/</guid><description>A Manifest V3 extension that turns any job posting into a tracked application — JSON-LD first, site parsers as fallback, cookies for auth, shadow DOM for the UI, and an optimistic card that swaps to real data when the server finishes extracting.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><category>chrome-extension</category><category>manifest-v3</category><category>typescript</category><category>wxt</category><author>Manveer Bhullar</author></item><item><title>Building RoleReady: a year of solo product engineering</title><link>https://manveerbhullar.com/writing/building-roleready/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/building-roleready/</guid><description>What it actually takes to ship a real SaaS alone — 100 Postgres tables, 19 typed AI functions, a Chrome extension, and a marketing site — and the decisions I would defend in a code review.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>roleready</category><category>saas</category><category>solo-dev</category><category>engineering</category><author>Manveer Bhullar</author></item><item><title>Your API routes should just enqueue</title><link>https://manveerbhullar.com/writing/routes-just-enqueue/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/routes-just-enqueue/</guid><description>How a five-line rule — route handlers authenticate and enqueue, workers do the work — removed an entire class of timeouts, double-charges, and lying spinners from a real product.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>inngest</category><category>background-jobs</category><category>nextjs</category><author>Manveer Bhullar</author></item><item><title>I stopped writing prompts as strings</title><link>https://manveerbhullar.com/writing/baml-ai-pipeline/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/baml-ai-pipeline/</guid><description>Nineteen AI features in production, every one with a compile-time return type, a retry policy, and a different fallback model. How BAML turned LLM calls into ordinary typed functions.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><category>ai</category><category>baml</category><category>llm</category><category>typescript</category><author>Manveer Bhullar</author></item><item><title>AGENTS.md is the operating manual, not a vibe</title><link>https://manveerbhullar.com/writing/agents-md-operating-manual/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/agents-md-operating-manual/</guid><description>Running several AI coding agents in parallel against one codebase, and the 29 non-negotiable rules — plus three enforcement layers — that keep them from destroying each other’s work.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>claude-code</category><category>workflow</category><category>tooling</category><author>Manveer Bhullar</author></item><item><title>No migration files: Drizzle push and one hand-written trigger</title><link>https://manveerbhullar.com/writing/drizzle-push-postgres-fts/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/drizzle-push-postgres-fts/</guid><description>Why a 100-table production schema syncs with `drizzle-kit push` instead of generated migrations — and the one place I drop to raw SQL: a weighted Postgres full-text search trigger.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>postgres</category><category>drizzle</category><category>database</category><category>full-text-search</category><author>Manveer Bhullar</author></item><item><title>The stack vs. the reality: shipping a Next.js app to Cloud Run</title><link>https://manveerbhullar.com/writing/tech-stack-reality/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/tech-stack-reality/</guid><description>A multi-stage Bun Dockerfile, zero .env files, Doppler secrets mounted as JSON, and Cloud Run over Vercel for the heavy app. The infra decisions that don’t show up in a stack list.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>devops</category><category>docker</category><category>cloud-run</category><category>infrastructure</category><author>Manveer Bhullar</author></item><item><title>1000 PRs Merged</title><link>https://manveerbhullar.com/writing/1000-prs-merged/</link><guid isPermaLink="true">https://manveerbhullar.com/writing/1000-prs-merged/</guid><description>A small milestone for my solo project journey</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>milestone</category><category>reflection</category><author>Manveer Bhullar</author></item></channel></rss>