Authentication and permissions
Generated code usually checks that a user is logged in. It far less often checks that this user may see this record. Row-level authorization is the single most common hole we find.
For apps built with Cursor, Lovable, Bolt, v0, Copilot and friends
Shipping an MVP with AI tools was the right call. Now it has paying customers, and the parts the tool was never asked about — permissions, secrets, backups, load — are what break next. We audit the code, the data and the hosting, fix what matters, and keep it running.
Read-only access. Nothing is changed until you say so.
Three or more of these and the audit will pay for itself in the first week.
What the tool was never asked about
None of these show up in a demo. All of them show up with a few hundred real users, a curious customer, or one bad deploy.
Generated code usually checks that a user is logged in. It far less often checks that this user may see this record. Row-level authorization is the single most common hole we find.
Keys pasted into source, one .env shared between development and production, no rotation. We move secrets to a managed store, split environments and rotate anything that was ever committed.
Missing unique constraints, no foreign keys, migrations run by hand. The app looks fine until two requests race, then you have duplicate orders and a support queue.
A backup that has never been restored is a hope, not a backup. We set automated backups with a retention you choose and rehearse a restore so the number in your runbook is real.
N+1 queries, no indexes, everything loaded into memory. Fine at ten users. We find the queries that will fall over at a thousand and fix them before you get there.
No CI, no tests, no rollback, no alerting. We add a pipeline that runs tests and deploys the same way every time, and monitoring that pages a human before users notice.
How a rescue works
Each step stands on its own. Most clients start with the audit, take the fix list, and decide from there.
Read-only access to the repository and the cloud account. You get a written report, a fix list ranked by risk to users and effort to fix, and a 60-minute walkthrough. You can execute it without us.
What the audit covers →We quote the top findings as a fixed-price sprint, typically two to four weeks. Every change ships with tests, a written plan and a way to roll it back. Your product keeps running throughout.
How project work is quoted →A senior-led team that knows your system, on call for patching, incidents and the small changes nobody has time for. Three tiers; most rescued apps stay on this so they do not drift back.
Retainer details →We operate a US healthcare platform under SOC 2 remediation and a two-country marketplace with Stripe Connect payments. The audit uses the list we run before any of those goes live — not a generic scanner report.
No. We use AI tools on every project and say so on our home page. Shipping fast was the right call; the audit is about what the tools were never asked to think about.
Almost never. Generated code is usually fixable in place. A rewrite is on the table only if the data model is wrong at the core, and we will tell you that in the audit rather than discover it mid-sprint.
Apps started in Cursor, GitHub Copilot, Claude Code, Lovable, Bolt, v0, Replit and similar — on Node.js, NestJS, Next.js, Laravel/PHP, Python, Flutter and React Native, hosted on AWS, Vercel, Supabase, Railway or similar. If yours is different, ask; we will say honestly whether we are the right team.
For the audit, read-only: a repository invite and a read-only cloud role. Nothing is changed. For the rescue sprint we work in your repository through pull requests you can see and review.
That is fine and common. The audit is priced to stand alone, and the fix list is written so your own team can act on it.
The audit usually starts within a week of the call and takes five business days. Book a 20-minute call and bring the repository link.
In 20 minutes we will tell you whether the audit fits, what we expect to find, and when we can start. No slides.