The sane way to start a fullstack app.
Pre-rendered static pages, React islands where you need interactivity, a typed FastAPI JSON API, and one container in production. Batteries included — Keycloak auth, RBAC, Alembic.
Static by default
Every public page ships as pure HTML with full metadata — fast for users, complete for crawlers.
Interactive where it counts
Islands hydrate forms, tables and dialogs with React and shadcn/ui, fetching JSON from a typed API.
Auth already wired
Keycloak login, httpOnly session cookies, silent refresh and role-gated admin/member areas come ready to use.
One process, one image
Granian serves API and site together. No sidecars, no Node runtime, nothing to babysit.