A batteries-included template for shipping SaaS. Axum API, Svelte 5 admin dashboard, themed bits-ui components, ApexCharts, Argon2id auth, security headers — all wired together, no plumbing required.
A small, opinionated set of well-known libraries glued together so you can focus on your product instead of plumbing.
Strict three-layer modules (controller / service / repository), tower middleware stack, structured tracing, request IDs, graceful shutdown.
Static-rendered admin shell with route groups, auth guard, shared sidebar, header, and toast layer — typed end-to-end.
Accessible primitives — Dialog, Popover, DropdownMenu, Select, Tabs, AlertDialog — themed dark with CSS variables and tailwind-variants.
Bar + line area charts with smooth curves, gradient fills, and shared hover tooltips — auto-themed on light/dark switch.
Modern memory-hard password hashing, OS-randomness salts, and per-request admin role checks via typed extractors.
HS256 access tokens (12h), 30-day refresh tokens rotated on every use, sessionStorage on the client, generic 401 on the wire.
Type-safe DSL queries, r2d2 connection pool, embedded migrations, idempotent admin seeding. Drop in Postgres by flipping a feature flag.
X-Frame-Options DENY, no-sniff, strict referrer + permissions
policy, HSTS in prod, CSP via SvelteKit-computed sha256 hashes
— strict, no unsafe-inline for scripts.
One axum process serves the JSON API at / and the
compiled admin shell at /admin/*. Brotli + gzip
compression layered on every text response.
Every dep is on the latest stable major. Argon2 0.5, Diesel 2.3, Svelte 5, Tailwind 3, bits-ui 1, ApexCharts 5.
Copy the env template, generate a fresh secret, and start the server. The admin UI builds and serves on the same port.
# 1. Provision a strong secret (32+ bytes; refuses to boot otherwise) $ cp .env.example .env.local $ echo "SECRET=$(openssl rand -base64 48)" >> .env.local # 2. Run the dev stack (axum + admin UI on :3099) $ ./run.sh dev # Admin UI: http://localhost:3099/admin/ # API docs: http://localhost:3099/spec # Landing: http://localhost:3099/ ← you are here
Auth + user management out of the box. Full schema, request / response examples, and try-it-now in Swagger.
/auth/login
email + password → access + refresh tokens
/auth/refresh
rotate the refresh token, issue a fresh access token
/users?page=1&limit=100
paginated user list (admin only)
/users
create a user with role and Argon2id-hashed password
/users/:id
delete a user and revoke their refresh tokens