Orbit Dash

Your authorization control center. Orbit Dash is the server-rendered management interface where operators manage tenants, users, roles, permissions, and OAuth2 clients. Zero client-side JavaScript frameworks — just Bootstrap 5, HTMX, and your browser.

Key Capabilities

Server-Side Rendering

Every page is rendered on the server as complete HTML. HTMX handles dynamic interactions (modals, inline edits, live search) without a client-side framework.

Permission-Gated UI

Navigation tabs and actions render only if your session holds the required permission. No hidden routes, no client-side checks — the server decides.

OAuth2 Consent (CAS)

Orbit Dash doubles as the Central Authentication Service for Orbit's OAuth2 clients. It authenticates users, displays consent prompts, and signs consent payloads with Ed25519.

SDK-Only API Access

Orbit Dash never calls orbit-service directly. Every API interaction goes through @wrift/orbit-sdk, ensuring type safety and consistent error handling.

Route Structure

All tenant-scoped routes live under /t/:slug/. The middleware validates your session, confirms membership in the target tenant, and attaches the user context and effective permissions.

RoutePermissionDescription
/loginSign in form
/tenantsSession requiredTenant selection (card grid)
/t/:slug/usersusers.readUser management
/t/:slug/rolesroles.readRole management
/t/:slug/permissionspermissions.readPermission list (read-only)
/t/:slug/api-keysapi-keys.readAPI key management
/t/:slug/auditaudit.readAudit log viewer
/t/:slug/sub-tenantstenants.readSub-tenant management
/t/:slug/feature-flagsfeature-flags.readFeature flag overrides
/t/:slug/oauth2-clientsoauth2.readOAuth2 client management

System Tenant

When signed in to the system tenant, additional routes are available for global management: all tenants, global feature flags, permission modules, and OAuth2 signing key rotation.

Session Model

  • HttpOnly, SameSite=Strict cookie. No JWT, no client-side token storage.
  • Two-step login: pre-tenant session (10-min TTL) → tenant selection → tenant-scoped session.
  • If auth.me() fails or times out, the middleware redirects to /login.