Guides
Move an app from Lovable, Bolt, v0 or Replit
What changes when an app leaves the tool that built it, and what Launchpad adjusts for you.
Lovable, Bolt, v0 and Replit get an app working fast, inside their own hosting. Moving it to your own accounts gives you your domain, your database and your bill, and stops the tool's plan from deciding when your app goes offline. This page is what changes on the way out, tool by tool.
The short version
- Put the code on GitHub. Each tool can do this from its own menu (GitHub → Connect, or Export to GitHub).
- In the Launchpad console, New project and choose the repository.
- The wizard recognises which tool built the app and opens with Moving from …: what will work as it is, what Launchpad has already adjusted, and anything to change first.
- Deploy. Then add your domain on the project page.
Before or after, the free launch check scans the repository for the security holes these tools commonly leave, such as tables anyone can write to and keys sent to the browser, and for what breaks once the app leaves the tool. Each problem comes with a request to paste back into the tool, so it makes the change for you, and there's one request covering them all.
Lovable
How it's recognised: lovable-tagger in package.json, or the README's link to the Lovable
project.
Lovable has built two kinds of app. Projects created before 13 May 2026 are React single-page apps
built with Vite. Newer ones use TanStack Start, which makes each page on a server (it's in
package.json as @tanstack/react-start). The wizard and the launch check tell which you have.
-
The database stays where it is. Lovable writes the Supabase project's address and public key into
src/integrations/supabase/client.ts, so the app keeps talking to that project wherever it's hosted. Launchpad doesn't create another database or sign-in for it. -
Check the Supabase project is yours. If it shows in your own Supabase dashboard, nothing more to do. If Lovable created it on its own cloud (Lovable Cloud), it isn't in your account yet. Move the data to a Supabase project of yours:
- In Lovable, More → Database → Manage → Settings → Export data, then Export on the Database card. Lovable emails you when it's ready; download it from More → Storage, along with any files your app keeps there.
- In the wizard, turn on Database with Supabase, so Launchpad creates a project of yours, and deploy.
- Load the export into it:
launchpad db restore <the export file>(Bringing the data). Your users come across with their passwords.
-
Pages other than the home page. A Lovable app has its own pages (
/dashboard,/settings). On Vercel, opening one directly or refreshing it shows a 404 unless the repository has thisvercel.jsonat the top. The wizard shows it with a copy button:{ "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] }Cloudflare Pages does this by itself, so hosting there needs no file. (Only for projects from before May 2026: a TanStack Start app needs no such file, and one left over gets in its way.)
Lovable projects since May 2026 (TanStack Start)
- Where its server code runs. A TanStack Start app needs a host that runs its server code, and
its build says which. Built with
@cloudflare/vite-pluginand awrangler.jsonc, it runs on Cloudflare Workers, and on Vercel every page shows a 404. The wizard calls this out before anything is created, with a request to paste into Lovable: build with Nitro (npm i nitro, andnitro()fromnitro/vitein the Vite plugins), which Vercel detects and runs, only whenprocess.env.VERCELis set, so Lovable's own preview keeps working. - Already on Nitro? With no Cloudflare preset written in, it deploys to Vercel as it is. Launchpad sets Vercel's framework to TanStack Start.
- Not on Cloudflare Pages. Pages serves files here, and this app's pages aren't files, so the wizard offers Vercel or your own server.
- A leftover
vercel.json. A rewrite of every path to/index.htmlis for single-page apps. Remove it.
Bolt
How it's recognised: the .bolt folder.
- Supabase through variables. Bolt apps usually read
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEY. Either paste your existing project's values in the wizard (under Also used by your app), or turn on Database with Supabase and Launchpad creates a project and sets them. - A committed
.env. If the export included a.envfile, anyone who can read the repository can read its keys. Delete it from the repository and change any secret it held; Launchpad sets the variables at the host instead. - Pages other than the home page: the same
vercel.jsonas for Lovable. - Imports with the wrong capital letters.
import Navbar from "./components/navbar"findsNavbar.tsxon a Mac or Windows, and not on the Linux server that builds the app, so the deploy fails with "Could not resolve". The launch check lists each one.
v0
How it's recognised: package.json named my-v0-project, or the README's link to v0.
v0 builds Next.js apps, which deploy to Vercel as they are. What it leans on is Vercel's integrations, which set variables under their own names:
@vercel/postgresreadsPOSTGRES_URL. Launchpad's database setsDATABASE_URL, so the wizard also setsPOSTGRES_URLto the same address: the code works unchanged.@vercel/kvreadsKV_REST_API_URLandKV_REST_API_TOKEN. Turn on Redis, then either switch the code to@upstash/redis(the same commands) or add those two names pointing at the Upstash values.ignoreBuildErrors. v0 turns off type checking during the build. Deploys go through with type errors; turn it back on once the app is stable.
Replit
How it's recognised: .replit, replit.md or replit.nix, or Replit's Vite plugins in
package.json.
Replit apps are a server (Express) that also serves the pages, so they need a host that runs a server. The wizard picks Your own server (a few euros a month); Vercel would need the app reorganised first.
- Sign-in must change first. Apps built by Replit's agent often sign people in with their Replit
accounts (
server/replitAuth.ts), which only works on Replit. Ask the agent, or your AI tool, to switch to Clerk or Supabase Auth, then turn on Sign-in in the wizard. - Replit's own storage.
@replit/object-storageand@replit/databaseonly work on Replit. Move files to Storage (Cloudflare R2) and records into the database. - The port. Replit expects port 5000. Other hosts say which port to use in
PORT, so the server should listen onNumber(process.env.PORT) || 5000. - The data. Launchpad creates a new, empty database. Replit's database can only be reached from
inside the app, so make the export in Replit's Shell:
pg_dump -Fc --no-owner --no-privileges "$DATABASE_URL" > replit.dump, and downloadreplit.dump. After the first deploy, load it withlaunchpad db restore replit.dump(Bringing the data). The code needs no change: both useDATABASE_URL.
After the move
Point your domain at the app from the project page, turn on alerts, and keep building in the tool you like: push to GitHub and Launchpad deploys each change. The app now runs in your accounts, so the tool's plan no longer decides whether it stays online.
Something missing or wrong? Edit this page on GitHub or email hello@axonscape.com.