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

  1. Put the code on GitHub. Each tool can do this from its own menu (GitHub → Connect, or Export to GitHub).
  2. In the Launchpad console, New project and choose the repository.
  3. 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.
  4. 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:

    1. 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.
    2. In the wizard, turn on Database with Supabase, so Launchpad creates a project of yours, and deploy.
    3. 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 this vercel.json at 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-plugin and a wrangler.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, and nitro() from nitro/vite in the Vite plugins), which Vercel detects and runs, only when process.env.VERCEL is 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.html is for single-page apps. Remove it.

Bolt

How it's recognised: the .bolt folder.

  • Supabase through variables. Bolt apps usually read VITE_SUPABASE_URL and VITE_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 .env file, 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.json as for Lovable.
  • Imports with the wrong capital letters. import Navbar from "./components/navbar" finds Navbar.tsx on 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/postgres reads POSTGRES_URL. Launchpad's database sets DATABASE_URL, so the wizard also sets POSTGRES_URL to the same address: the code works unchanged.
  • @vercel/kv reads KV_REST_API_URL and KV_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-storage and @replit/database only 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 on Number(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 download replit.dump. After the first deploy, load it with launchpad db restore replit.dump (Bringing the data). The code needs no change: both use DATABASE_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.