Next.js

Host Next.js without Vercel.

run.zero builds your app with next build and runs it with next start as a Node server in Germany. Server rendering and route handlers run in that process.

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

  • App Router and SSR tested
  • One Node process per replica
  • Hosted in Nuremberg
claude · run-zero-examples/nextjs

> Deploy the nextjs folder to run.zero.

runzero_create_appdoneexample-nextjs

runzero_push_filesdoneone commit

runzero_deploydoneservices created

runzero_wait_for_builddonelive

live at https://web-example-nextjs-6733689e.run-zero.de

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

Live in four steps.

Tested with Next.js 16 in the example that runs live.

  1. 01

    Adjust the scripts

    Pin Node 22 and build with next build --webpack. Turbopack, the default in Next.js 16, cannot find next in the buildpack’s module layer.

    package.json (excerpt)
    "engines": { "node": "22.x" },"scripts": {  "build": "next build --webpack",  "start": "next start -p ${PORT:-8080}"}
  2. 02

    Keep next in dependencies

    next, react and react-dom belong in dependencies. The buildpack prunes devDependencies.

  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 /api/health. If the build is red, runzero_get_build_logs tells you why.

Files

One project, one service.

The scripts in package.json decide everything.

build uses --webpack, start takes the port from $PORT.

Example on GitHub(opens in a new tab)
nextjs/package.json
{  "name": "run-zero-example-nextjs",  "version": "1.0.0",  "private": true,  "engines": { "node": "22.x" },  "scripts": {    "dev": "next dev",    "build": "next build --webpack",    "start": "next start -p ${PORT:-8080}"  },  "dependencies": {    "next": "16.4.5",    "react": "19.3.1",    "react-dom": "19.3.1"  }}

Rendered on the server for every request, the timestamp shows it.

Example on GitHub(opens in a new tab)
nextjs/app/page.js
// Rendered on the server for every request, so the time shows that SSR runs on run.zero.export const dynamic = 'force-dynamic';export default function Home() {  return (    <main>      <h1>Next.js on run.zero</h1>      <p>Server-rendered at {new Date().toISOString()} by next start.</p>      <p><a href="/api/health">/api/health</a></p>    </main>  );}
Comparison

What changes compared to Vercel.

Only what you notice in operation.

Serverless functions per routeOne Node process with next start per replica
Build at Vercelnext build at image build time with Paketo
Project environment variablesenv: in run-zero.yaml, secret values as secrets
Vercel domainhttps://<service>-<app>.run-zero.de, custom domain with Let’s Encrypt
Vercel Postgres, KV, BlobPostgres addon, no KV or Blob
Limits

What does not work today.

So nothing catches you off guard.

  • Needs the Developer plan

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

    See pricing
  • No Turbopack build

    Build with --webpack, otherwise next build fails on the buildpack.

  • No Vercel services

    Vercel’s Edge Network, KV, Blob and Analytics are not available here.

  • ISR not tested

    No shared cache across replicas is set up, and we have not checked ISR.

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 Next.js.

Can I use a static export?

We have not tested that with Next.js. The Vite example shows how serve delivers finished files.

Which Next.js version is tested?

Next.js 16 with React 19 in the example. The live demo renders every request on the server.

How do I use a database?

Attach the Postgres addon to the service in run-zero.yaml. Your server components and route handlers read DATABASE_URL.

My project comes from v0. Does this apply?

Yes. A v0 export is a Next.js project, so you follow the same steps.

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.