All posts

Deploy a Lovable, Bolt or v0 app

An AI builder gets you to a working app fast, and then hands you a folder. This guide covers the part after the preview: getting that export onto a real URL you own.

First, find out what you actually have

Every one of these tools exports an ordinary JavaScript project. Open package.json and look at the scripts block — that single file decides how the app deploys.

cat package.json

You will be looking at one of two shapes.

A static build. A Vite or Create React App project: build produces a folder of HTML, CSS and JavaScript (dist/ for Vite, build/ for CRA) and there is no server. Nothing runs after the build.

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}

A Next.js app. There is a next dependency, and start runs next start. This one runs a Node process in production.

{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  }
}

Both deploy on OneBit Deploy. The difference is only what the platform does with the build output.

Get it into GitHub

The export is a directory, not a repository, until you make it one.

cd my-exported-app
git init
git add .
git commit -m "Initial commit from the builder export"
git branch -M main
git remote add origin [email protected]:you/my-app.git
git push -u origin main

Before you push, check that no key came along for the ride. AI builders happily inline an API key into a component when you ask them to call a service.

# Anything that looks like a secret, before it becomes permanent history
grep -rnE "(sk-|pk_live|SECRET|API_KEY)" src/ || echo "clean"

Anything that turns up belongs in an environment variable instead — see environment variables and secrets.

Deploy it

On Apps, press Add app, pick the repository GitHub account and press Deploy. What the console detected is shown before the first deploy, and for both shapes above the defaults are usually right; builds and frameworks explains what is detected and how to override it. Every later push to the connected branch builds and ships a new version.

If your app is a Next.js server app, make sure the start command honours the port the platform provides:

{
  "scripts": {
    "start": "next start -p $PORT"
  }
}

Two things AI builders get wrong

Calls to a backend that does not exist. The preview environment often mocks away a server. If the app fetches /api/something and there is no route behind it, that fetch fails in production and the page renders empty. Search the code for fetch( and confirm every destination is real.

Keys in the browser. A key used from client-side code is visible to anyone who opens developer tools. If a service offers a publishable key and a secret key, only the publishable one belongs in the front end; the secret belongs in a server route with the value set as an environment variable.

Limits worth knowing

OneBit Deploy runs in a single region. It builds Node.js, Next.js and static sites — other language runtimes are not available yet. On the Free plan (₦0, 5 apps, 1 GB memory, 5 GB storage) an app scales to zero when it is idle, so the first request after a quiet spell waits for it to start; paid plans stay warm. See limits for the rest.

For a generated portfolio or a demo you are showing a client, the free tier is usually enough. For something people rely on, the ₦30,000 plan keeps it awake.


Ready to ship? Follow the quickstart or read another post.