Documentation

Rung 0 — Create: your first running app

You need a working app.

Prerequisites

Node 20 or 22. Any package manager (npm, pnpm, or yarn).

Create the project

npm create vura@latest my-app
cd my-app
npm run dev
# → Server listening on http://127.0.0.1:3000

pnpm and yarn work the same way:

pnpm create vura@latest my-app
# or
yarn create vura my-app

What you got

Running create-vura emits eleven files:

my-app/
├── package.json
├── vura.config.js
├── tsconfig.json
├── .gitignore
├── README.md
└── src/
    ├── styles.ts          ← shared style strings the pages import
    ├── pages/
    │   ├── index.tsx      ← static home page
    │   ├── about.tsx      ← static about page
    │   └── dashboard.tsx  ← client-interactive page (signals)
    └── api/
        ├── hello.ts       ← serverless GET /api/hello
        └── health.ts      ← serverless GET /api/health (uptime)

The home page, as emitted by create-vura:

// src/pages/index.tsx
export const page = { mode: 'static', title: 'Home — my-app' };

export default function HomePage() {
  return (
    <div class="home">
      <h1>Welcome to Vura</h1>
      <p>Built with What Framework + Vura API routes</p>
      <nav>
        <a href="/about">About</a>
        {' | '}
        <a href="/dashboard">Dashboard</a>
      </nav>
    </div>
  );
}

The hello API, as emitted:

// src/api/hello.ts
import type { CelsianRequest, CelsianReply } from '@celsian/vura-core';

export const route = { kind: 'serverless' };

export function GET(req: CelsianRequest, reply: CelsianReply) {
  return reply.json({ message: 'Hello from Vura!' });
}

Static pages, a client page, and serverless routes, all in the same project with no glue. Everything in the default scaffold deploys on Vura's free tier: pages are static files and API routes are Functions that scale to zero.

Opt-in examples

Two route kinds are left out of the default because they run on machines of their own. Add them when you need them:

Flag Adds Deploys as
--hot src/api/chat.ts, a WebSocket route, plus the ws package a dedicated, always-on server; production needs a paid plan
--tasks src/api/cleanup.ts, a nightly cron task a task route (rung 5)
npm create vura@latest my-app -- --hot --tasks

Any route becomes hot by declaring export const route = { compute: { class: 'dedicated' } };. Rung 4 covers when that is worth it.

A note on page modes

Two modes appear in the scaffold:

mode what ships
static pre-rendered HTML at build time, zero JS
client fully interactive; What Framework signals

The dashboard page uses mode: 'client' with a useSignal counter — that is the only page that ships JavaScript.

For per-request rendering, add a server page; caching is introduced in rung 2.

Next

Rung 1 — Static page →