Static pages, cached server rendering, typed API routes — and the moment you need websockets, in-memory state, or a 40-second job, it's a one-line change. Not a migration.
npm create vura@latest
Start the ladder →
When your app needs a persistent connection, Vura lets you declare a hot route in the same project. Deploy it to a persistent Node host alongside your pages and API routes.
// src/api/orders.ts
export async function POST(req, reply) {
const order = await createOrder(req.parsedBody);
return reply.json(order);
}
// src/api/live/room.ts
export const kind = 'hot'; // ← the line
const clients = new Set();
export function websocket(peer, req) {
clients.add(peer);
peer.on('message', (m) => {
for (const c of clients) c.send(m);
});
peer.on('close', () => clients.delete(peer));
}
Same types, same router, same deploy. Hot routes run as persistent processes — websockets, presence, streaming AI agent loops, long jobs — next to your static pages and serverless functions. Read rung 4 →
You climb by adding a line, never by adopting a new tool.
npm create vura@latest, a running apppage = { mode: 'static' }, zero JS shippedmode: 'server', revalidate: 60, tags: ['posts'], then revalidateTag('posts') for tag invalidation; CDN purge requires a configured adaptersrc/api/, serverless by default, typed client callexport const kind = 'hot': websockets, state, no timeoutroute = { kind: 'task' }, schedule: '0 3 * * *': off the request path, retriedvura deploy (platform) or vura build + a recipe (self-host)Pages render through What Framework (SSR/ISR, islands, react-compat). APIs run on CelsianJS (validation, hooks, RPC, rate limiting, cron, 8 runtime adapters). Vura is the orchestration: route kinds, one manifest, one build, one dev server.
Six self-host guides — Node/VPS, Docker, Fly.io, Railway, Cloudflare Workers, AWS Lambda — with step-by-step recipes for each target. Self-host guides →
Cache revalidation, websockets, tasks, and cron all run in a plain self-hosted Node build with zero platform credentials. Task state and waits are in-process there; restart-durable task execution currently requires the managed broker. See target capabilities →
Every Vura package is MIT and will stay MIT — no relicensing, no BSL, no "open core" capability fence, ever. The commitment is published in GOVERNANCE.md. You can always fork everything.
npm create vura@latest