Built with Lovable? Own the hosting.
Connect the GitHub repo Lovable already made for you. We detect the stack — the classic Vite app and the new TanStack Start server build — name the Supabase variables you need before the first build, and keep your app on your own domain.
In Lovable, connect the project to GitHub (Project settings → GitHub). Lovable pushes every edit to that repo.
In SnapDeploy, connect GitHub once, click Deploy, choose the repo.
The wizard has already scanned the code and lists the exact VITE_SUPABASE_* names, with where to find each value.
Build runs, URL appears. Push in Lovable again and it redeploys automatically.
Built as a single-page app and served by Nginx with SPA routing. The output folder (dist) is detected — no configuration. This is the stack most hosts still document.
Projects on @lovable.dev/vite-tanstack-config are built with the Nitro node-server preset and run as a real server app on port 3000 — server routes and all. Most hosts treat these as static sites and fail.
SnapDeploy scans the repo for import.meta.env usage and lists the variables it needs (typically VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY) with a note on where each lives in the Supabase dashboard. They are applied at build time, so the compiled app has them from the first deploy.
Never put the Supabase service-role key in a VITE_ variable — it would ship to every visitor's browser. SnapDeploy fails the build on purpose if a public-prefixed name looks like a secret.
The #1 thing that breaks after moving any Lovable app off lovable.app. Five minutes, once.
https://your-app.containers.snapdeploy.app/** (and your custom domain). Keep the old one until you're done migrating.Managed Postgres, Redis and RabbitMQ add-ons and custom domains are available on every tier. India: UPI, cards, net banking. International: PayPal. Full pricing.
Open package.json in the repository Lovable created for you and look at the dependencies:
lovable-taggerClassic Lovable: Vite + React + TypeScript, Tailwind, shadcn/ui, usually a src/ folder with pages and components. It compiles to a static dist/ folder and is served like any single-page app.
@lovable.dev/vite-tanstack-configNew Lovable: TanStack Start, a server-rendered React framework built on Vite and Nitro. It has server routes and loaders, it produces a Node server, and it is not a static site — which is why hosts that assume "Vite = static" show a blank page or a missing-index error.
Either way you do nothing: SnapDeploy reads the same markers and picks the right build. If you have restructured the project by hand, the supported technologies page lists what the detector looks for.
| Classic (Vite SPA) | TanStack Start | |
|---|---|---|
| Build | vite build; the output folder (dist) is detected | Built with the Nitro node-server preset — a real server bundle, not an export |
| Runtime | Nginx with single-page-app fallback, so deep links and browser refresh work on any route | Node process on port 3000; server routes, loaders and API handlers run server-side |
| Env vars | VITE_* baked in at build time | VITE_* baked in for the client; server-only variables read at runtime |
| Node version | Detected from engines, .nvmrc or the lockfile (18, 20, 22…) | |
| Typical build | One to three minutes; the hard limit is sixty | |
| Variable | Where to find it | Notes |
|---|---|---|
VITE_SUPABASE_URL | Supabase → Project Settings → API → Project URL | Required; public |
VITE_SUPABASE_PUBLISHABLE_KEY | Same page — the publishable (anon) key | Required; public by design (row-level security protects the data). Older exports call it VITE_SUPABASE_ANON_KEY — the scan tells you which name your code reads |
VITE_SUPABASE_PROJECT_ID | Project Settings → General | Some exports read it; set it if the scan lists it |
| service-role key | — | Never in a VITE_ variable: it would ship to every visitor's browser. SnapDeploy fails the build on purpose if a public-prefixed name looks like a secret |
VITE_ variables are compiled into the bundle, so changing one later means a redeploy — one click on the container page, or "redeploy my-app" from an assistant. Details: environment variables.
Lovable's GitHub integration is two-way: edits in the Lovable editor are pushed to the repository, and commits made elsewhere sync back into Lovable. SnapDeploy installs a webhook on the repository when you link it, so every push to the deploy branch starts a new build automatically. You never leave the Lovable editor to ship, and the deployment history shows each push with its commit message.
Want a staging copy? Link a second branch to a second container. Want to stop auto-deploys temporarily? Unlink the repository on the container page; re-link when ready.
app.yourdomain.com. SnapDeploy shows the DNS records to create.https://app.yourdomain.com/** to Redirect URLs. Skip this and sign-in still bounces to the old address.Guide: custom domains.
| Symptom | Cause | Fix |
|---|---|---|
| Blank page, console says supabaseUrl is required | VITE_SUPABASE_* was not set before the build | Set the variables, redeploy (they are baked in at build time) |
| Sign-in returns to lovable.app, or the magic link opens the old site | Supabase only redirects to allow-listed URLs | Site URL + Redirect URLs in Supabase → Authentication → URL Configuration |
| 404 when refreshing a deep link | Static hosts without SPA fallback | Not on SnapDeploy: classic apps are served with SPA routing; TanStack apps route server-side |
| Build fails with "Missing required environment variables" | The scan found required variables you skipped | Add them on the container page and redeploy |
| App is slow the first time after a break | Free containers sleep after ~15 minutes idle and wake on the next request (about a minute) | Expected on the free tier; Always-On ($12/month) never sleeps, a $1 Sprint Pack keeps it awake for a day |
| Realtime / WebSocket features drop on the free tier | Sleeping containers cannot hold open connections | Supabase Realtime connects to Supabase, not your container, so it is unaffected; apps that serve their own WebSockets need Always-On |
More: troubleshooting guide. If your project's backend is Lovable Cloud rather than a Supabase project you created, check Lovable's documentation for how to reach the underlying project's URL and keys before moving the front end.
VITE_ values are fixed at build timeIn Lovable, connect your project to GitHub. In SnapDeploy, connect GitHub, pick the repository and deploy. SnapDeploy detects whether it is a classic Vite single-page app or the newer TanStack Start server build, builds it accordingly, and lists the VITE_SUPABASE_* variables it needs before the first build.
Yes. Projects using @lovable.dev/vite-tanstack-config are built with the Nitro node-server preset and run as a real server-side app on port 3000 — not a static export. Classic Lovable Vite apps are served as single-page apps with the output folder detected automatically.
Supabase only accepts auth redirects to URLs you have allow-listed. Add your SnapDeploy URL as the Site URL and to Redirect URLs under Supabase → Authentication → URL Configuration, and update any OAuth provider settings that still reference the old lovable.app domain.
The free tier covers up to 4 containers, 10 deploys a day (5 per rolling 12 hours) and 100 hours a month, with auto-sleep after about 15 minutes idle. Always-On keeps an app running 24/7 from $12 per month per container; a $1 Sprint Pack keeps one awake for 24 hours.
No. Lovable keeps pushing every edit to the GitHub repository and SnapDeploy redeploys on each push, so you keep building in Lovable and only the hosting moves.
No. Supabase stays exactly where it is; the app keeps talking to it with the same URL and publishable key. Nothing is migrated — only the front end (and, for TanStack Start, its server) runs on SnapDeploy.
Yes. Connecting GitHub grants SnapDeploy the standard repo scope, so private repositories build like public ones.
Yes. The SnapDeploy MCP connector runs the same detection and env-var scan from chat: "deploy my Lovable repo" returns a live URL. See Deploy from Claude Code and the MCP docs.
SnapDeploy's MCP connector works in Claude Code, Cursor and Codex/Gemini CLI: "deploy my Lovable repo" → live URL, with the Supabase variable scan built in.
First deploy free · no credit card
Deploy your Lovable app