v0 and Lovable build React/Next projects, not single files — so "export" means a folder or a public deploy, neither of which is a quiet private link. Here's how to get a clean build and share the static slice privately.
You finished a page in v0. It looks right in the preview pane. You want to send it to one person — a client, a teammate, a friend whose opinion you trust — without putting it on the public internet first. So you go looking for the export button.
And you find two: Download ZIP and Deploy. Neither does what you pictured. The ZIP is a folder of source code that won't open by double-clicking. The deploy publishes a live, public URL on shared infrastructure. There's no "give me one quiet thing I can hand to one person" button, because v0 and Lovable were never building one file. They were building a project — and the preview pane you've been staring at is rendered by their server, not by a file you own yet.
That gap — between what these tools produce and what private sharing needs — is the whole story here. Once you see the shape of the output clearly, the clean path is obvious.
Both tools generate a React/Next.js project, not a webpage. That's a real distinction with consequences.
components/ directory, a package.json, config files, Tailwind setup. Open the ZIP, double-click index.html, and nothing happens — there is no index.html. It's source that needs a build step before a browser can run it. (A ZIP viewer lists what is actually inside without extracting anything, which is the fastest way to see whether there is an entry page at all.)So the raw export is source code, and the deploy is a public URL. The thing in between — a runnable bundle you can share privately — is something you produce yourself, in one step, and it's easier than it sounds.
A React/Next project becomes browser-ready when you build it. The build turns source into a folder of plain static files — HTML, CSS, JS, assets — that any browser can serve without a Node process running.
For most v0 pages and many Lovable front-ends, that's a static export:
Build this as a static site with no server runtime. Output plain static files to a
distoroutfolder —index.htmlas the entry, with bundled CSS and JS and all assets, so it runs by openingindex.htmlin a browser with nonpm start.
After the build you have a folder. That folder is the real deliverable. It's not one file — it's index.html plus its bundled assets, referencing each other by relative path, exactly as they did in the preview. And a folder of static files is something you can share privately without deploying it.
(If you'd rather skip the project entirely and get a genuine single file, that's a different request made at generation time — ask the model to build a vanilla single-page HTML instead of a React app. The portable-export prompt patterns cover that route. But for an app you've already built in v0 or Lovable, building the project is faster than rewriting it.)
Built the project? Zip the output folder and drop it. miinideck unpacks it and serves the whole app at one private link — relative paths intact, nothing public unless you say so. No card, no account for you, no account for the person who opens it.
You can. For some apps you should — and we'll get to exactly which ones. But for a private review, a public deploy carries baggage the moment doesn't need.
A deploy is public by default. It's discoverable, it's indexed, and it lives until you remember to tear it down. For a finished product, that's correct. For "tell me if this v0 layout works before I show the client," it's the wrong altitude — you've published a thing to share it with one person.
The private-link path inverts that default. The bundle is private and no-index from the start. The link is unguessable. Anyone you send it to opens it with no account; anyone you didn't send it to never finds it. When the review's over, you let it expire or delete it. "Anyone can see it" means anyone you handed the link to — not the public.
You also get review controls that fit a draft: a password on the link when the page is sensitive, and a record of who actually opened it so you know whether your reviewer has looked yet. Those are sharing concerns, not hosting concerns, and they belong on the link.
Here's where the static path stops, and it's worth being plain about it.
The build-and-share route works because the app's logic runs entirely in the browser. That's true for most v0 prototypes and a lot of Lovable pages — they're front-ends. But the moment your app needs a server at runtime, static files aren't enough.
You need a real host when the app has:
app/api/ handlers, server actions.For those, host on Vercel or Netlify. That's precisely what they're built for: they run the server, handle the routes, manage the environment, and give you a production URL with a backend behind it. Trying to flatten a backend app into static files won't work, and you shouldn't fight it.
The line is clean: server logic → Vercel or Netlify. Static front-end → a private link. A surprising number of "apps" from v0 and Lovable are front-end-only — a landing page, a calculator, an interactive mockup, a dashboard with hard-coded data. Those are the ones that fit the quiet-link path, and they're the common case for a review.
One last check, because an export that renders in v0's preview pane can still break for a stranger. AI-built pages often reach out to CDNs, Google Fonts, or a dev backend — references that resolve inside the tool's environment and 404 on someone else's network. A proper static build bundles its own assets, which is most of the fix. The proof is empirical: open the built artifact on a different network or device before you send it. If it renders there, it renders for your reviewer.
That's the whole arc. v0 and Lovable build projects, not files — so you build the project into static output, share the static slice at a default-private link, and send the backend-having apps to the host that's built for backends. If your app is the static kind, you can share a v0 build or share a Lovable app in the time it takes to zip the folder.
AI tools default to modular HTML — clean for development, fragile for one-file delivery. Cross-tool prompt templates that produce a single portable file from the first generation.
AI-built pages default to clean, static, and slightly bland. Four animation patterns and the cross-tool prompt templates that bring them in — without dragging in a heavy library.
Prompt patterns that get Claude, ChatGPT, v0, Lovable, and Cursor to ship self-contained, lightweight, interactive HTML you can actually send as a link.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.