Features
Everything ekko:rune gives you to build and ship a full-stack web app, one runtime, one process. Each item links to its chapter.
Rendering
Server-side rendering
Static routes with an ssr() are fully rendered to HTML and cached. Real content on first paint, perfect for SEO and link previews.
Hydration without mismatch
The server and client render the same layout(page) tree and the same seeded state, so hydration is a clean attach, no flicker, no warnings.
Client-side navigation
After the first load the router swaps pages in place from a baked-in route table. No reload, no white flash, instant.
SSR strategies
Choose eager (warm at boot), background (boot fast, warm after), or lazy (warm on first hit) per app or per route.
Routing
File-based routes
pages/about.tsx is /about. [param] is dynamic, [...rest] is catch-all, (group) folders are stripped from the URL.
The router hooks
useRouter, useParams, useSearchParams give you path, params, and query; navigate and Link move on the client.
Guards & redirects
Route guards redirect before render; server redirects handle moved URLs; back-button rules tame multi-step flows.
Programmatic routes
Register one cached, SEO-perfect route per item from data, the technique these docs use for every page.
State (Mimir)
Atoms
State lives in standalone atoms keyed by a string, outside the component tree, so it survives navigation.
Selectors
Derived state with automatic dependency tracking: recompute and re-render exactly when inputs change.
SSR seeding
Seed atoms from the server with fill / force / merge directives so the hydrated page already has the right values.
Sessions & persistence
Mirror atoms to IndexedDB (ephemeral or domain) so a cart, a theme, or a draft survives a full reload.
Backend & build
API routes
app.api(method, path, handler) in the same process as your pages. Return a value and it is sent as JSON.
Middleware
app.use(...) for auth, logging, and security headers across every request; req.user flows into SSR.
The build & manifest
ekko build --client emits a content-hashed, code-split bundle and a manifest the server reads, zero config.
SEO, robots, sitemap
createSEO() generates head tags, Open Graph, Twitter cards, robots.txt and sitemap.xml from one config.
Quality of life
Theming, no flash
SCSS tokens + a theme atom + a no-FOUC script: dark/light with correct first paint and no flicker.
Secure by default
Deny-by-default capabilities (fs, net, env, ...) with scoped grants. The blast radius is one config block.
No node_modules
Dependencies come from the EkkoJS store via ekko.json, no sprawling install, no lockfile drift.
A runbook deploy
Build the client, ship the folder + runtime, run under systemd, nginx + Let's Encrypt in front. Done.