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:

LayerWhat it gives you here
Thunder FrameworkThree createCRUD resources, grouped into one navigation section
thunder-coreSign-in, tenants, and the RBAC that decides who sees what
Thunder UIThe 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, forms

Your 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

equipment.ts
customers.ts
rentals.ts
equipment.ts
customer.ts
rental.ts
.env

Steps

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.


On this page