Overview
Build a complete back-office app end to end - Thunder Framework for the API, thunder-core for auth and tenancy, and Thunder UI for the dashboard.
The other examples stop at the API. This one goes all the way to a working dashboard your staff can log into, using all three pieces of the stack together:
| Layer | What it gives you here |
|---|---|
| Thunder Framework | Three createCRUD resources, grouped into one navigation section |
| thunder-core | Sign-in, tenants, and the RBAC that decides who sees what |
| Thunder UI | The entire admin dashboard, generated from the above |
What You'll Build
Rental Desk - a back-office for a company that rents out equipment. By the end you will have:
- Three resources: equipment, customers, and rentals, with real references between them
- Multi-tenancy: every branch sees only its own records, enforced server-side
- Role-based access: agents can create rentals; only managers can delete them
- A generated dashboard: list pages, filters, create/edit forms and reference pickers - written by nobody
- Forms you shaped from the backend: grouped rows, an amount control, an uploader and a type-ahead, all declared in zod
- One custom screen: a card-based rentals board replacing the generated table
The payoff of this example is the part you don't write. Almost every screen comes from the schemas in step 3 - so spend your attention there.
How the Pieces Connect
schemas/*.ts ──┐
├─→ deno task generate:sdk ──→ thunder-sdk ──→ Thunder UI renders
routes/*.ts ──┘ nav, lists, formsYour schemas and routers are the single source of truth. The SDK carries them to the frontend, and the dashboard is a projection of whatever they say. Change a schema, regenerate, and the UI follows.
Final Project Structure
Steps
1. Setup
Scaffold the project and install thunder-core with its RBAC seed.
2. Models
Three schemas - and the .meta() that shapes every form.
3. API
Three createCRUD routers, one navigation group, tenant isolation.
4. Permissions
Grant the new routes - or the dashboard shows nothing.
5. Dashboard
Generate the UI, then override one screen.
This example assumes you are comfortable with createCRUD. If it is new to you, build the Posts CMS first - it covers isolation fields and lifecycle hooks at a slower pace.