AI App Builder Audits · AI Development Series
v0 produces the best-looking output of anything in this category. The interface is rarely the problem. What sits behind it is worth a proper look.
v0 began life as a user interface generator and has grown into something closer to a full application builder. That history matters, because it shapes what tends to be solid and what tends to be thin: the front end is usually excellent, and the data and security layer is usually the part that was added later.
Next.js blurs the line between client and server more than most frameworks, deliberately. A component can run on the server, a function can be called from the browser as though it were local, and data fetching can happen in either place. When it is understood, this is powerful. When it is generated, it is the single most common source of security mistakes we see in Next.js applications.
The specific thing worth knowing: a Server Action is not a private function. It compiles down to a publicly reachable HTTP endpoint. Anyone can call it directly with whatever arguments they like, whether or not your interface offers them a way to.
These are the issues that recur in generated Next.js applications, and the first two are close to universal.
Because a Server Action is written like an ordinary function and called like one, generated code routinely treats it as though only the page that uses it can reach it. In reality it is an open endpoint. If it takes a record identifier and acts on it without checking who is asking and what they are entitled to, it will do that for anybody.
The interface never offers a user the chance to delete someone else's record, so it never comes up in testing. Calling the endpoint directly is not difficult, and every action needs to re-establish identity and permission for itself.
What it costs you: any visitor able to read or modify data through actions meant for one user.Next.js will send any environment variable prefixed with NEXT_PUBLIC_ to the browser, embedded in the JavaScript bundle. That is exactly how it is supposed to work, and it is fine for things like a public site URL.
It stops being fine when a database URL, a service key or a third-party API key ends up with that prefix, usually because it was the quickest way to make something work during the build. Anyone can read it out of the page. We check every variable that crosses that line.
What it costs you: credentials in public, and bills run up on your accounts.v0 produces genuinely well-built interfaces — accessible components, sensible structure, good responsive behaviour. The database underneath is frequently an afterthought: tables shaped around the screens that were designed rather than the business being modelled, missing indexes, and no constraints preventing invalid combinations.
This is the finding that determines whether an application can be repaired or has to be rebuilt, so it is worth knowing early rather than after another six months of building on top of it.
What it costs you: a rebuild you were trying to avoid, arriving later and costing more.Next.js caches aggressively by default, and the rules about what gets cached and for how long are genuinely subtle. Generated code often does not set them explicitly.
The worst case is a page holding personal data being cached and then served to a different visitor. It is uncommon but not rare, it is very hard to spot from the inside, and the consequences are serious enough that we check it on every Next.js application we look at.
What it costs you: one customer being shown another customer's information.v0 is the strongest tool in this category for anything user-facing. The components it produces are well structured and accessible, it uses mainstream libraries rather than inventing its own, and the code is clean enough that a developer can pick it up without wincing.
The honest summary: v0 gives you the best front end of anything in this category, and the quality of the interface can make the application feel more finished than it is. The work that remains is almost always behind it, not in front of it.
In one narrow sense, yes: if you only ever used it to generate components and built the backend yourself, there is far less that can go wrong, because it was not making decisions about your data. That is no longer how most people use it. Once v0 is generating Server Actions and database access, it carries the same risks as any other generator, with a few that are specific to Next.js.
The code, in a GitHub repository or as an export, and read-only access to the database. If you are hosting on Vercel, sight of the environment variable configuration is useful too, since that is where several of the common problems live. We will not change anything or deploy anything.
No, and we would rather say so plainly than pretend otherwise. We build with Claude Code and Cursor, with senior developers designing the system, reviewing every change and testing it. What makes us useful here is not v0 expertise, it is that v0 produces Next.js, React, TypeScript and PostgreSQL, which is what we have been building and fixing for years.
We audit what these tools produce, whichever one you used.
Tell us roughly what you built and how many people use it. If an audit is not the right thing for you, we will say so.
What the report covers:
We reply within one working day.