Vibe code cleanup
From prototype to live users.
Vibe code cleanup and Lovable rescue: I audit, refactor, and harden AI-built apps (Lovable, Cursor, Bolt, Claude Code, Replit) and ship them to live users. The Agency Hub case study is the named example.
Vibe code cleanup (also called vibe code rescue) is the process of taking a vibe-coded application built with Lovable, Cursor, Bolt, Claude Code, Replit, or similar AI tools and hardening it for production: security audit, RLS and authorization fixes, schema validation, error handling, monitoring, and shipping to live users. Specialists charge $150 to $200 per hour. Engagements run from two-week audits to multi-month rebuilds. The Agency Hub case study is one example.
Most vibe-coded apps look great in the demo and break under load. The AI tools that generate them are good at producing something that runs. They are not good at producing something that survives the first ten real users, the first credential leak, the first race condition on a shared resource. The gap between “ships in a demo” and “ships to live users” is the gap I close.
How the cleanup works
The pattern is the same across Lovable, Cursor, Bolt, Claude Code, and Replit handovers. Four phases, run in order, with a human gate between each.
The first commit is a workspace, not a fix. CLAUDE.md at the project root listing every system the AI is allowed to touch, every rule it has to follow, every credential boundary. An ISSUES.md log of every bug found on first exploration. Most vibe-coded handovers arrive light on docs and lighter on commit reasoning. The audit makes the missing parts explicit before any code moves.
Vibe-coded builds frequently miss the boring parts: RLS policies that should have been on every Supabase table, authorization checks that should have gated every mutation, validation schemas that should have rejected malformed input. Most of the bugs in a cleanup project are not in the feature code. They are in the absence of the safety code. I write the safety code first.
AI-generated code tends to be locally correct and globally surprising. Functions duplicate. Schemas drift between layers. Type definitions exist or don’t depending on which session generated the file. The refactor pass consolidates the duplications, aligns the schemas, and adds the type definitions that should have been there from day one. The goal is a codebase that survives a second developer joining the project, not a codebase that only the AI understands.
Production deployment with the safety hooks added before the first AI session, not after the first incident. Monitoring connected so silent failures surface. A rotation playbook in writing so the next BOLA disclosure (or equivalent) takes hours instead of days. The Agency Hub rescue survived a Lovable-platform BOLA disclosure in hours because the documentation was already there.
Lovable rescue specifically
A note on the platform that drives most of the cleanup work I see. Lovable plus Supabase is the dominant vibe-coding stack in 2026, and the dominant source of cleanup engagements. The platform ships fast and the integrations are deep, but the production-ready bar is the developer’s responsibility to clear. Common patterns on a Lovable rescue: RLS policies missing on multi-tenant tables, publishable-key auth misconfigured, schemas that drift between the web app and any Chrome extension or mobile shell, no monitoring connected. The Agency Hub case study is a Lovable plus Claude Code plus Supabase rescue that hit each of these. The work is repeatable.
Engagement terms
Same as the rest of my practice. Hourly only. $60 per hour. Tracked via Upwork or similar; weekly invoices; no setup fee, no padding. Minimum is a few hours of scoping discovery; no commitment beyond that until you are confident. Most cleanup engagements run two to eight weeks for the audit and harden phases; refactor and ship can extend into ongoing work afterward.
If you give me access to your repo when you book the call. I will tell you whether the build is rescuable in its current shape, or whether a rewrite is the honest answer. The decision happens once, with you in the loop.
Before the call