The framework for apps that outgrow serverless.

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 →

The one-line change

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.

Serverless API route (default)
// src/api/orders.ts
export async function POST(req, reply) {
  const order = await createOrder(req.parsedBody);
  return reply.json(order);
}
Same project. Now it's a websocket server.
// 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 →

One project. Seven rungs. No eject cliff.

You climb by adding a line, never by adopting a new tool.

  1. Createnpm create vura@latest, a running app
  2. Static pagepage = { mode: 'static' }, zero JS shipped
  3. Server + cachemode: 'server', revalidate: 60, tags: ['posts'], then revalidateTag('posts') for tag invalidation; CDN purge requires a configured adapter
  4. API route — drop a handler in src/api/, serverless by default, typed client call
  5. Hot routeexport const kind = 'hot': websockets, state, no timeout
  6. Taskroute = { kind: 'task' }, schedule: '0 3 * * *': off the request path, retried
  7. Deployvura deploy (platform) or vura build + a recipe (self-host)

Built on shipped engines

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.

Self-hosting is first-class

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 →

Run the framework yourself

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 →

License: MIT, forever

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

Rung 0: your first app →