Splash / route gate
/Root entry. Decides whether to send the user to login or into the tabs based on the current session. On web the redirect is instant; the native iOS launch image is captured via Maestro.
Tokens, components, and screens for the SageOx mobile app (React Native + Expo). This catalog is a snapshot; the canonical rules live in DESIGN.md and the source of truth is src/catalog/registry.ts in the sageox-app repo. Coverage lint fails CI if a screen is added without a registry entry — see scripts/lint-catalog-coverage.ts.
Sections below render in the canonical order Surfaces → Components → Tokens per catalog/README.md. The live in-app catalog at sageox://internal/design-catalog renders the same data natively in RN.
Whole-screen flows the user actually experiences. Login, empty-state, account, recording — what the app looks like in use, end to end.
/Root entry. Decides whether to send the user to login or into the tabs based on the current session. On web the redirect is instant; the native iOS launch image is captured via Maestro.
/loginEmail + password sign-in via Better Auth. Stores the session token in expo-secure-store, then exchanges it for a short-lived JWT for /api/v1 calls.
/accountSigned-in account screen. Profile, theme preference (light / dark / system toggle), and sign-out.
/(tabs)Default tab landing. Recent activity across the user’s teams.
/(tabs)/teamsList of teams the user is a member of. Tap to drill in.
/(tabs)/devicesRegistered Scribe devices and pairing flow entry point.
/team/[teamId]Team home: members, activity, jump-off to sub-sections.
/team/[teamId]/discussionsConversations between coworkers (humans + AI). Sourced from the team-context channel.
/team/[teamId]/sessionsPrior AI-coworker coding sessions for this team’s repos. Read-only ledger view.
/team/[teamId]/reposRepositories connected to this team.
/team/[teamId]/coworkersMember roster — both human and AI coworkers.
/team/[teamId]/inviteSend an invite to add a coworker to this team.
/team/[teamId]/settingsTeam name, visibility, integrations.
/team/[teamId]/recordPre-flight: request microphone permission, name the recording, then transition to the active recording screen.
/team/[teamId]/record/activeLive recording surface. Chunked Opus upload via presigned S3 URLs, heartbeat ping, pause/resume. Audio is Sacred — never silently dropped.
/team/[teamId]/recordings/[recId]Playback, transcript, meeting notes, decisions for a completed recording.
/devices/[devId]Single Scribe device. Rename, change team binding, view live config, unpair.
/meeting/[recId]/joinPhone-participant surface for a meeting cast to a TV. Chat, reactions, hand-raise, avatar plays.
/internal/design-catalogIn-app live catalog. Dev-only deep link for agents and designers to browse Surfaces → Components → Tokens against the running app — mirrors the published snapshot.
*Fallback route for unknown deep links.
Reusable primitives the surfaces are composed of. Each shown in every variant; flip the chrome Mode toggle to verify light + dark. The canonical render is the live in-app catalog at /internal/design-catalog; the HTML reflections here are pixel-approximate.
primarysecondaryghostdestructiveloadingPressable action with semantic variants. One Copper-tier primary per screen — additional actions stay secondary or ghost so hierarchy reads. Loading state never silently disables; it dims and locks input.
defaultwith-ctaCentered icon + headline + supporting body + optional CTA. Used wherever a list is legitimately empty (no teams, no devices, no recordings). Calm, never alarming.
staticpressableElevated surface tile. Use for list items and grouped content. Pressable variant adds the standard press-opacity feedback; static variant has none.
The raw values underneath surfaces and components — color scales, semantic theme slots, spacing, radius, type, motion. The bottom of the stack.
Core palette. Sage is the primary brand color, Copper the accent, Charcoal the neutral scale.
Sage-centric surfaces, charcoal text. Default on light system mode.
Charcoal-centric surfaces, sage accents. Default on dark system mode.
Base unit is 2 px. Use directly with padding, margin, gap. Tokens skip values intentionally — there are no half-steps.
Border-radius scale. `full` clamps to a circle at any size.
Headings (display / h1 / h2) use Space Grotesk 600; body and UI use Inter (400 / 500 / 600). See DESIGN.md §4 for the full type policy.
iOS values shown. Android uses `elevation` — see src/theme/tokens.ts for the per-platform mapping.