Export

Self-host your Lovable or Bolt app.

Export the project to GitHub and put vite and serve in dependencies. The buildpack builds with vite build, and serve delivers dist and answers deep links.

Needs the Developer plan, the free plan only covers websites. Pricing · Check the limits first

  • Vite and React tested
  • Deep links work
  • Hosted in Nuremberg
claude · run-zero-examples/lovable-bolt-v0

> Deploy the lovable-bolt-v0 folder to run.zero.

runzero_create_appdoneexample-vite-spa

runzero_push_filesdoneone commit

runzero_deploydoneservices created

runzero_wait_for_builddonelive

live at https://web-example-vite-spa-efd7ddd7.run-zero.de

The session that created the live demo, with the real MCP tools.
How it works

Live in four steps.

Tested with the Vite example that runs live.

  1. 01

    Export to GitHub

    Store the project as a repo. A v0 export is a Next.js project, so follow the Next.js guide for that.

  2. 02

    Scripts and dependencies

    Pin Node 22 and keep vite in dependencies. serve -s delivers dist and falls back to index.html for unknown paths.

    package.json (excerpt)
    "engines": { "node": "22.x" },"scripts": {  "build": "vite build",  "start": "serve -s dist -l tcp://0.0.0.0:${PORT:-8080}"}
  3. 03

    Add run-zero.yaml

    One service, port 8080.

    run-zero.yaml
    version: "1"services:  web:    port: 8080
  4. 04

    Create an account and deploy

    Create an account, connect your agent with this command, then sign in from Claude Code with /mcp and Authenticate.

    • Then tell your agent: deploy this repo to run.zero.
    Without an agent

    Create the app in the dashboard and connect your GitHub repo. Every push rebuilds.

    Connect Claude Code
    claude mcp add --transport http \  -s user run-zero \  https://api.run-zero.de/mcp \  --client-id runzero-cli \  --callback-port 53761

After 1 to 3 minutes the app is live at https://web-<app>.run-zero.de. Check a route of your app, in the example /about. If the build is red, runzero_get_build_logs tells you why.

Files

One export, three changes.

Dependencies, the start script and the config.

vite, the React plugin and serve in dependencies, start calls serve -s.

Example on GitHub(opens in a new tab)
lovable-bolt-v0/package.json
{  "name": "run-zero-example-vite-spa",  "version": "1.0.0",  "private": true,  "type": "module",  "engines": { "node": "22.x" },  "scripts": {    "dev": "vite",    "build": "vite build",    "start": "serve -s dist -l tcp://0.0.0.0:${PORT:-8080}"  },  "dependencies": {    "@vitejs/plugin-react": "^5.1.0",    "react": "^19.3.1",    "react-dom": "^19.3.1",    "react-router-dom": "^7.9.0",    "serve": "^14.2.5",    "vite": "^7.2.0"  }}

Unchanged from the export.

Example on GitHub(opens in a new tab)
lovable-bolt-v0/vite.config.js
import { defineConfig } from 'vite';import react from '@vitejs/plugin-react';export default defineConfig({ plugins: [react()] });

Two browser routes, / and /about.

Example on GitHub(opens in a new tab)
lovable-bolt-v0/src/main.jsx
// Same shape as a Lovable or Bolt export: Vite, React and client side routing.import { StrictMode } from 'react';import { createRoot } from 'react-dom/client';import { BrowserRouter, Link, Route, Routes } from 'react-router-dom';function Home() {  return (    <main>      <h1>Vite SPA on run.zero</h1>      <p>Built with vite build at image build time, served with serve -s so deep links work.</p>      <p><Link to="/about">Open /about</Link></p>    </main>  );}function About() {  return (    <main>      <h1>About</h1>      <p>This route only exists in the browser. Reload it: the server falls back to index.html.</p>      <p><Link to="/">Back</Link></p>    </main>  );}createRoot(document.getElementById('root')).render(  <StrictMode>    <BrowserRouter>      <Routes>        <Route path="/" element={<Home />} />        <Route path="/about" element={<About />} />      </Routes>    </BrowserRouter>  </StrictMode>,);
Limits

What does not work today.

Mostly about data used from the browser.

  • Needs the Developer plan

    Free has no server apps and no Postgres, a deploy stops with an error.

    See pricing
  • Your database stays put

    If the export talks to a database straight from the browser, that does not change. The Postgres addon is only reachable from a server-side service.

  • v0 is Next.js

    A v0 project follows the Next.js guide, not this one.

  • Build tools in dependencies

    If vite sits in devDependencies, the build fails.

Operations

What you stop doing yourself.

Builds, HTTPS, the database and backups run on the platform.

  • Data stays in Germany

    Servers and backups at Hetzner in Nuremberg. With a data processing agreement.

  • HTTPS by default

    Every service gets an address on run-zero.de, custom domains a Let’s Encrypt certificate.

  • Postgres as an addon

    One entry in run-zero.yaml, DATABASE_URL arrives as an environment variable.

  • No lock-in

    Your code stays in your repo, the database is a dump you can download.

Questions.

About exports.

I have a v0 project. Now what?

v0 exports Next.js. Follow the Next.js guide and build with next build --webpack.

Can I keep building with AI here?

Yes. run.zero has its own AI chat, and your agent can keep editing the app through the MCP server.

Do I get a custom domain?

Every app gets an address on run-zero.de. Custom domains with a Let’s Encrypt certificate come with the Developer plan.

More guides

All guides

Your code. Live on run.zero.

One website is free, no credit card. Apps with a server, a database and a custom domain come with the Developer plan.