Techallin
Back to blog

Is Your Vibe-Coded App Production-Ready? A Founder Checklist

Techallin
October 13, 2026

Your Vibe-Coded App Works in the Demo. Is It Ready for Real Users?

Is my vibe-coded app ready for real users? It is ready when it works for the people and situations you did not test, not only the path you demoed. That means users can only see their own data, secret keys never reach the browser, payments are confirmed on the server, errors are logged, data is backed up, and you can roll back a bad release. If you cannot confirm those points, your app is demo-ready. It is not yet production-ready.

You described your product to Lovable, Bolt, Replit Agent, Cursor or v0. A few days later you had a real app. It has a login screen, a dashboard, a database and maybe a Stripe checkout. You have clicked through it fifty times and it works.

Now you are about to invite real users, and a quieter question shows up. Will it hold up?

That question is reasonable. AI coding tools are very good at building the parts of an app you can see. The parts that decide whether an app is safe to launch are mostly invisible: who can read which records, where your keys live, what happens when a payment webhook arrives twice. None of that shows up in a demo.

This guide is written for founders who can build with AI but do not read code for a living. By the end you will know what production-ready means in plain English, how to test the obvious risks yourself in about 15 minutes, which findings should stop a launch, and how to decide whether your app needs a few fixes, a hardening pass or a partial rebuild.

What does "production-ready" actually mean?

A production-ready app is one that keeps working correctly, safely and recoverably when real people use it in ways you did not plan for. Working features are the starting line. Production readiness adds the protections, monitoring and recovery plans that real usage demands.

Use these 16 criteria as your checklist. Each one is a yes or no question.

  1. Authentication works correctly. Only real, verified users can sign in, sessions expire, and password resets cannot be hijacked.

  2. Authorization prevents access to data users do not own. Every request is checked on the server against what that specific user is allowed to see or change.

  3. Database access rules are enforced. The database itself refuses unauthorized reads and writes, even if someone bypasses your interface.

  4. Secrets and credentials are protected. Privileged keys live only on the server and never appear in browser code, mobile builds or your repository.

  5. Inputs are validated. Forms, APIs and file uploads reject data that is the wrong type, size or shape before it reaches your database.

  6. Errors fail safely. When something breaks, users see a clear message, nothing sensitive leaks, and no half-finished record is left behind.

  7. Payments are handled securely. Payment status comes from your payment provider's verified server events, never from the browser.

  8. Application dependencies are reviewed. The packages your app installs are current and free of known critical vulnerabilities.

  9. Backups and recovery exist. Your data is backed up automatically, and you have actually tested restoring it.

  10. Logging and monitoring exist. You find out about errors and outages from your tools before your users tell you.

  11. Performance has been tested. Key pages and actions stay fast with realistic amounts of data and several users at once.

  12. The data model can support expected usage. Tables, relationships and indexes fit how the app will grow over the next year.

  13. Production and development environments are separated. Testing and AI-agent edits never touch live customer data.

  14. Required privacy and security controls are understood. You know which rules (HIPAA, GDPR, customer security reviews) may apply to your data.

  15. Accessibility requirements are considered. People using keyboards and screen readers can complete the core tasks.

  16. Deployment and rollback processes exist. You can ship a fix and undo a bad release in minutes, without guessing.

If you answered "I don't know" more than three or four times, that is useful information too. It tells you where evidence is missing.

Why an app can work perfectly in a demo and still fail in production

A demo proves that the happy path works. Production tests everything else. The happy path is the exact sequence you built and tested again and again: sign up, create a project, invite a teammate, pay. Real users do not follow it.

In the first week, real users will:

  • enter emojis, 5,000-word notes and blank fields where you expected a name

  • open the app in two tabs and edit the same record in both

  • change the number at the end of a URL to see what happens

  • forget their password, then request three reset emails in a row

  • upload a 200 MB video where you expected a profile photo

  • refresh the page halfway through checkout

  • lose their connection on a train while saving

  • click "Submit" twice because the button felt slow

  • try a page they are not supposed to reach, by accident or on purpose

Each of these is an edge case: a situation outside the path you designed. AI coding tools can handle edge cases well when someone asks for them. When nobody asks, the generated code usually covers the requested behavior and stops there.

That is not a flaw unique to AI. Human developers miss edge cases too. The difference is that a professional team has habits, reviews and tests built around finding them. A solo founder prompting an AI tool often has none of those yet.

The 80% wall: why vibe-coded apps often feel finished before they are

The "80% wall" is shorthand for the point where an AI-built app looks almost done but the remaining work is the hardest to see. It is a description of how the work feels, not a measured statistic. The real ratio varies by app.

The early work produces visible progress fast:

Visible work (fast with AI) Less visible work (where launches stall) Screens and layout Authorization rules for every user role Forms and buttons Security on every endpoint, not only the pages Login and signup screens Session expiry, password reset and account recovery Database tables Data integrity, constraints and indexes Dashboards and charts Performance with real data volumes API connections Rate limits, retries and failure handling A working checkout Verified payment events, refunds and duplicates A live preview link Backups, monitoring, rollback and environment separation Privacy, compliance and accessibility

The left column is what you show investors. The right column is what users rely on without noticing. Founders often hit the wall when each new prompt fixes one issue and quietly breaks another, because the right-column decisions were never made on purpose. The architecture grew out of prompts instead of a plan.

The good news is that the right column is a finite list. You can check it, and much of it can be fixed without starting over. That is the idea behind a structured vibe-coded app rescue.

Security checks to run before real users touch the app

The first security checks for a vibe-coded app are authentication, authorization, database access rules, secrets and input validation. These five cover the failures that expose other people's data, which is the hardest kind of mistake to undo. Broken access control is ranked first in the OWASP Top 10:2025, the most widely used list of web application security risks.

Authentication: who are you?

Authentication confirms that a person is who they claim to be. Check four things:

  • Who can sign up and sign in. Is email verification on? Can anyone create an admin account?

  • How sessions behave. Do sessions expire? Does logging out actually end the session on the server?

  • Password reset. Do reset links expire and work only once? Can someone request resets for an account repeatedly with no limit?

  • Privileged accounts. Are admin and staff accounts protected with multi-factor authentication?

Authorization: what are you allowed to do?

Authentication asks who you are. Authorization asks what you are allowed to access. Authorization is the rule that says Maria can see Maria's invoices and nobody else's.

This is where many AI-built apps go wrong, because a working login creates false confidence. An app can check that you are signed in and still hand you any record you ask for. If changing /invoices/104 to /invoices/105 shows you a stranger's invoice, the app has authentication without authorization.

Hiding a button is not authorization either. If the rule lives only in the interface, anyone who sends the request directly can skip it. The check has to run on the server or in the database for every request.

Row Level Security and data access

Row Level Security (RLS) is a PostgreSQL feature that lets the database itself decide which rows each user can read or change. Supabase, the database behind many Lovable and Bolt apps, relies on it. A policy works like an invisible filter added to every query, such as "only return rows where user_id matches the signed-in user" (Supabase docs).

RLS matters so much in Supabase apps because the browser often talks to the database directly. Supabase's documentation is explicit: a table in an exposed schema without RLS is readable and writable by any role that has been granted access to it, so RLS should be enabled on every such table.

Common gaps to look for:

  • RLS not enabled on one or more tables.

  • Policies that are too broad, for example "any signed-in user can read every row". That confirms someone is logged in without checking whose row it is.

  • Separate operations left open. A table can block reading but still allow anyone to insert or update.

  • Policies built on user-editable data. Supabase warns against basing authorization on user_metadata, because users can change it themselves.

  • Views that bypass RLS. Supabase notes that views ignore table policies by default unless configured otherwise.

This is not a theoretical concern. In 2025, researcher Matt Palmer scanned 1,645 projects from Lovable's public showcase and reported 170 of them (about 10.3%) with inadequate RLS settings, allowing data to be read without authorization. The issue was published as CVE-2025-48757; the CVE record carries a "disputed" tag. Lovable has since added RLS checks to its built-in security scans.

RLS problems are fixable and do not mean every Supabase app is exposed. They do mean nobody should assume the policies are correct because the app works.

Secrets and API keys: public keys vs privileged secrets

Not every key you can see in the browser is a problem. Privileged secrets in the browser always are. The difference matters, because founders often panic over the wrong key and miss the dangerous one.

Key type Examples Safe in browser code? Public or publishable keys Supabase publishable key (formerly anon), Stripe publishable key (pk_), Firebase web config Yes, by design. Protection comes from RLS and server-side rules. Privileged secrets Supabase secret key or service_role key, Stripe secret key (sk_), OpenAI API key, database passwords Never. Server only. Webhook signing secrets Stripe whsec_ secrets Never. Server only.

Supabase's own guidance puts it simply: the publishable key is meant to be public, and the secret key bypasses Row Level Security and must never leave your control (Supabase API keys).

Watch for framework prefixes. In Next.js (common with v0 and Vercel), any variable starting with NEXT_PUBLIC_ is bundled into the JavaScript sent to the browser (Next.js docs). Vite apps, common in Bolt and Lovable, do the same with VITE_. A secret with one of those prefixes is a public secret.

The Moltbook exposure reported by Wiz in early 2026 shows how the two layers interact. Researchers found the app's Supabase key in its client-side JavaScript, which is normal. Because the database rules behind it were not properly configured, that key gave full read and write access, exposing about 1.5 million API tokens and 35,000 email addresses.

Input validation

Input validation means checking every piece of data a user sends before your app trusts it. Ask what happens when unexpected input reaches:

  • Forms: can a price be negative, or a quantity be 10,000,000?

  • APIs: does the server re-check the data, or trust whatever the frontend sent?

  • Database queries: are values passed safely, or pasted into the query text? The second pattern enables SQL injection, which OWASP still ranks in its Top 10.

  • File uploads: are file type and size limited, and are uploaded files stored where they cannot run as code?

OWASP recommends allow-list validation: define what valid input looks like and reject the rest.

Does AI-generated code have security problems?

AI-generated code can be secure or insecure. It depends on the prompt, the context, the libraries and above all whether anyone reviewed it. Code that runs is not evidence that it is safe, and AI tools tend not to add security unless it is asked for or enforced.

The most cited research is Veracode's 2025 GenAI Code Security Report. Veracode gave more than 100 large language models 80 coding tasks that each had a known secure and insecure way to complete them. In 45% of test cases, the models chose an approach that introduced a vulnerability from the OWASP Top 10. Veracode also found that newer models wrote more working code over time without writing more secure code.

Read that number carefully. It describes tasks designed to test security choices, not 45% of every app. It also covers models answering short prompts, not a full product with review. The useful takeaway for a founder is narrower and more practical: generated code is a draft that needs checking, especially in login, permissions, payments and data access.

Maintenance matters too. A 2026 study of AI-assisted commits across thousands of GitHub projects, Debt Behind the AI Boom, found that AI-introduced code issues often persist in real codebases and add long-term maintenance cost. That matches the 80% wall: problems that are cheap to fix early get expensive once features are built on top of them.

Is my Lovable, Bolt, Replit Agent, Cursor or v0 app safe to launch?

No AI coding platform makes an app production-ready or unsafe on its own. Readiness depends on the architecture, the generated code, the database configuration, authentication, authorization, third-party services, deployment settings and every change made since. Two apps built on the same tool can be in completely different shape.

What changes from tool to tool is where to look first.

Lovable

Lovable generates web apps, usually backed by Supabase through Lovable Cloud or your own Supabase project. Because the browser often reads the database directly, RLS policies carry most of your data security. Lovable now runs a Basic security scan (RLS policy linting, schema review, dependency audit) when you publish, and offers a Deep scan that reviews access control and backend endpoints (Lovable security docs). Run both. Treat a clean scan as a good sign, then confirm with real tests, because a scanner cannot know your business rules, such as which team members should see which records.

Bolt

Bolt builds full-stack web apps in the browser, frequently with a Vite frontend and a hosted database or Supabase backend. Look first at which logic runs in the browser versus on a server, at any VITE_ variable that holds a secret, and at database rules if the frontend calls the database directly.

Replit Agent

Replit Agent builds and hosts the whole app inside Replit. After a widely reported July 2025 incident in which the agent deleted a user's production database during a code freeze, Replit introduced separate development and production databases (The Register). Its docs also keep development secrets and deployment secrets in separate stores (Replit docs). Confirm your app uses both separations, that production backups exist, and that an agent cannot run destructive commands against live data.

Cursor

Cursor is an AI code editor, so the output is ordinary code in your own repository, in whatever stack you chose. That flexibility means there are no platform defaults to rely on. Review it like any codebase: where secrets live, whether API routes check permissions, whether there are tests, and which dependencies were added along the way.

v0

v0 by Vercel generates interfaces and Next.js apps that deploy to Vercel. Check that sensitive work happens in server code, that no secret uses the NEXT_PUBLIC_ prefix, and that API routes and server actions verify the user's permissions instead of trusting the page that called them.

Will the database hold up once real users arrive?

A database holds up when its structure, rules and indexes match how the app is actually used. A demo with three test users can look fine even if every dashboard loads an entire table. With 50,000 records the same page may take ten seconds or time out.

Check these in plain terms:

  • Schema design: is data in clear tables (customers, orders, invoices), or stuffed into large catch-all JSON fields that are hard to query and validate?

  • Relationships: does each order point to a real customer, so deleting one does not leave orphaned records?

  • Unique constraints: can two accounts share the same email, or one invoice number appear twice?

  • Data validation: does the database reject impossible values, such as an end date before a start date?

  • Indexes: are the columns you search and filter on indexed? Supabase specifically recommends indexing columns used in RLS policies.

  • Access policies: covered above, and the single most important item for Supabase-backed apps.

  • Migrations: are database changes recorded as repeatable scripts, or made by hand in a dashboard?

  • Backups: are they automatic, and has anyone restored one?

  • Concurrency: what happens when two people edit the same record, or two purchases claim the last item?

How do you know whether a vibe-coded app can scale?

Scaling is about whether the app stays fast, affordable and correct as usage grows, not only whether the server crashes. Most founders do not need hyperscale architecture before launch. The goal is an architecture that fits expected early usage plus a clear path to the next stage.

The usual early bottlenecks:

  • Database queries that fetch far more data than the page shows, or run once per row.

  • API calls made on every page load that could be cached.

  • Third-party rate limits on email, maps or AI providers that you will hit before your own servers struggle.

  • File storage for uploads with no size limit.

  • Missing background jobs, so slow work (sending emails, generating reports) runs while the user waits.

  • Concurrent requests that collide, such as double bookings.

  • Serverless limits on execution time and memory for long tasks.

  • Expensive AI calls with no per-user limit, which turn one heavy user into a large bill. The same discipline applies to AI automation workflows that call models in the background.

  • Frontend weight: large bundles and images that make mobile users wait.

A reasonable target for launch: you know your expected users for the next six months, the main pages stay fast with ten times today's data, and every paid API has a spending cap.

What changes when real money is involved?

Once an app takes payments, the payment status must come from your payment provider's verified server events, never from the browser. Browser code can be edited by anyone using it. If your app marks an order as paid because the checkout page said so, someone can mark it paid without paying.

That risk is documented. In his CVE-2025-48757 write-up, Matt Palmer reported inserting a record with "payment_status": "paid" directly into a Lovable-built site's database, bypassing its Stripe integration (source).

Using Stripe as the example, Stripe's webhook documentation covers the checks that matter:

  • Server-side verification: confirm each webhook's signature with your signing secret before acting on it.

  • Duplicate events: Stripe may send the same event more than once, so record processed event IDs and skip repeats.

  • Event order: events are not guaranteed to arrive in order, so do not assume "created" comes before "paid".

  • Fast responses: return a success response quickly and do heavy work afterwards, or Stripe will retry.

  • Failed payments and refunds: handle declined cards, refunds and disputes, not only successful charges.

  • Subscription state: keep each user's plan in sync with the provider, including cancellations and failed renewals.

  • Authorization: make sure users cannot change their own plan, credits or price through the API.

  • Secret keys: keep the Stripe secret key and webhook secret on the server only.

Test all of these in Stripe's test mode before launch, including a failed card and a refund.

Does my app need HIPAA, SOC 2, GDPR or ADA compliance?

It depends on your business, your users, the data you hold and where you operate. No AI coding tool handles these obligations for you, and a code audit cannot certify compliance. It can only flag gaps for you and your advisors to review. Whether a specific law or requirement applies is a question for legal counsel.

HIPAA

The Health Insurance Portability and Accountability Act applies in the United States to "covered entities" (most healthcare providers, health plans and clearinghouses) and to the "business associates" that handle protected health information for them (HHS). A wellness app that never works with providers or insurers may fall outside HIPAA, while a tool sold to clinics usually falls inside it. If it applies, you need safeguards such as access controls, audit logs and encryption, and signed business associate agreements with vendors that touch the data. HHS adjusts HIPAA civil penalties for inflation each year.

SOC 2

SOC 2 is not a law and not a certification. It is an attestation report: an independent CPA firm examines your controls against the AICPA's Trust Services Criteria, which cover security, availability, processing integrity, confidentiality and privacy (AICPA Trust Services Criteria). Business customers often ask for a SOC 2 report during procurement. If you sell to companies, good logging, access control and change management now make a future SOC 2 much easier.

GDPR

The General Data Protection Regulation can apply to businesses outside Europe when they offer goods or services to people in the EU or monitor their behavior (GDPR, Article 3). It covers personal data such as names, emails and IP addresses. Practical implications include a lawful basis for processing, the ability to export or delete a user's data, and appropriate security. The highest tier of fines reaches €20 million or 4% of worldwide annual turnover, whichever is higher (Article 83).

Accessibility and the ADA

U.S. web accessibility obligations under the Americans with Disabilities Act depend on context. For state and local governments, the Department of Justice adopted WCAG 2.1 Level AA as the technical standard in 2024 (ADA.gov fact sheet), and in April 2026 an interim final rule extended the first compliance dates by a year (DOJ interim final rule). For private businesses the regulations name no specific standard, but the W3C's WCAG guidelines are the common technical reference. Practical basics: keyboard navigation, labeled form fields, readable contrast and alt text on meaningful images. Accessibility is cheapest to get right at the UI/UX design stage.

What happens when something breaks at 2 AM?

A production app should tell you about failures before your users do. In a demo, you are the only user, so you see every error. In production, most users who hit an error simply leave.

The minimum setup:

  • Application logs that record errors with enough detail to reproduce them, without logging passwords or keys.

  • Error tracking that groups crashes and alerts you, such as Sentry or your host's built-in tool.

  • Uptime monitoring that checks your main pages every few minutes.

  • Alerting that reaches your phone for outages and payment failures.

  • Database monitoring for slow queries and storage limits.

  • Backups on an automatic schedule, stored separately from the live database.

  • Recovery you have rehearsed at least once.

  • Rollback, a one-step way to return to the last working release.

"I clicked through it and it worked" is not a test plan

Clicking through your app tests the happy path once. A test plan checks the risky paths every time you change something. Most MVPs do not need enterprise-level test coverage. They do need tests on the flows where a failure costs money, data or trust.

The main kinds of testing, in plain terms:

  • Unit tests check one small piece of logic, such as a price calculation.

  • Integration tests check that parts work together, such as your API saving to the database.

  • End-to-end tests drive a real browser through a full flow like signup to checkout.

  • Permission tests confirm that user A cannot read or change user B's data. Supabase's docs include a pattern for testing RLS policies this way.

  • Negative tests confirm the app rejects bad input and unauthorized actions.

  • Mobile and browser tests cover Safari, small screens and slow connections. Native apps need device testing too; see mobile app development.

  • Payment tests run in test mode: success, decline, refund, duplicate webhook.

  • Error-state tests check what users see when an API or service is down.

Start with the five flows that would hurt most if they broke. For most apps that is signup and login, permissions, payments, the core action users pay for, and data export or deletion.

A 15-minute production-readiness test for non-technical founders

You can catch many of the most serious problems yourself, without reading code, in about 15 minutes. Only test apps you own or are authorized to assess, and use a staging copy or test accounts so you never touch real customer data.

  • 1. Create two separate user accounts. Use two browsers, or one normal window and one private window. Call them User A and User B.

  • 2. Create private data as User A. Add a project, invoice or note that only User A should see.

  • 3. Change IDs in the URL. As User B, open a similar page and change the ID in the address bar to User A's record. You should get an error or an empty page.

  • 4. Check whether one account can see another's data. Look at lists, search results, dashboards and exports as User B. Nothing of User A's should appear.

  • 5. Search your public code for secrets. In your browser's developer tools (Sources tab), search the loaded JavaScript for sk_, service_role, sb_secret, secret and OPENAI. If your repository is public on GitHub, search it the same way. A publishable key is expected; a secret key is not.

  • 6. Test password reset. Request a reset, use the link, then try the same link again. It should not work twice.

  • 7. Test logout and session expiry. Log out, press the browser's back button and refresh. You should be asked to sign in again.

  • 8. Enter unexpected values into important forms. Try a negative price, a quantity of 1,000,000, an empty required field and a very long paragraph. The app should reject or handle each one.

  • 9. Test a failed payment. In your payment provider's test mode, use a test card that is designed to be declined. The app should not grant access.

  • 10. Disconnect during a critical action. Turn off Wi-Fi halfway through saving or paying, then reconnect. Check for a duplicated, missing or half-saved record.

  • 11. Trigger duplicate submissions. Double-click "Submit" or "Pay" quickly. You should get one record and one charge.

  • 12. Test on a phone. Complete signup and the core action on a real phone over mobile data.

  • 13. Verify backups. Find your database backup settings and confirm when the last backup ran. If you can, restore one to a test project.

  • 14. Confirm error monitoring exists. Trigger a harmless error and check whether anyone gets notified.

  • 15. Review admin permissions and production settings. List who has admin access to the app, the database, hosting and payments. Remove anyone who no longer needs it, turn on two-factor authentication, and confirm production uses its own database and keys.

If every item passes, you have ruled out several common and serious problems. You have not ruled out issues that only show up in the code, such as an unprotected API route your interface never calls.

Stop the launch if you find any of these

Any one of these findings is a reason to pause the launch until it is fixed. Each can expose user data, money or control of the app.

  • Users can see or change another user's private records.

  • Administrative pages or actions work for normal users, or for people who are not signed in.

  • A privileged secret (database secret key, Stripe secret key, AI provider key) is visible in browser code, a mobile build or a public repository.

  • Payment status, plan or credits can be changed without verification on the server.

  • Sensitive data, such as IDs, health information or financial records, is reachable without signing in.

  • No backup exists for critical data, or nobody has confirmed a backup can be restored.

  • Production data is mixed with test data, or AI agents and test scripts can write to the live database.

  • Major errors fail silently, with no logs or alerts.

  • There is no clear way to roll back a bad release in an emergency.

If you found a leaked secret, rotate it (create a new key and revoke the old one) as soon as the code no longer depends on it. Removing it from the code is not enough, because the old key may already be copied.

Should you fix, harden or rebuild your vibe-coded app?

Most vibe-coded apps do not need a rebuild. The right answer depends on whether the core architecture can safely support what the product must do. The tool that generated the app does not decide this. The findings do.

There are four realistic outcomes:

  • Fix. Individual defects can be corrected without changing the architecture. Example: one table is missing an RLS policy, and a form lacks validation.

  • Harden. The core architecture is usable, but the app needs systematic production work: secrets moved server-side, policies on every table, webhook verification, tests on key flows, monitoring and backups.

  • Partial rebuild. One subsystem, such as authentication, the data layer or payments, is built in a way that cannot be patched safely, so it is replaced while the rest stays.

  • Full rebuild. The fundamental architecture cannot support key requirements, such as multi-tenant data separation or a compliance obligation, and continued patching would cost more or carry more risk than rebuilding.

Finding Likely direction UI works, a few minor bugs and isolated security gaps Fix Core architecture sound, but security, testing and monitoring gaps across the app Harden Authentication or data-access layer fundamentally flawed, rest of the app reasonable Partial rebuild may be appropriate Payments logic runs in the browser and is woven through many features Partial rebuild of payments may be appropriate Architecture cannot support key requirements (multi-tenancy, compliance, expected scale) Full rebuild may be appropriate Every new feature breaks existing ones and nobody can explain the data model Full rebuild may be appropriate; confirm with an audit first

A rebuild also does not mean throwing the work away. Your AI-built version is a detailed, tested specification of what users want, which makes a rebuild faster and better informed than starting from a blank page. Planning that scope is closer to an MVP roadmap than a business plan, and the Vesties case study shows what a full custom build covers, from every user role to every error state.

What does a professional vibe-coded app audit actually check?

An AI-generated code audit combines automated scanning with a manual review of the code, configuration and architecture, then ranks every finding by severity. The goal is evidence: what is wrong, how serious it is, and what it would take to fix.

A thorough audit covers:

  • Automated scanning for exposed secrets, vulnerable dependencies and known insecure patterns.

  • Manual code review of the logic that scanners cannot judge.

  • Authentication: signup, login, sessions, password reset and admin access.

  • Authorization: whether every route and action checks who is asking.

  • Database access, including RLS policies where the stack uses them.

  • Secrets management: where keys live, who can see them and how they are rotated.

  • Dependency risks: outdated or abandoned packages.

  • API security and input validation on every endpoint, including ones the interface never calls.

  • Payments: webhook verification, duplicates, refunds and subscription state.

  • Deployment configuration: environment separation, production settings and access.

  • Logging, error handling and monitoring.

  • Scalability and data architecture: queries, indexes, data model and growth limits.

  • Compliance gap flags for HIPAA, SOC 2, GDPR or accessibility, where relevant.

  • Technical debt and remediation priorities: what to fix first and roughly how long it takes.

Why both automated and manual review? Scanners are fast and consistent at spotting patterns, such as a secret key in a file or a known vulnerable package. They cannot tell whether a sales rep should see every customer or only their own; that is a business rule. Manual reviewers understand intent but can miss what a tool catches in seconds. Each covers the other's blind spots.

What severity-rated findings look like

A useful report ranks each finding so you know what blocks launch and what can wait. Techallin's reports use four levels:

  • Critical: could expose sensitive data, accounts, money or administrative access. Fix before anyone else uses the app.

  • High: a major security or reliability issue. Fix before launch.

  • Medium: a meaningful risk to schedule soon, ideally before you scale marketing.

  • Low: an improvement or technical-debt item with limited immediate impact.

These labels are a practical way to prioritize. They are not a universal scoring standard, and other auditors may use different scales.

Professional audit vs DIY checklist

Area Founder self-check Professional audit Basic functional testing Strong Strong Authentication configuration Limited Detailed Authorization across every route Difficult Detailed Code-level review Limited Strong Secrets Basic checks Detailed, including history and rotation Architecture and data model Difficult Detailed Security testing Limited to what the interface exposes Stronger, including direct API requests Compliance gaps Limited Review and flagging (not certification) Fix vs rebuild decision Subjective Evidence-based, with effort estimates

The self-check is genuinely useful: it catches many of the issues that cause public incidents, and it costs nothing. The audit earns its cost where the risk lives in code you cannot see from the interface.

Frequently asked questions

How do I know if my vibe-coded app is ready for production?

Check that users can only access their own data, privileged secrets stay on the server, payments are verified server-side, inputs are validated, errors are logged and alerted, backups are tested, and you can roll back a release. The 15-minute self-audit above covers the parts you can test from the interface.

Is a Lovable app safe to launch?

It can be. Safety depends on your database rules, authentication and secrets, not the fact that Lovable built it. Run Lovable's Basic and Deep security scans, confirm RLS is enabled with correct policies on every table, and test with two accounts before launch.

Is a Bolt app production-ready?

Not automatically. Check which logic runs in the browser, make sure no secret sits in a VITE_ variable or frontend file, verify database access rules, and test payments and permissions with real scenarios.

Can a Replit Agent app be used in production?

Yes, with the right setup. Confirm the app uses separate development and production databases, deployment secrets are set separately, backups exist, and the agent cannot run destructive commands against live data.

Is code generated with Cursor safe?

Cursor-generated code is as safe as the review it receives. Treat accepted suggestions like code from a new developer: check permissions on every route, keep secrets out of the repository, add tests for risky flows and review new dependencies.

What breaks first when a vibe-coded app gets real users?

Usually authorization (users reaching data they should not), then edge cases in forms and payments, then performance as data grows. Authorization gaps are the most damaging because they expose other people's data.

How do I fix a vibe-coded app?

Start by finding out what is actually wrong: run the self-audit, then get a code-level review if anything is unclear. Fix critical issues first (data exposure, secrets, payments), then harden the rest with tests, monitoring and backups. Decide on any rebuild only after you have the findings.

Should I fix or rebuild my AI-built app?

Fix or harden when the core architecture is sound. Consider a partial rebuild when one subsystem, like authentication or payments, is fundamentally flawed. Consider a full rebuild only when the architecture cannot support key requirements. The decision should come from evidence, not from which tool built the app.

What is an AI-generated code audit?

It is a review of an app built with AI tools that combines automated scanning with manual code review. It checks authentication, authorization, database access, secrets, payments, deployment and architecture, then ranks findings by severity with a recommended fix.

How much does a vibe-coded app audit cost?

Cost depends on codebase size, architecture, number of integrations, authentication and database complexity, payment flows and compliance needs. Techallin's Vibe to Production Assess tier is a fixed fee of $1,500 to $2,500 and takes 3 to 5 business days, with a free 30-minute call first.

Can an AI-built app scale?

Yes, if its data model, queries and infrastructure suit the expected load. Most early apps need efficient queries, indexes, caching for repeated calls and limits on expensive APIs, not a hyperscale architecture.

Do vibe-coded apps need security testing?

Yes, like any app that stores user data or takes payments. AI tools generate working code quickly but do not reliably add security unless asked, so login, permissions, data access and payments need deliberate testing.

Get a second opinion before you launch

Not sure whether your AI-built app needs a few fixes or a deeper rebuild? Techallin's vibe-coded app audit and rescue service, Vibe to Production, starts with an assessment that gives you the evidence to decide.

The Assess tier is a fixed fee of $1,500 to $2,500 and takes 3 to 5 business days. It includes:

  • Automated and manual security scanning

  • Architecture and scalability review

  • Secrets and API key exposure check

  • Authentication and data access audit

  • Compliance gap flags (HIPAA, SOC 2, GDPR, ADA)

  • A severity-rated findings report (Critical, High, Medium, Low)

  • A fix-or-rebuild recommendation with hour estimates

  • A plain-language summary you can share with co-founders or investors

An audit cannot guarantee that an app is free of vulnerabilities or certify compliance. What it gives you is a clear, prioritized picture of what needs attention before launch. If you decide to go further, the audit fee is credited toward remediation. If the findings point to a rebuild, Techallin's custom software development team can take it from there.

It starts with a free 30-minute call. Share your app and stack, and the team will tell you whether an audit makes sense, or whether you are in better shape than you think.

Book a production-readiness assessment →

Ready to ship your AI app?

We audit, fix, and harden AI-built apps for production.

Get an audit
Is Your Vibe-Coded App Production-Ready? A Founder Checklist | Techallin