Bolt.new previews live behind a session URL that changes and can lapse. How to pull a static export — one HTML file or a built dist folder — out of Bolt and turn it into one stable, private link.
A bolt.new preview is a live WebContainer — a full dev environment running inside the browser tab, serving your app the same way npm run dev serves it on your own machine. That's why it feels instant. It's also why the URL you paste into a message has a half-life. Close the tab, hit an idle timeout, or start your next project, and the address goes cold. The work didn't break — the session it was attached to did.
So the deliverable isn't the preview. It's the build the preview was running. This post is about pulling that static export out of Bolt and turning it into a link that holds still.
The preview pane is a session, not a destination. That has three consequences for anything you send to another person:
The fix is to stop sending the session and start sending the build: the finished output, frozen, in files you control.
Bolt projects don't all export the same way, and which one you have decides what you hand off.
Shape one — a single self-contained HTML file. If you ask Bolt for a one-page build with styles and scripts inlined (try the prompt: "make this a single self-contained index.html, no external dependencies"), you can download that one file from the file tree. Everything lives inside it. This is the cleanest possible deliverable: one file, opens anywhere, nothing to wire up.
Shape two — a built dist folder. Most "build me an app" projects in Bolt are Vite or framework apps. They don't live as one file — they compile to one. Run the build (npm run build in Bolt's terminal, or in a local clone) and you get a dist or build folder: an index.html plus hashed JS and CSS bundles and an /assets directory. The files reference each other by relative path. That folder, intact, is your static export.
The difference matters for how you move it, not whether it works. Shape one travels as a file. Shape two has to travel as a folder — keep the structure, because flattening it breaks the relative paths the bundler wrote.
Single index.html? Drop the file. A dist folder? Zip it and drop the zip — it unpacks and serves with the relative paths intact. One private link in seconds, no build step, no account.
Some Bolt apps are pure frontend — a calculator, a landing page, an interactive chart, a tool that runs entirely in the browser. For those, the static export is the whole app. The page, its logic, and its data all live in the files, so a static link is a complete, faithful copy.
But Bolt also builds apps with a back end. If your project calls an API route, reads from a database, signs in users, or holds a key it isn't supposed to expose, then npm run build only freezes the frontend. The server half doesn't come along — it needs a host that actually runs code on request.
That's not a static-hosting job. Vercel and Netlify are the right tools for an app with a live backend: they run your server functions, manage your environment secrets, and keep the data layer alive. Reach for them when the app genuinely needs a server.
A static link owns the other slice, and it's a wide one:
Knowing which half you're sending is the whole decision. Self-contained or a snapshot → static link. Live data and accounts → a backend host.
Once you have the static export, the move is short. You don't need a deploy pipeline for a finished build — a deploy stands up a host, a build step, and a public address, which is more than a review or a handoff needs.
index.html, or run the build and grab the dist folder.index.html. If it renders the way the preview did, the build is clean. If a chart or font is missing, it was loading from somewhere external — worth catching before you send it.dist folder zips and drops — it unpacks server-side and serves index.html as the entry, relative paths intact, exactly as it ran locally.What you get back is one unguessable link that's private by default and kept out of search engines. It points at the build, not a session, so it doesn't lapse when you close a tab or start your next project. The viewer needs no account — they click and it opens.
From there the controls are yours: add a password if the build is sensitive, set an expiry if it's a time-boxed review, or give it a link that simply never expires if it's a keeper. None of it requires touching the Bolt project again — the export stands on its own.
A bolt.new preview is a live session, so its URL is a working address, not a home. Export the build instead — one self-contained index.html, or the dist folder a Vite project compiles to. If the app needs a server, send it to Vercel or Netlify and let them run the code; if it's self-contained or you're sharing a frontend snapshot, drop the static export and get one stable, private link that holds still after you've moved on to the next prompt.
Cursor builds projects as folders of linked files, not one shareable artifact. Three reliable ways to collapse a Cursor build into a single self-contained HTML you can drop on a private link — and the one case where you deploy instead.
A Replit webview link dies when the repl sleeps. If your build is static, you can lift the output out of the container and serve it from a link that never spins down. Here is the export path — and the honest line where it stops applying.
Desktop preview says the page is fine. The phone disagrees, and you find out after the client already has the link. Here's the loop that catches it first — and the part of the problem no host can fix for you.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.