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.
You built something in Replit over a weekend. It runs, the webview shows it, you copy the URL and send it to someone who should see it. Monday they reply: "the link's just spinning." It isn't broken. The repl went to sleep.
That's the thing most people miss about a Replit link. It isn't a link to your app — it's a link to a container running your app. On the free and starter tiers, the container sleeps after a stretch of no activity. The webview URL stays the same, but behind it the machine has powered down, so the visitor gets a loading state or a wake-up screen while the repl boots back up. For a personal project that's a minor annoyance. For something you sent a client, a recruiter, or an investor, it reads as "this person ships things that don't stay up."
The fix isn't a paid tier that keeps the repl awake forever. If what you're sharing is static, the fix is to stop sharing the container at all — to lift the built files out and put them somewhere with no machine to wake.
Before you touch the export, answer one question: does your app need a server to function, or only to be built?
A lot of Replit projects — especially the AI-built and vibe-coded kind — are static once they're built. A Vite or React frontend, an Astro site, a plain HTML page, a calculator, a dashboard with the data baked in. The repl runs Node during development to serve and hot-reload it, but the finished output is just files. Open those files in any browser and they work, with no Node, no database, no container.
The other kind genuinely needs a server at runtime. An Express or Flask app with routes. Anything reading or writing a database that lives in the repl. Server-side auth. Anything pulling Replit secrets when a user clicks something. For these, there's nothing to "export" into a static link — the link would load the page and then fail the moment it tries to talk to the missing backend.
So the test is concrete: watch what the running app talks to. If every byte of data is already on the page or fetched from an external API the browser can reach on its own, you're static. If clicking around hits routes the repl serves, you're not. Be honest here — a static export of a backend app produces a page that looks fine until the first button does nothing.
Assuming you're on the static side, here's the path. It's shorter than it looks.
1. Build for production. In the Replit shell, run your project's build command — npm run build for most Vite/React/Astro setups. This is the step that turns your source into plain, optimized files. The dev server you've been watching in the webview is not the output; the build command produces it.
2. Find the output folder. Vite and most React setups drop everything into dist/. Create React App and some others use build/. Astro uses dist/ too. Open the file tree in Replit and you'll see it appear after the build finishes — a folder of .html, .css, .js, and assets, no source code.
3. Download it. Right-click the output folder in the Replit file panel and download it as a zip. That zip is your entire app, frozen. No container required.
4. Open it locally first. Unzip and double-click index.html. If it renders correctly straight from your filesystem, it's truly static and portable. If it shows a blank page or a console full of failed requests, something is still reaching for a server — back to the split above.
One gotcha worth naming: builds sometimes assume they live at the root of a domain and reference assets with absolute paths like /assets/app.js. Opened from a subfolder, those paths miss. If your local open shows a styled-but-broken page, set the build's base path to relative (base: './' in vite.config.js, or the equivalent for your tool) and rebuild. Most modern hosts handle this for you, but it's the single most common reason a downloaded build looks broken on first open.
Now you've got a folder of files that doesn't need Replit. The question becomes where it lives, and that splits cleanly by what the project is.
If it's a finished build you're delivering to specific people — a portfolio piece, a prototype for a client, a one-pager for a recruiter — you want a private link that opens instantly, never sleeps, and looks like your own page rather than a tool's subdomain. Bundle the build into a self-contained file and drop it on a private-link host. The link is unguessable and private by default, the viewer needs no account, and you can add a password or an expiry date if the audience is sensitive. This is the same shape whether the export came from Replit, a Cursor build, or any other tool — see the broader pattern for sharing a Replit app as a link, sharing a vibe-coded app, and hosting an AI artifact.
If it's a project that still moves — iterating weekly, or one you expect to grow a real backend later — keep it on a platform with a deploy pipeline. Vercel and Netlify are built for exactly this: connect the repo, push, and they rebuild. When you eventually add server functions or a database, they host that too. That's the honest boundary. A private-link host serves the static slice and stops there; the moment your app needs a server living somewhere, Vercel or Netlify is the right tool, not a workaround.
The line between the two is the same line from the split at the top. Static and finished goes to a link that never spins down. Still-a-project-with-a-server goes to a deploy platform. The mistake is leaving either one on a Replit webview URL and hoping the repl stays awake — because a link that never expires is a property of where the files live, not of how much you pay to keep a container running.
A Replit link breaks for visitors because it's a link to a live, sleepable machine. Most builds — especially the AI-generated kind — don't need that machine once they're built. Run the build, download the output, open it locally to confirm it's truly static, then serve it from somewhere that has no runtime to spin down. Reserve the real backend hosts for the apps that actually have a backend. Your work stays up; the repl can sleep.
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.
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.
Client-side encryption tools turn your page into an encrypted file, so the protection and the artifact are the same object — every edit means re-running the tool and re-uploading. What that actually costs, the salt setting that decides whether your old share links survive, and when a hosted password is the better trade.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.