Skip to main content
This guide gives practical steps for running a Lovable app outside Lovable’s own hosting and built-in backend (Cloud). It builds on How Lovable hosts your app and Deployment, hosting, and ownership options with Lovable, which explain what you own and what changes when you move. You can adopt any scenario here on its own and in any order. In this guide, hosting refers to where your application runs, while deployment refers to how your code is built and delivered to that environment.

Before you migrate

Lovable runs the whole app for you: hosting with custom domains and HTTPS, deployments and preview environments, the built-in backend (Cloud) with authentication, a database, and file storage, and AI and connector access at runtime. Most teams keep that setup and never need this guide. Move part of your app outside Lovable when you have a requirement that this setup does not cover: a deployment pipeline of your own, a compliance or data residency rule that specifies where the app must run, or an organizational policy on hosting. Each part you move becomes yours to run, update, and secure. Each section below lists what that includes for its part of the app. Pick the path that matches your situation: Whichever path you take, verify the deployment before switching traffic.

Check how your project is built

Lovable builds apps on one of two stacks, and each needs different hosting: To tell which stack your project uses, open package.json in the Code tab. A TanStack Start project lists @tanstack/react-start under its dependencies. An older React + Vite project does not. You can also ask Lovable in the project chat:
The frontend sections below are split by stack: Deploy a TanStack Start app and Deploy an older React + Vite app. Read the one for your project and skip the other. The backend migration sections apply to projects that use the built-in backend (Cloud) or a connected Supabase project. Before you deploy anywhere, run the app on your own computer from a clone of the repository. A working local run confirms what the app needs installed, its dependencies, and the environment variables it reads, before a host adds its own settings. See Work locally in your IDE.

Get your source code

Every scenario in this guide starts from a copy of your project’s code outside Lovable. You have two ways to get one:
  • Git sync, available on all plans. Connect the project to a repository on GitHub, GitLab, or Bitbucket, and Lovable keeps the two in sync both ways. Use this for any ongoing deployment: hosting platforms deploy from the repository, and Lovable continues to manage development and previews. The examples on this page use GitHub. The same steps apply to a GitLab or Bitbucket repository on platforms that deploy from those providers.
  • Download codebase, available on paid plans, for a one-time snapshot as a .zip file. Open the code editor and click Download codebase at the bottom of the file panel, or use the Download codebase section in Project settings → Git. On Enterprise workspaces, admins can limit downloads to workspace admins and owners. See Download your project’s codebase.
Both paths give you the application source, including the configuration files and the database migration files stored in the project. Neither includes the records in your database or the files in storage. Those move separately, as described under What migrates and how.
The npm examples assume your repository includes package-lock.json. If it only has bun.lock, use Bun for installation or run npm install locally and commit the generated package-lock.json before using npm ci in CI or Docker. Keep the install command and lockfile consistent on your host.
The Docker and virtual machine examples on this page work from an extracted download as well as from a clone. Platforms that build from a repository need the code in a repository you control, which Git sync gives you. From here on, this guide assumes your project is connected to a repository.

Deploy a TanStack Start app

TanStack Start apps run server code, so the host has to run a server, not only serve files. For an older React + Vite app, see Deploy an older React + Vite app. Your project’s build configuration, the @lovable.dev/vite-tanstack-config package in package.json, prepares the server output for the host through Nitro, a build tool that adapts a server app to the platform it runs on. Nitro calls each platform a preset and has presets for most cloud platforms and server runtimes, which is what makes a TanStack Start app portable: you can deploy the same code to any of them. Inside Lovable the preset is fixed. Outside Lovable, the build picks the preset for the platform it detects, or the one you name. Nitro’s deployment guide lists every supported platform. When the frontend runs outside Lovable, you take on its deployment pipeline, environment variables, availability, logs, and preview environments, and Lovable cannot monitor or debug infrastructure it does not control. Check that package.json lists nitro. Without it, the build does not package the app for a hosting platform. Setting the nitro option in vite.config.ts without installing the package produces an error asking you to add it.
Older build configurations can skip Nitro outside Lovable or write a different output directory, even when Nitro is installed. Update an older project’s build configuration before following these examples, and verify both the Lovable preview and the generated server entry point.

Deploy from your repository to a platform Nitro detects

On the platforms Nitro detects automatically, including Vercel, Netlify, and Cloudflare Pages, a build from your repository picks the matching preset with no configuration. Nitro’s deployment guide lists all of them.
1

Connect your repository

Connect the repository to the platform and select the branch you deploy production from. That can be the branch Lovable syncs, or a release branch you merge into after review.
2

Configure the build

Set the build command to npm run build and use Node.js 22. On Netlify and Cloudflare Pages, set the publish or build output directory to dist. Vercel needs no output directory setting.
3

Configure environment variables

Set the variables your app reads. A project that uses the built-in backend (Cloud) needs both sets of values from the repository’s .env file: VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY for the browser, and SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY for the server. Add the secrets your server functions read as well. Those are not in the repository.
4

Update sign-in redirect URLs

Add the new URL to your authentication provider’s allowed redirect URLs.
5

Deploy

Each push to that branch triggers a new deployment. Run the checks under Verify before switching traffic, including a server-rendered page and a server function.

Object storage and CDN hosting

A TanStack Start app does not run from object storage or a CDN alone, because those serve files and do not run the server part. Use a platform Nitro detects, a container, or your own server instead.

Deploy to a container or your own server

For a host the build does not detect, build with Nitro’s Node.js server preset and run the result with Node.js.
1

Build with the Node.js server preset

Name the preset when you build, either as an environment variable or by adding the nitro option to the defineConfig call your project already has in vite.config.ts. Keep any other options that call already passes:
Set VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY before the build, since browser values are embedded at build time.
2

Run the server

The build writes a standalone .output directory. Start it with Node.js 22:
The server listens on port 3000. Set PORT and HOST to change that. Set SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, and the secrets your server functions read as environment variables where the server runs.
3

Put it behind your web server

Configure your reverse proxy or load balancer to forward requests to the server’s port, 3000 unless you changed it, and handle HTTPS there. The VM example further down this page shows a certificate setup with Certbot. Do not use the Nginx try_files fallback from the older React + Vite examples: the server handles routing.
For a container, follow the same two steps in a Dockerfile: a build stage that runs npm ci and the build with the preset, and a Node.js 22 stage that copies .output and runs node .output/server/index.mjs on port 3000. For other runtimes and platforms, such as Deno or Bun, pick the matching preset from Nitro’s deployment guide, and see TanStack Start’s hosting guide for the framework side.

Deploy an older React + Vite app

This section is for older React + Vite apps. They build to static files, so any static host can serve them. For a TanStack Start app, see Deploy a TanStack Start app.

Host on a managed platform

The frontend is usually the first part to move outside Lovable. You deploy the production frontend to a managed hosting platform while continuing to use Lovable for development and previews. Your backend and data can remain on the built-in backend (Cloud) or run elsewhere.

What you’re responsible for

When the production frontend runs outside Lovable, you are responsible for:
  • Frontend deployment pipelines and rollbacks
  • Production environment variables
  • CDN behavior and caching
  • Frontend availability and uptime
  • Production logs and deployment history
  • Preview environments for production branches or releases
Lovable cannot monitor or debug production infrastructure it does not control.

Common approaches

  • Git-based hosting platforms
    These platforms connect directly to your GitHub repository and automatically build and deploy on each push:
    • Netlify
    • Cloudflare Pages
    • Vercel
    • AWS Amplify Hosting
    • Azure Static Web Apps
    • Google Firebase Hosting
  • Object storage + CDN hosting
    These platforms host static files behind a CDN but require a build pipeline to generate and upload the dist/ output.
    • AWS: S3 + CloudFront
    • Google Cloud: Cloud Storage + Cloud CDN
    • Azure: Azure Storage (Static Website) + Azure CDN or Front Door

Deploying to a Git-based hosting platform

This approach applies to platforms that automatically build and deploy from your GitHub repository.
1

Connect your repository

Connect your GitHub repository to the hosting platform.
2

Configure build settings

Most platforms auto-detect these:
  • Build command: npm run build
  • Output directory: dist
  • Node version: 22
3

Configure environment variables

Set the variables your app reads.Projects using the built-in backend (Cloud) need the values from your project’s .env file:
You can find these in the .env file in Lovable’s code editor or in your synced GitHub repository.
4

Configure SPA routing

If direct URL navigation returns a 404, configure a fallback rewrite so all routes serve /index.html. The method varies by platform (for example, _redirects file on Netlify/Cloudflare, staticwebapp.config.json on Azure, rewrite rules on Amplify, vercel.json on Vercel, firebase.json on Firebase).
5

Update OAuth redirect URLs

If your app uses Google sign-in or other OAuth providers, add your new production domain to your authentication provider’s allowed redirect URLs.
6

Deploy

Each push to the branch the platform deploys from triggers a new production deployment, following the rules you configured there.
Result: A publicly accessible production frontend served over HTTPS, connected to your built-in backend (Cloud).

Deploying to object storage + CDN with CI/CD

CDN-backed hosting requires a CI/CD pipeline to build your app and upload the dist/ output. Build steps are identical across providers. Deployment is provider-specific, see links to official documentation for each platform.
For authentication, all major cloud providers support OpenID Connect (OIDC) with GitHub Actions, which eliminates the need to store long-lived credentials as secrets. This is the recommended approach.
1

Add GitHub secrets

Add the required secrets in your GitHub repository settings (Settings → Secrets and variables → Actions).
2

Create the workflow file

For example, create .github/workflows/deploy.yml in your repository:
3

Add provider-specific deployment steps

After the build step, add deployment steps for your platform. Refer to official documentation for current best practices:
4

Configure SPA routing

All CDN-backed hosting requires configuration to return index.html with a 200 status code for routes that don’t match a file. This is typically configured as:
  • A custom error response returning 200 (CloudFront)
  • A URL rewrite rule on a load balancer (Cloud CDN)
  • A URL rewrite rule (Front Door)
Do not rely on storage-level error page settings, as they return 404 status codes.

Host on your own infrastructure

Use this approach when you need full control over frontend hosting, networking, or runtime environment. This is sometimes referred to as self-hosting. The frontend is built from your GitHub repository and deployed to infrastructure you manage. The backend and data can remain on the built-in backend (Cloud) or run elsewhere.

What you’re responsible for

When the production frontend runs on infrastructure you manage, you are responsible for:
  • Build and deployment automation
  • SSL/TLS configuration
  • CDN and reverse proxy configuration
  • Monitoring, logging, and uptime
  • Infrastructure updates and security
  • Preview environments for branches or releases
Lovable cannot monitor or debug production infrastructure it does not control.

Common approaches

  • Container-based deployments
    For example: Docker deployed via Kubernetes (EKS, GKE, AKS), ECS, Nomad, or internal container platforms
  • Virtual machines behind a web server
    For example: Linux VMs running Nginx or Apache, managed through configuration management or internal tooling
  • Internal PaaS platforms
    For example: company-internal deployment platforms or private cloud PaaS solutions

Build requirements

  • Build command: npm run build
  • Output directory: dist/
  • Node version: 22 recommended
Environment variables prefixed with VITE_ are embedded at build time, not runtime. If using the built-in backend (Cloud), you must set these before running npm run build:
  • VITE_SUPABASE_URL
  • VITE_SUPABASE_PUBLISHABLE_KEY
You can find these values in your project’s .env file.

Container-based deployment (Docker)

You can ask Lovable to generate these Docker configurations. See Using Lovable to generate Docker deployments below.
This is the most common approach for deploying to Kubernetes, ECS, Cloud Run, or any container orchestration platform. It also works for running the frontend as a standalone container on a single VM.
1

Clone your GitHub repository

2

Create a Dockerfile

Older React + Vite apps can be containerized using a standard multi-stage Docker build: the first stage installs dependencies and runs npm run build, and the second stage serves the static output with nginx.Here’s an example Dockerfile you can adapt:
3

Create an nginx configuration file

Older React + Vite apps use client-side routing (React Router with BrowserRouter), so your web server must return index.html for all routes. Create an nginx.conf file:
4

Build the container image

Set your environment variables as build arguments:
5

Push to your container registry

For example:
6

Deploy using your orchestration platform

Deploy the container using Kubernetes, ECS, Cloud Run, Nomad, or your internal platform. No runtime environment variables are needed, they are already embedded in the build.
Result: A running container serving your frontend over HTTP on port 80.
Environment variables are embedded at build time. To change them, you must rebuild the container image.
This workflow builds a Docker image and pushes it to a container registry for deployment to Kubernetes, ECS, or other orchestration platforms. This automates the manual container-based deployment steps described above.
You will likely need to adapt it for your security requirements, existing pipelines, and organizational policies.
For authentication, major container registries support OpenID Connect (OIDC) with GitHub Actions, which eliminates the need to store long-lived credentials as secrets. This is the recommended approach.Prerequisites:
  • A container registry (for example, GitHub Container Registry, AWS ECR, Google Artifact Registry, Azure Container Registry, Docker Hub)
  • The Dockerfile and nginx.conf files from the manual container-based deployment section above
  • An orchestration platform to deploy the container (for example, Kubernetes, ECS)
1

Add GitHub secrets

Add the required secrets in your GitHub repository settings (Settings → Secrets and variables → Actions).
2

Create the workflow file

For example, create .github/workflows/deploy-container.yml in your repository:
3

Configure registry authentication

Add the appropriate authentication step before Build and push Docker image in the workflow. Refer to official documentation for current best practices:

VM or static server deployment

This approach is for deploying to Linux VMs, bare-metal servers, or any machine running a web server like Nginx or Apache.
1

Clone your GitHub repository

2

Install dependencies

3

Build the application with environment variables

Set environment variables before running the build:
Build output is in the dist/ directory.
4

Upload the build output to your server

For example, using scp:
Or using rsync:
5

Configure your web server

Older React + Vite apps use client-side routing (React Router with BrowserRouter), so your web server must return index.html for all routes.Example nginx configuration:
Example Apache configuration (.htaccess):
6

Configure TLS (recommended)

Use Certbot to add a free Let’s Encrypt certificate, or configure your existing SSL certificates.
Result: Your app is served over HTTP(S) from your server.
Environment variables are baked into the build output. No runtime configuration is needed on the server. To change environment variables, rebuild the application and re-upload the dist/ output.

Verify before switching traffic

Deploy to a temporary URL on the new host first, and check it against the app running on Lovable:
  • Open a nested route directly and refresh the page. A 404 usually means the host is missing the index.html fallback (older React + Vite apps) or is not running the server part (TanStack Start apps).
  • Sign in and sign out. A redirect error usually means the new URL is missing from your authentication provider’s allowed redirect URLs.
  • Run the reads, writes, and uploads your app depends on.
  • For TanStack Start apps, open a server-rendered page and trigger a server function, not only the browser interface.
When the deployment works, point your custom domain at the new host by following that provider’s instructions for domains and certificates. Your lovable.app address stays with Lovable and keeps serving the version you last published there. Lovable’s Publish button continues to publish to Lovable hosting only. If you keep Git sync connected, each change Lovable pushes to the repository can trigger a deployment on the new host, following the branch and review rules you configured there.

Host backend and data on a managed provider (Supabase example)

This option is typically chosen when you need direct database access, advanced database features, or clearer separation of infrastructure ownership, without taking on full operational responsibility. You move your backend services and database to a managed backend provider. The most direct migration path is to managed Supabase, which closely matches the built-in backend’s architecture. The production frontend can run on Lovable or elsewhere. After migration:
  • The production frontend needs to point to the new backend
  • You can continue using the Lovable editor and preview environments during development
This guide uses Supabase as the reference migration path because Lovable applications rely on Supabase-compatible services (authentication, storage, realtime, edge functions, and row-level security). Migration to other backend platforms is possible, but may require implementing equivalent authentication, storage, and backend services depending on your provider. The detailed steps below describe how to migrate a project from the built-in backend (Cloud) to a managed Supabase instance.

Migration sequence at a glance

Keep the app running on the built-in backend (Cloud) while you prepare the new backend, and point the app at it only when the destination is complete:
  1. Create the destination. A new Supabase project. Note its URL, project ID, and publishable key.
  2. Move the structure. Locate your project’s migration files in supabase/migrations/ or drizzle/migrations/, and apply them in their recorded order. Use the Supabase CLI only for the Supabase migration layout.
  3. Move the data. Restore the database export, which includes user accounts.
  4. Configure sign-in. Enable each provider and update the redirect URLs.
  5. Copy storage files into the matching buckets.
  6. Set secrets and deploy server code. Function secrets, Edge Functions, and scheduled jobs. Replace the app connector and AI calls listed in the table below.
  7. Point a test deployment at the new backend through its environment variables, and leave the Lovable project unchanged.
  8. Verify on that deployment.
  9. Switch. Restore the final export, update .env and supabase/config.toml in the Lovable project, and move traffic, as described under Complete a move away from Lovable.
The dashboard walkthrough below follows this order. The table shows what moves on its own and what needs work.

What you’re responsible for

When your backend runs outside Lovable, you are responsible for the backend capabilities Lovable previously managed, including:
  • Database availability, scaling, and backups
  • Backend monitoring and incident response
  • Row-level security configuration and maintenance
  • Authentication provider configuration
  • OAuth credentials, redirect URLs, and secret rotation
  • Backend environment variables and configuration
  • Security scanning for misconfigurations and exposed secrets
  • Compliance posture of your backend infrastructure
Lovable cannot monitor or debug backend infrastructure it does not control. Managed OAuth configuration and automatic token refresh are only available when the backend runs on the built-in backend (Cloud).

What migrates and how

1

Create a new Supabase project

Follow the steps below to create a new Supabase project.
  1. Go to supabase.com → New project
  2. Choose your organization and fill in:
    • Project name: any name
    • Database password: strong password
    • Region: closest to your users
  3. Click Create new project and wait around 2 minutes for the project to initialize.
  4. From your new Supabase project settings, save these values:
    • Project ID
    • Public API Key (anon key)
    • Project URL: https://[your-project-id].supabase.co
2

Run database migrations

Check your repository for its SQL migration files:
  • Supabase migrations: supabase/migrations/. Run them in chronological order based on the timestamp in the filename, from earliest to latest. For example:
  • Drizzle migrations: drizzle/migrations/. Follow the migration order recorded in drizzle/migrations/meta/_journal.json. These files do not run through supabase db push.
For each migration file in your project, follow the steps below:
  1. Copy the entire SQL content from each migration file.
  2. Paste it into the SQL editor in your new Supabase project.
  3. Run and wait for success message.
If a migration fails, check the migration order, table dependencies, and SQL syntax errors.
3

Export and import your database data

Request a database export from your project and then import it to your new Supabase project.Request a database export from Cloud (see Export Lovable Cloud data):
  1. Go to More → Cloud → Overview → Advanced settings.
  2. In Export project data, click Export data.
  3. In the Database card, click Export, then click Start export to confirm.
  4. Lovable emails you when the export is ready. The export is saved to your project’s Cloud storage, so download it from More → Cloud → Storage.
Import your database export into Supabase:The export is a PostgreSQL custom-format .backup archive with zstd compression. If the storage download wraps it in a .zip file, extract that first. The archive contains schema and data, including managed schemas such as auth. It is not a SQL file you can paste into the SQL editor.
  1. Install PostgreSQL client tools with zstd support. A pg_restore build without that support can list the archive but cannot restore its data.
  2. Inspect the archive with pg_restore --list your-export.backup. Use PostgreSQL’s selective restore options to choose the objects and data to restore.
  3. Plan the restore for your initialized destination using Supabase’s backup and restore guidance. Its plain SQL examples are not commands for this custom-format archive. Account for existing managed schemas, roles, extensions, and the application schema you already created. If migrations inserted seed records, reconcile them before importing those same records from the export.
  4. Restore the selected data with pg_restore, including the sequence values needed for new records. Verify tables, records, relationships, and record creation before switching your app to the new backend.
Test the restore on the new project first. Restoring the entire archive over an initialized Supabase database can conflict with existing objects. Do not add --clean to resolve those conflicts without reviewing its effects: it drops the objects being restored.
Export size limits and cadence are on Export Lovable Cloud data. Download your export and your storage files before removing Cloud from the project. Exports saved to Cloud storage are no longer accessible afterwards.
4

Reconfigure authentication

If your project requires authentication, you need to manually reconfigure auth providers in your new Supabase project.Your users’ accounts and password hashes (the stored form of their passwords) are in the database export, so after the restore they sign in with the same password. Sessions do not carry over, because the new project signs them with its own keys, so anyone signed in signs in again. If your destination cannot restore the exported accounts, give users a password reset flow instead.
  1. In your new Supabase project, go to Authentication → Sign In / Providers.
  2. Enable and configure each provider.
  3. In your OAuth app settings (for example, Google Console, GitHub), update redirect URLs to use your new Supabase project URL.
5

Migrate storage files

Download any files from storage buckets in your project and upload them to your new Supabase project.
  1. In your Lovable project, go to More → Cloud → Storage.
  2. Download files from your storage buckets.
  3. In Supabase, go to Storage and upload files to corresponding buckets.
6

Set function secrets

If your Edge Functions use external services (for example, Stripe), set their API keys and tokens in the new project. Secrets stored in Lovable are not part of the export.
  1. In your new Supabase project, open the Edge Function Secrets page in the dashboard.
  2. Add each secret your functions read.
With the Supabase CLI, supabase secrets set NAME=value sets one secret, and supabase secrets set --env-file <file> sets several from a file.
7

Deploy Edge Functions and recreate scheduled jobs

If your project has Edge Functions, their code is in supabase/functions/. After you link the new project with the Supabase CLI (see the CLI accordion below), deploy every Edge Function:
TanStack Start server functions run with the app on its new host and do not deploy through this command.Compare your scheduled jobs with the schedules present at the destination after restoring. Recreate missing database schedules with cron.schedule SQL, and schedules that call your app with a scheduler of your own. Verify their destination URLs and credentials, and check that they ran after their first scheduled time. Coordinate enabling them with the old backend so both copies do not run the same job.App connector and AI feature calls keep running through Lovable until you replace them. See What migrates and how.
8

Point a test deployment at the new backend

Leave the Lovable project and its repository unchanged for now. On a separate deployment of the app, the one you set up under the frontend sections above, set the new project’s values as environment variables:
  • VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY, and VITE_SUPABASE_PROJECT_ID for the browser. Both React + Vite and TanStack Start apps embed browser values at build time, so rebuild after setting them.
  • SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, and SUPABASE_PROJECT_ID as well, for a TanStack Start app’s server code.
This deployment now talks to the new backend while your users still use the old one.
9

Verify everything works

On the test deployment, the app now runs on your Supabase backend, apart from any app connector or AI feature calls you have not replaced yet. Check:
  • The app loads without errors
  • You can create and read database records
  • Sign-in works with a migrated account
  • Storage uploads and downloads succeed
  • Edge Functions respond, and scheduled jobs ran
Fix anything that fails here before the next step.
10

Switch the Lovable project to the new backend

Do this as part of the final switch, after the final data export is restored (see Complete a move away from Lovable). Two files in the project point at the backend:
  1. In your Lovable project, go to Code and open .env. Replace the old values with the new project’s values:
    A TanStack Start project also has SUPABASE_PROJECT_ID, SUPABASE_PUBLISHABLE_KEY, and SUPABASE_URL in the same file for its server code. Update those to the same new values.
  2. Open supabase/config.toml and replace the old project ID:
  3. Save both files.
From this save, the Lovable preview and the next publish use the new backend. Lovable also pushes the change to your connected repository, and any deployment automation you configured on that repository runs with the new values.
For developers comfortable with the command line. Install the CLI as a project dev dependency, or with Homebrew on macOS:
The schema commands below apply to projects with supabase/migrations/. For a project with drizzle/migrations/, apply its migrations as described in the dashboard walkthrough instead. Function deployment is separate and applies when the project has supabase/functions/.Link the new project and push the Supabase migrations. Drop npx if you installed with Homebrew:
To compare your migration files with the linked project’s schema, install and start Docker, then run:
The schema diff command needs a local shadow database in Docker. Without --linked, it compares against the local database instead of the new hosted project.After setting the function secrets from the walkthrough, deploy the Edge Functions:
These commands move the structure and the server code. Data, storage files, sign-in providers, and secrets follow the steps above.
For provider-specific details, see Supabase documentation.

Host backend and data on your own infrastructure (Supabase example)

This option is intended for strict compliance, data residency, or infrastructure control requirements. You run the backend and database on infrastructure you operate. The most direct self-hosted path is self-hosted Supabase, which provides the authentication, storage, realtime, and edge function services that Lovable applications depend on. The production frontend can remain on Lovable or elsewhere. Lovable can still be used for development, or development can fully transition to other tools. Running only a standalone PostgreSQL database is not sufficient unless you implement equivalent authentication, storage, realtime, and edge services.

What you’re responsible for

When the backend runs on infrastructure you operate, you are responsible for the backend capabilities Lovable previously managed, including:
  • PostgreSQL operations, backups, and disaster recovery
  • Authentication, storage, and realtime service availability and reliability
  • Row-level security design and enforcement
  • Applying security patches and managing version upgrades
  • Edge function deployment and execution
  • Performance tuning and scaling
  • Monitoring, alerting, and incident response
  • Compliance certification of your infrastructure
Lovable does not monitor, operate, or debug any part of self-hosted infrastructure, and production previews are not generated for self-hosted production environments. When self-hosting Supabase, you typically:
  • Deploy Supabase in your own infrastructure using Supabase’s official self-hosting with Docker guide.
    You can ask Lovable to generate these Docker configurations. See Using Lovable to generate Docker deployments below.
  • Configure PostgreSQL, authentication, storage, and required services.
  • Apply the migration files from your Lovable project (supabase/migrations/ or drizzle/migrations/, depending on the project) in their recorded order to your self-hosted instance.
  • Update your application environment variables to point at your self-hosted Supabase:
    A TanStack Start project also reads SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY for its server code. Set those to the same values.
For detailed infrastructure setup and operational guidance, follow Supabase’s official self-hosting documentation.

Complete a move away from Lovable

When the app, its data, and its services all move, keep the existing app available while you prepare the replacement, and switch in this order:
  1. Restore the data and test against it. Restore the database export and the storage files into the destination, point a test deployment at it, and run the checks under Verify before switching traffic with migrated accounts.
  2. Check for remaining calls to Lovable. Search the code for app connectors, AI features, and your built-in backend (Cloud) URL. Each of those still runs through Lovable until you replace it. Cloud usage, AI features, and connectors on the Managed by Lovable option keep using your workspace credits.
  3. Plan the final data changes. Records written after your export are not in it. For the final copy, pause writes from users, scheduled jobs, webhooks, and other integrations, request the final export when the export cadence allows it (one export every 24 hours), copy any storage files changed since your last copy, restore, and then switch. Measure the export and restore times on your test run first, because they set the length of the pause. An app that cannot pause needs an incremental copy with a database tool of your own.
  4. Switch traffic. Move your custom domain to the new host, then unpublish the app on Lovable when you no longer want the lovable.app address to serve it.
  5. Retire the old services. Download and verify your database export and storage files first. Removing Lovable Cloud deletes the backend permanently, including exports saved to its storage. Then disconnect Git sync or delete the project when you no longer need it in Lovable.
A code export or a domain change does not cancel anything. Your hosting and service providers bill you under their own plans, and your Lovable subscription and any Cloud usage continue until you change them.

Ask Lovable to prepare the deployment

Use this prompt as a starting point to ask Lovable to inspect the project and prepare the configuration for a host of your choice. Lovable cannot run or test the result outside its own preview. Check the suggested runtime version and server entry path against your actual build output, then verify the app on the new host before using the generated instructions for production.

Using Lovable to generate Docker deployments

If you prefer a containerized deployment, you can prompt Lovable to generate Docker and Docker Compose configurations for your project. Lovable provides the generated file details, service ports, and run commands in the project chat. Below are the three supported patterns.

Frontend only

Package only the React app as a static site served by Nginx. Use this when you only want to move your frontend. This pattern is for older React + Vite apps. A TanStack Start app needs a Node.js stage instead, as described under Deploy to a container or your own server. For example:

Backend only (self-hosted Supabase)

Run the full Supabase stack locally without bundling the frontend. Use this when you want to develop the frontend separately or serve it from another host. For example:

Full stack (frontend + self-hosted Supabase)

Bundle the frontend and a self-hosted Supabase stack in a single Docker Compose setup. Use this for fully self-contained deployments. For example:

Manual configuration required for self-hosted Supabase

Lovable generates placeholder secrets that you must replace before use:
  1. Generate a JWT secret: openssl rand -base64 32
  2. Generate API keys using your JWT secret. Follow the Supabase self-hosting documentation for generating API keys.
  3. Replace the following values in docker-compose.yml:
    • JWT_SECRET
    • POSTGRES_PASSWORD
    • ANON_KEY
    • SERVICE_ROLE_KEY

Limitations

  • Lovable cannot run or test Docker builds. Verify them yourself.
  • Lovable cannot generate real secrets. Replace the placeholders yourself.