Vercel runs your app as serverless/edge functions. Wokku runs it as a normal
long-running container — which means no cold starts, no function timeouts,
and a real server you can put workers and cron next to. For Next.js, the move is
straightforward.
Concept map
| Vercel | Wokku |
|---|---|
| Serverless / Edge Functions | One long-running server process (web) |
next start (managed) |
next start -p $PORT (Next.js guide) |
| Environment Variables | Config vars (config) |
| Vercel Postgres | Postgres add-on (guide) |
| Vercel KV (Redis) | Redis add-on |
| Cron Jobs | Scheduled Tasks |
| Preview Deployments | PR Previews |
| Custom Domains | Custom Domains |
1. Make the app run as a server
Follow the Next.js guide: ensure build + start
scripts and that start binds to $PORT:
json
{ "scripts": { "build": "next build", "start": "next start -p $PORT" } }
API routes / server actions keep working — they run inside this server instead
of as isolated functions. Pure Edge runtime code may need to move to the
Node runtime (export const runtime = "nodejs").
2. Copy environment variables
Export from the Vercel dashboard (or vercel env pull .env), then:
bash
wokku apps:create my-app --server my-server
# from a .env file:
while IFS= read -r line; do [ -n "$line" ] && wokku config:set my-app "$line"; done < .env
// careful
3. Move data
- Vercel Postgres →
pg_dumpthe connection string, restore into a Wokku
Postgres add-on (see the migration overview). - Vercel KV → add a Wokku Redis add-on and re-point
REDIS_URL.
4. Deploy + domain
bash
git remote add wokku git@git.wokku.cloud:my-app
git push wokku main
Verify on my-app.wokku.app, then move your domain — see
Custom Domains.
Gotchas
- Edge-only APIs —
@vercel/edge/ middleware on the edge runtime may need a Node equivalent. /apias functions — they become normal routes in one server; behaviour is the same, scaling is per-box not per-request.- Image optimization —
next/imageworks; for heavy traffic, front it with a CDN.