aliteq.

The 6 things to check in your v0 app before you ship

v0 turns a prompt into a real Next.js app on Vercel — but it doesn't decide who's allowed to see your data. Six things to check before you ship, starting with the one Next.js setting that quietly puts keys in the browser.

Sam OrtegaUpdated 1h ago7 min readWeb story
Editorial illustration of a hand over a generated app-interface mock ringed by six small padlock and shield check marks
Share

If you turned a prompt into a working app with v0, the hard creative part is done. This isn't about v0 being unsafe — its docs describe it as "an AI-powered development platform for building production-ready applications from natural-language prompts," built on "modern tools like Next.js, Tailwind, shadcn/ui, and more." Because it generates a Next.js app and deploys it on Vercel, most of these checks are Vercel and database settings. What no tool reliably does for you is decide who's allowed to see what — so here are six things to confirm before you ship, with where each one lives. Facts here were read on v0's own docs and Vercel's docs on 26 Sep 2026.

Editorial illustration of a hand over a generated app-interface mock ringed by six small padlock and shield check marks
Six checks before you ship — most are settings, not code. · Illustration made in Higgsfield with the GPT Image model

One person can't see, change or delete another person's data

Nothing secret is behind a NEXT_PUBLIC_ variable — that prefix ships to the browser

API keys live in Vercel's environment variables, not hardcoded

There's a limit on how fast one account can sign up or call your AI features

The database you attached is backed up and you know how you'd restore it

You've reviewed what v0 built, not trusted the first version

1. Make sure people can't reach each other's data

The mistake behind the biggest vibe-coded exposures is a database that lets anyone read or edit rows that aren't theirs. v0's docs say you "Build full-stack applications with v0's database integrations" — so you attach a database (Supabase, Neon or another), and the rule that stops people reading each other's rows is yours to confirm. On a Postgres database like Supabase or Neon, that rule is Row Level Security (RLS): a policy on each table for which rows each person may see. The check is to confirm every table has one, in that database's dashboard. The concept is in Row Level Security explained, a correct policy is in write the RLS policy for my users table, and the incident that proves it is the Moltbook exposure. If "server" and "database" are fuzzy, start with what a backend actually is.

2. Keep secret keys out of the browser — mind the NEXT_PUBLIC_ trap

Anything your app sends to the browser, anyone can read. Because v0 builds a Next.js app, this comes down to one naming rule that Vercel's docs state plainly: "Frameworks typically use a prefix to expose environment variables to the browser." For Next.js, that prefix is NEXT_PUBLIC_ — any variable named that way is bundled into the page and visible to anyone who opens their browser's developer tools. So the check is simple but crucial: nothing sensitive — no database service key, no third-party secret — may sit behind a NEXT_PUBLIC_ name. Those are for values that are safe to be public (like a project URL). The view-source reality is in your API keys are in the browser.

3. Put keys in Vercel's environment variables

Your secret keys belong in Vercel's environment variables (Project → Settings → Environment Variables), read by your app's server-side code — not hardcoded, and not given a NEXT_PUBLIC_ name. The practical rule: a value the browser needs (safe, public) can carry the prefix; a value that must stay secret must not. What environment variables are, and why the .env file must never be committed, is in environment variables and secrets, explained.

4. Put a limit on sign-ups and AI calls

A rate limit caps how often one person or script can do something; without it, a single loop can create thousands of accounts or burn your AI budget in a night. Neither v0 nor a plain Vercel deployment adds a per-endpoint rate limit for you, so treat this as "check your project": ask v0 to add rate limiting to sign-up and to any endpoint that calls a paid AI model, then confirm what happens if one account sends a thousand requests a minute. Why every public endpoint needs one is in what is rate limiting.

5. Back up the database you attached

A bad change or a wrong prompt can delete data, and "undo" isn't a backup. v0 stores your data in whatever database you connected, so what's retained and how far back you can restore depends on that database's plan — check your project rather than assume. Find its backup settings, confirm they're on, and once, confirm you could restore. Why this matters, including an AI agent that deleted a live database, is in backups, and losing everything.

6. Review what v0 built — don't trust the first answer

v0 writes a lot of code quickly, and the first version is a draft, not a verdict. After the Moltbook exposure, Wiz's researchers wrote that "today's AI tools don't yet reason about security posture or access controls on a developer's behalf." The habit that catches the rest is to make the model check its own work: after it builds an auth or data feature, ask it to find ways one user could reach another's data, name any table without a policy, and flag any secret sitting behind a NEXT_PUBLIC_ name. That generate-then-attack loop is in the verify loop. For the tool-agnostic version of all six, see the 6 checks before you share a vibe-coded app.

Quick answers

What is the NEXT_PUBLIC_ trap in a v0 app?
v0 builds a Next.js app, and Vercel's docs note frameworks "use a prefix to expose environment variables to the browser." For Next.js that prefix is NEXT_PUBLIC_, so any variable named that way is bundled into the page and readable by anyone. Never put a secret key behind it.
Where do I store secret keys for a v0 app?
In Vercel's environment variables (Project Settings), without the NEXT_PUBLIC_ prefix so they stay server-side. Only values that are safe to be public — like a project URL — should carry that prefix.
Does v0 handle security for me?
v0 generates a real, production-oriented Next.js app, but it doesn't decide who can see whose data, add rate limits, or back up your database — those live in your database and Vercel settings and are yours to confirm.
Do I need to read code for these checks?
Mostly no. Access rules and backups are dashboard checks; keys are a naming rule in Vercel's settings; rate limits and the review are things you ask v0 for and then confirm. If the answers don't make sense, that's when to bring in a developer.

This page has no affiliate links or sponsored placements. Security advice is only useful if nobody's paying for it. It isn't a substitute for a security review: if your app holds other people's personal data, payments or health information, have a developer or a security professional look at it before launch.

Found this useful? Share it

Share
Sam Ortega

Build Editor

Sam Ortega

Sam explains what's actually happening when you build software by talking to an AI — what the model is doing, what's really running your app, and where the sharp edges are. No jargon without a picture, no hype, and an honest 'hire someone' when that's the answer.

The Aliteq brief

The tech worth knowing — hardware, AI, gaming, deals. No spam, unsubscribe anytime.

Keep reading