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.