Shipping Production Apps Solo with Vibe Coding
It's 2:14am. I'm on my third coffee, the apartment is silent except for the hum of the AC and a ceiling fan that has been threatening to fall for two years. On my left monitor: Hodol's checkout flow throwing a Razorpay signature mismatch on every webhook. On my right: Claude Code, patiently waiting for me to stop rage-typing. I'm the only engineer on this product. There is no one to ping. No one to escalate to. The merchant whose order just failed is messaging me directly on WhatsApp. This is what shipping production software solo actually looks like — and somehow, it's the most fun I've had in a decade of building.
I want to talk about how this works in practice. Not the LinkedIn version. The real one — including the parts where AI confidently writes broken code, where I've had to throw away two days of generated work, and where I've genuinely shipped features in three hours that would've taken a team a sprint.
First, the baseline nobody likes to admit
Vibe coding is not a magic productivity multiplier. It's a leverage multiplier — and leverage cuts both ways. The reason it works for me is because I've been writing software for thirteen years across SAP, Zivame, HPE (building Flybe's booking engine for millions of European travellers), Flipkart (post-order systems and Sentinel during Big Billion Days), Adobe Sydney (Tourism Australia on AEM), and a few years in between as an independent consultant. That's not a flex — it's the whole point. Without that scar tissue, vibe coding produces beautiful, plausible-looking code that quietly explodes in production.
I've watched juniors paste an AI-generated payment handler that looked clean, passed every test they wrote, and would've double-charged customers under a specific race condition I've seen before because I lived it at Flipkart in 2017. The AI didn't know. It can't know. It pattern-matches against everything it's seen, but it has no idea which patterns matter for your system at your scale on your Tuesday morning.
So when people ask me “will AI replace developers?”, my honest answer is: it already replaced the bottom 30% of what I used to do. The work that's left is harder, more interesting, and more valuable. But you have to have done the bottom 30% for years before AI can take it from you. Otherwise you're just pasting code you don't understand into a system you can't debug.
My actual workflow (the unglamorous version)
Here's how a real feature gets built at WDA. Last week I shipped a guest-checkout flow for Hodol — a small studio in Bangalore wanted to take bookings without forcing customers to create accounts. Roughly 14 hours of work, spread across two days. Here's what those hours actually looked like:
- Hour 1–2: pen and notebook. Yes, paper. I sketched the data model on a Muji notebook on my balcony with a cup of chai. Guest sessions, anonymous bookings, the eventual upgrade-to-account flow, what happens to a guest order when the merchant refunds it three weeks later. AI is genuinely useless here. It'll happily generate something — but the question isn't “how”, it's “what are we even building and what breaks in six months?”
- Hour 3: schema in Prisma. Wrote the migration myself.
guestSessionId, nullableuserId, a constraint that one of them must exist. Five minutes of typing, an hour of staring at it making sure I haven't painted a future migration into a corner. This is where senior developers earn their keep. - Hour 4–7: vibe coding the implementation. Now Claude Code earns its keep. I describe the schema, the flow, the existing patterns in the codebase, and let it scaffold the API endpoints, the React forms, the Zod validators. It produced about 600 lines in 90 minutes that would have taken me a full day to type. I rewrote roughly 40% of it — mostly tightening error handling, replacing nested ternaries with early returns, and killing two abstractions it invented for no reason.
- Hour 8: the part nobody talks about. I read every single line. Out loud, in my head, slowly. This is non-negotiable. AI-generated code reads as confident prose, which is dangerous because confident prose hides bugs. I caught a subtle off-by-one in pagination and a SQL filter that would've leaked one tenant's draft bookings to another tenant if a specific edge case fired.
- Hour 9–11: tests, staging, manual QA. I run a full set of integration tests on a staging Supabase project that mirrors production. I checkout as a real guest. I refund the order. I cancel halfway through. I open the same flow on a slow 3G connection emulator because half my users are on patchy networks in tier-2 Indian cities. AI cannot do this for me. AI does not know what a Jio network looks like at 9pm on a Sunday.
- Hour 12–14: ship it, watch it, fix the small stuff. Production deploy. I sit and watch logs for 30 minutes. Two real guest checkouts go through. One fails because the merchant hadn't enabled their Razorpay key for international cards — error message was unhelpful, I rewrite it. Push hotfix. Done.
Where AI is genuinely brilliant
Three years ago I would've hated this section. I had a strong “real engineers write their own code” bias from years of code review at Flipkart and Adobe. I was wrong. The right answer is more nuanced — AI is exceptional in narrow, well-defined surfaces:
- Translating clear specs into UI. Hand it a Figma frame and existing Tailwind tokens and it produces a Next.js page that's 80% there in fifteen minutes. The remaining 20% — accessibility, mobile breakpoints, focus states — I add by hand. The whole component used to be a half-day. Now it's an hour.
- Boilerplate that follows existing patterns. “Add a new admin route for X, mirror the structure of the existing route for Y.” This is where AI shines. It reads the existing code, copies the conventions, gets the imports right. I've stopped writing CRUD by hand. I haven't written a basic Express controller from scratch in six months.
- Tests for code I just wrote. Counterintuitively, AI is better at writing tests for my code than writing the code itself. It enumerates edge cases I forget about. “What about an empty array? What about a duplicate slug? What about a string that's exactly 256 characters?” A junior would miss two of those. AI gets all three.
- Dumb but tedious migrations. “Rename this field across the codebase, update the Prisma model, regenerate the types, update the imports.” Used to be 90 minutes of grep-and-replace anxiety. Now it's a confirmation prompt and a diff review.
- Explaining unfamiliar code. Inheriting a legacy codebase is a different job in 2026. I dropped a 4000-line AEM module into Claude last month and had a coherent mental model in twenty minutes. Used to take a week.
Where AI quietly betrays you
And now the parts nobody puts in the demo videos. These are the places where I have learned, expensively, to never trust AI output without rebuilding it by hand:
- Anything touching money or auth. Payment captures, refunds, JWT verification, signature validation, role checks, tenant isolation. I write these myself, line by line, or I rewrite the AI version so thoroughly that it's mine again. The cost of getting this wrong is not a bug — it's a livelihood. A merchant losing money to a bug I shipped is not abstract; it's a real person with rent due.
- Concurrency and race conditions. AI-generated optimistic-update logic is almost always subtly broken. It looks correct in single-user testing, falls apart the moment two requests arrive within the same millisecond. I've seen it generate code that uses
Math.random()as an idempotency key. I am not joking. - Architecture and scoping decisions. “Should this be a separate service? Monolith or microservice? Postgres or DynamoDB? Server component or client component?” AI will give you a confident answer to all of these and it will be the wrong answer 60% of the time, because the right answer depends on your team (one person), your budget (limited), your growth (unknown), and your maintenance capacity (also you, also at 2am). It cannot weigh those because it cannot see them.
- Anything novel. If the problem hasn't been solved on Stack Overflow ten thousand times, AI starts hallucinating. It'll invent an API on Razorpay's SDK that doesn't exist. It'll cite a Prisma feature from a future version. The closer you are to the cutting edge, the less useful AI becomes — which is annoying, because that's usually where the interesting work is.
The tools I actually use
Not a sponsored list. Just what's on my machine right now in 2026. Stack changes every six months in this game.
- Claude Code for serious work. It's the one I trust with codebase-wide changes. The agentic loop is genuinely good at “here's a goal, figure out which files to touch.”
- Windsurf as the IDE. Cascade is fast, the inline edits feel native, and it doesn't fight me when I want to take the wheel.
- Cursor occasionally, when I want a different model's opinion on the same problem. Two AIs with different defaults catch each other's blind spots.
- v0 and Lovable for fast UI exploration. I don't ship their code directly, but it's great for sketching three layout variations in twenty minutes.
- Plain ChatGPT and Claude.ai for thinking out loud. Half my best architectural decisions come from typing “here's what I'm considering, what am I missing?” into a chat window at midnight.
The honest trade-offs of going solo
Solo isn't romantic. There are days I miss having a team. The small dopamine hit of someone reviewing your PR and writing “nice”. The conversation in the kitchen where someone mentions a library you'd never have found. The senior architect who quietly stops you from making a mistake you didn't know you were making. None of that exists when you're solo. AI is a remarkable substitute for some of it. It is not a substitute for all of it.
But the upside is real and undersold. Every architectural decision lives in one head, which means there's no design-by-committee compromise, no political tax on the codebase, no two-week debate about whether to use Zustand or Redux. The product is opinionated because the person building it has opinions. And those opinions can change in an afternoon when the data says they should — try doing that across a team of twelve.
The deepest change for me, after fifteen months of building this way, is that the bottleneck moved. For thirteen years, the bottleneck on my output was typing speed and code volume. Now the bottleneck is taste, judgement, and product sense. Which is exactly the part of the job I was hired for in the first place. AI didn't replace the engineer — it finally let the engineer do what they were always supposed to do.
For products up to a certain complexity — and that bar is much higher than most people realise — a senior solo developer who vibe-codes can ship faster, with cleaner architecture and better product instincts, than a small team. Beyond that bar, you need humans. The skill, in 2026, is knowing exactly where that bar sits for the thing you're building. I get it wrong sometimes. So far, less often than I get it right.
Anyway. It's 4am now. Razorpay webhooks are flowing again — turned out the merchant had two different webhook secrets in two different envs and I was validating against the wrong one. Classic. The kind of bug AI cannot solve because the bug is not in the code, the bug is in the world. I'm going to bed. Tomorrow there's a new feature to ship.
Want to discuss your project? Let's talk on WhatsApp or check out my recent work.