Guide — leaving an AI app platform

Moving off Bolt.new or Replit Agent: what actually has to be rebuilt

Your product was built by an agent and it works. Now it needs to survive real users, and you need to know which parts of it travel and which parts are the platform wearing your logo. Here is the honest split, a test you can run in an afternoon, the order that keeps you live throughout — and the cases where the right answer is to stay put.

12 min read Updated 27 August 2026 By Appaya Ltd

The short version

What these tools actually hand you

Bolt.new is a StackBlitz product built on WebContainers — StackBlitz's runtime that runs Node.js inside the browser tab (webcontainers.io). That is why Bolt only supports JavaScript-based stacks: Node.js on the backend, browser-native frameworks on the front (Bolt docs). For data and users, a Bolt project uses either Bolt Database — the built-in hosted database with authentication management — or a connected Supabase project, which provides the hosted SQL database, auth and edge functions, and is available for Vite projects but not Next.js ones (Bolt Database docs, Supabase integration docs). Hosting is Bolt's own by default, with Netlify as the alternative (docs), and the GitHub integration commits your work automatically to a repository that lives outside Bolt (docs).

Replit Agent builds on a vertically integrated platform (Replit docs). By default it wires your app into Replit's own services: Replit Auth, where your users sign in by creating or using a Replit account — via Google, GitHub, X, Apple or email — and where the docs state plainly that the only way to implement it is through the Agent (docs); Replit Database, a fully managed PostgreSQL instance (docs); App Storage, object storage powered by Google Cloud Storage and accessed through Replit's JavaScript and Python SDKs (docs); workspace Secrets; and Replit's deployment types, including scheduled deployments for periodic work (docs).

This difference is the whole guide in one sentence: Bolt's lock-in is thin because it rents the hard parts from services you can hold your own account with; Replit's is thicker because it built the hard parts itself, and they do not exist outside Replit.

The portability line

What travels with you, on either platform:

What is platform-shaped, and has to be rebuilt rather than copied:

The afternoon test

You do not need anyone's opinion to find out which category your app is in. You need a clean machine and a few hours.

  1. Get the code out. Both platforms sync to GitHub; connect that if you have not, then clone the repository somewhere the platform has never touched.
  2. Try to build it. npm install && npm run build. Every failure is a runtime assumption the platform was quietly satisfying for you. Write each one down — this list is the first half of your migration scope.
  3. Grep for the platform's fingerprints. Each hit is a call site that changes:
# Replit service SDKs and config
grep -rn "@replit/" package.json src server
ls .replit replit.nix 2>/dev/null
grep -rn "REPLIT_" --exclude-dir=node_modules .

# secrets compiled into the client bundle
grep -rn "VITE_" src | grep -iE "key|secret|token"

# which external services are in play
grep -rn "supabase" package.json src

# schema as files, or only as live database state
ls supabase/migrations/ migrations/ 2>/dev/null

Then count. A handful of hits, a schema that exists as migration files, and a Supabase project you own: your app is mostly portable and the move is plumbing. Dozens of hits across auth, storage and jobs, a schema that exists only inside a live database, and identities that live with the platform: you are rebuilding a service layer, and you now know exactly which services. Both are workable positions — the point is that you found out from your own repository, in an afternoon, for nothing.

The failure classes these generators produce

These are the patterns worth checking for whether or not you ever migrate, because they are the ones that decide whether the app survives real users.

What has to be rebuilt, platform by platform

Leaving Bolt

If your project runs on your own Supabase account, the largest cost of leaving does not exist: the database, auth and storage stay exactly where they are. What remains is hosting — a static Vite bundle any host can serve — plus moving secrets, updating auth callback URLs for the new domain, and the security pass above. If your project runs on Bolt Database, add a data-and-schema extraction first: the built-in database and its authentication live inside the platform (docs), and establishing which of these two situations you are in is the single most important fact in sizing the whole job. Anything periodic or queued gets built for the first time at the destination, because it had nowhere to run before.

Leaving Replit

Each platform service maps to a replacement, and the map is the scope:

The order that keeps you live

The principle: at every step, the app is whole on one side or the other. You can stop at any stage and still have a working product. Never take a step that breaks the old system before the new one has carried real traffic.

  1. Make the code build and pass its tests in plain CI first — before anything moves. This flushes out every runtime assumption while the platform is still happily serving production, and it costs production nothing.
  2. Stand up the replacements beside the originals. New database restored from a dump, new bucket with objects copied, new auth configured, jobs scheduled — all pointed at by a staging deployment, with production untouched.
  3. Move stateless things first. Frontend hosting can switch early and switch back in minutes. Stateful things — database, storage, auth — move last, once staging has proven the wiring.
  4. Treat the auth cutover as its own event. Where identities cannot migrate silently, users will sign in afresh; do it on its own day, with the old system still able to answer questions, not bundled into a weekend of everything else.
  5. Cut data over inside a freeze window, and keep the old platform alive but idle until the new one has survived enough real traffic that going back stops being a thought. Then decommission deliberately.

How to size it honestly

I have not found credible public data on what these migrations take, and I do not think it can exist in general form, because the answer swings on facts specific to your repository — which is why any figure produced before reading it is marketing, whoever says it. That includes me. This is a scoping question, not a fixed job, and the scope is the set of counts you produced in the afternoon test:

A real scope arrives with that arithmetic attached, so you can check it yourself. If someone hands you a number without the counts underneath it, ask for the counts.

When not to migrate

Migrating is not automatically the right answer, and a firm that opens with "you must get off the platform" is selling you their invoice. If you are still finding product-market fit, shipping daily through the agent, with few users and nothing regulated, the platform's speed is worth more than anything a migration buys — the right move is to fix the security posture where you stand and revisit when the facts change. A Bolt app on your own Supabase account may already be most of the way out without ever migrating at all.

The honest triggers are concrete: users you would have to apologise to for data loss; a restore obligation you cannot currently meet; compliance or procurement questions the platform cannot answer; background processing it cannot run; or a hired engineering team that needs CI, staging and rollback to do its job. If none of those are true yet, staying put is a fine outcome, and you probably do not need me. Whichever way it goes, write the decision down with the evidence that produced it — the record is worth more than the choice.

If you want help

What I do is the work described on this page, against your actual repository and services: classify each dependency as portable or platform-shaped, run the security pass policy by policy and flow by flow, and produce a migration scope with the counts it is derived from — so you can check the arithmetic rather than take my word for it. If the finding is that your app is fine where it is, that is what the report says. If that sounds useful, the enquiry form on the homepage is the way in.

Request a fit check How the audit works