Two React + Vite + TypeScript apps ship in clients/ — both production-grade, both wired against the API’s auth + multitenancy + realtime out of the box. Pick the right one for your audience: admin is for operators (back-office, support, ops); dashboard is for end users (the people who pay you).
The two apps
- 01/05
Admin console
The operator-facing React + Vite app at clients/admin — users, roles, tenants, impersonation, audits, billing, webhooks, health, notifications.
- 02/05
Tenant dashboard
The end-user-facing React + Vite app at clients/dashboard — catalog, chat, files, tickets, invoices, identity admin, plus real-time SignalR + SSE feeds.
- 03/05
Frontend architecture
Shared patterns across the admin + dashboard apps — folder layout, API client, route guards, realtime context, error handling, ProblemDetails parsing.
- 04/05
Per-tenant theming
How tenant branding works in the kit — the TenantTheme aggregate in the Multitenancy module, the admin branding editor, and the dashboard's per-user appearance system.
- 05/05
Local development
Running the React frontends with Vite HMR, building for production, deploying to static hosts or behind Nginx, runtime config via /config.json.
Quick facts
| clients/admin | clients/dashboard | |
|---|---|---|
| Audience | Operators, support, ops | End users (tenant members) |
| Default port | 5173 | 5174 |
| Pages | Users, Roles, Tenants, Impersonation, Audits, Webhooks, Billing (plans + invoices), Health, Notifications, Settings | Overview, Activity, Catalog, Chat, Files, Tickets, Invoices, Subscription, Identity (users / roles / groups), System (sessions, trash, audits, health), Settings |
| Realtime | SignalR notifications | SignalR (chat + notifications + presence) + an SSE activity feed |
| Auth | Same JWT bearer + refresh flow as the API | Same |
| Theming | Kit palette + per-operator light/dark | Per-user appearance (mode, accent, font, density); per-tenant TenantTheme lives in the Multitenancy module |
| Inactivity sign-out | 10 min idle + 60 s warning (config.json) | 20 min idle + 60 s warning (config.json) |
Both run via npm run dev (Vite dev server with HMR) and build to static assets via npm run build. The kit’s Aspire AppHost orchestrates both alongside the API for one-command local dev. Both read runtime configuration from /config.json at boot — no VITE_* build-time env baked into the bundle — so a single build artifact promotes across environments.
Related
- Admin console — operator-facing app.
- Tenant dashboard — end-user app.
- Frontend architecture — shared patterns.
- Theming — per-tenant brand customisation.
- Local development — running, building, deploying.