nika.sh
July 10, 2026 · View on GitHub
nika.sh — Intent as Code
The public site for Nika, the open language for AI workflows. The whole site lives inside a living device frame — a near-black contour whose colour reads the section under it — and the home's centrepiece is a scroll-driven film: the workflow file travels in, bursts into its DAG, the recorded run chains through it, and the plan lies down into a flat map. Every YAML fragment shown is real and spec-validated; every number derives from the spec's canon.
Live · nika.sh License · AGPL-3.0-or-later
Stack
- Vite + React 19 + TypeScript + react-router — ~40 routes prerendered to static HTML (react-ssg), no server
- three.js / @react-three/fiber — the manifesto's drum sphere, the film's 3D plan scene, and the galaxy easter egg
- CodeMirror 6 — the /play playground (spec-true validation, in-tab)
- Tailwind v4 — utility layer over the engineered dark token system
- Fonts — Clash Display (Fontshare ITF FFL), Martian Grotesk + Martian Mono (OFL), self-hosted, subsetted (fontTools) with metric-twin fallbacks
Develop
corepack enable # pnpm via the packageManager pin
pnpm install
pnpm dev # http://localhost:5173
Gates (all must pass before pushing — CI re-runs them on every push/PR
via .github/workflows/gate.yml, plus a live-URL-contract presence check
on dist/):
pnpm check # tsc --noEmit + icon-ontology sync
pnpm lint # eslint, zero warnings
pnpm build # tsc -b && vite build → dist/ (prerenders every route)
pnpm test # vitest — models, i18n parity + the drift gates
pnpm visual # pixel-compared goldens (per-OS · see AGENTS.md)
Dev helpers:
?it=<seconds>freezes the hero intro at an exact beat (deterministic screenshots)- type
nikaanywhere — the galaxy answers - the full verification toolbelt (
scripts/) is documented inAGENTS.md— shoot-routes, shoot-scroll, a11y-sweep, lighthouse-spot, size-budget, demo-drive
Layout
src/
shell/ nav capsule · root layout · scroll rail · footer
fx/ EdgeAurora — the living device frame (bezel + aurora)
sections/ the home chapters 01-14 · morph/ is the film
(ScrollMorph · the 3D plan scene · the flat DAG)
pages/ Home · Play · Spec · Learn · Blog · Manifesto (8 locales) ·
Install · Convert · UseCases · Changelog · Errors
scene/ drum sphere (manifesto) · galaxy easter egg
content/ blog.generated.ts + the site changelog
content/blog/ the posts, markdown (compiled by scripts/build-blog.mjs)
public/
install.sh curl install entry (live URL · warns on pre-1.0 legacy)
llms.txt LLM-readable site summary (live URL)
schema/ errors/ workflow JSON schema · error catalog (live URLs · PROJECTED)
Generated content — never hand-edit:
src/canon.generated.ts (every language count ·
nika-spec canon-projectors.py), src/sections/usecases-yaml.generated.ts
(the showcase explorer YAML + DAGs + templates · showcase-projector.py),
src/content/blog.generated.ts (from content/blog/*.md ·
scripts/build-blog.mjs), public/schema/workflow.json and
public/errors/catalog.json (projected from
nika-spec). All drift-gated —
pnpm test fails when a generated module goes stale. Every other YAML
fragment in copy is hand-written but spec-validated — never invent shapes.
Brand assets
The canonical public brand kit lives in public/brand/ (served at
nika.sh/brand/) — marks, tile,
logo lockups, the 16 px glyph. Naming, color roles and usage rules:
BRAND.md. Runtime files (public/nika.svg, favicon.svg,
icon-*.png) keep their frozen names — the visual goldens depend on them.
Deploy
DigitalOcean App Platform, auto-deploy on push to main (spec in
.do/app.yaml). Static build → dist/, 404.html as error document.
Full runbook — doctl, diagnosis, docs.nika.sh setup: DEPLOY.md.
Infra DRI: Nicolas.
License
AGPL-3.0-or-later · a SuperNovae Studio creation