Getting started
Install Niral with Node.js 22+, create your first full-stack app, choose a starter template and learn the commands for development, testing and deployment.
Agent starter kit
View prompt
On this page 5 sections
நிரல் (Niral, Tamil for "program") is a full-stack web framework with zero dependencies — compiler, signals runtime, router, SSR, WebSockets, auth, jobs, mail and AI helpers are all built on the Node standard library. Node 22+ is the only requirement.
Install
The fastest way — one command, like you'd expect:
npx create-niral my-app
That downloads the framework once to ~/.niral/framework (zero runtime dependencies) and installs a niral command. To start immediately in the same terminal:
cd my-app
npx niral dev
Open a new terminal to use the generated niral command after its zsh/bash PATH update. For other shells, add the install's bin directory to PATH or keep using npx niral. Set NIRAL_HOME to choose another install directory; keep projects outside it. Normal commands reuse the cached framework.
For a global npm launcher, choose either npm install -g niral or npm install -g create-niral, not both: they expose the same executable names. See CLI updates for the separate framework update workflow. No npm? Use the installer:
curl -fsSL https://niral.site/install.sh | bash
Or go direct — a git clone IS the framework:
git clone https://github.com/Zyora-Dev/niral.git
alias niral="node $PWD/niral/bin/niral.js" # add to your shell profile
Either way, nothing runs on anyone else's servers — no account, no cloud, no telemetry. Your app is yours.
Create an app
niral create my-app
cd my-app
niral dev # http://localhost:5199 — HMR, error overlays
The scaffold is a real working app: a server-rendered page with reactive state, a keyed list, and a server function called over RPC.
Starter templates
Prefer to learn from a fuller example? Pass --template:
niral create my-blog --template blog # posts + dynamic [slug] routes + a data module
niral create my-app --template dashboard # a sidebar layout, stat cards, a live-refresh RPC
niral create my-app --template minimal # the default — SSR + state + RPC
Each is small and heavily commented — they teach the core patterns by example, not a giant app to wade through.
One file, whole feature
A route is a single .niral file. Server code, client logic, markup and styles live together — the compiler splits them:
<server>
export async function load() {
return { greeting: "வணக்கம்" } // runs on the SERVER, SSR'd into props
}
export async function save(text) { // callable from the client — RPC stub
return { ok: true }
}
</server>
<script>
let { greeting } = $props
let count = $state(0)
</script>
<h1>{greeting} — {count}</h1>
<button on:click={() => count++}>+1</button>
<style>
h1 { color: rebeccapurple; } /* scoped to this component */
</style>
Server code never ships to the browser — save becomes a typed fetch stub, and reading process.env in client code is a compile error.
Commands you'll use daily
| Command | What it does |
|---|---|
niral dev | dev server — compile on demand, HMR with state preservation |
niral check | real TypeScript checking (after niral add typescript) |
niral build | content-hashed release, atomically activated |
niral start | production server for dist/current |
niral export | prerender to static files |
niral add <recipe> | tailwind, auth, chat, sqlite, image, llm … |