SageOx

Internal design portal where the system gets explored, prototyped, and codified — refined as clay, before and after features ship to customers.

The studio for the SageOx design language. In-flight explorations live here; once one proves out it lands in canonical DESIGN.md and the product tokens. Mockups stay as archaeology so future readers can see where a rule came from.

19explorations
4surfaces
v2.4language
Palette · Sage → Gold · Crater
v4
#b5cbaf #0b0d0b
Typography
600
Aa
displaySpace Grotesk bodyInter monoJetBrains Mono
Motion · purposeful
150ms
hover120–150ms easecubic(0.2, 0.7, 0.2, 1) loopsstop after 3
§0 · operating philosophy

Designing for an AI-native company — guidance, not guardrails.

philosophy · §0 → practice · HARNESS.md → all docs →
01

Guidance, not guardrails

The system shapes; it does not block. When agents drift, we tighten the system — not the leash.

02

Pixel-perfect is over

Token-conformant beats pixel-conformant. Where exactness matters, encode it as a contract.

03

Designers are design engineers

A SageOx designer writes the code that ships to production. There is no translator engineer.

04

The harness is the product

One hour polishing one screen vs. ten thousand. Polish the system, not the artifact.

05

Exploration before codification

Stress-test in the studio. Promote what proves out into tokens, components, and DESIGN.md.

Catalogs

living · per surface · auto-exported

Explorations

in flight · dated · self-contained
Featured Live Transcript components — current vs target for /cast and the phone widget.
2026-07-02 transcript · avatar + name identity · DDR-013

Live Transcript components — current vs target

Rationalizing the live/finished transcript UX: short speaker names, paragraph coalescing, and animate-in. Shows current-vs-target for /cast and the embedded phone transcript widget. The per-speaker color ramp first explored here was removed on review (DDR-013): identity is carried by avatar + name, not color — 8 hues run out at ~4 speakers, aren't stable per person across diarizer labels, and aren't accessible on their own.

Open mockup
Guest join via QR — the account-gate sign-in screen with GitHub/Google/email, the join-is-consent screen, the live room with a Guest-badged roster and recorded strip, and the revoke-guest-access management view.
2026-06-15 join · V1 · 4 phone screens + flow

Guest join via QR (account required)

Anyone who can scan a meeting QR joins the live recorded meeting as a guest, even if they aren't on the recording's team. A guest MUST be logged in (auditability — the owner sees a named roster of everyone who attended, even silent attendees), so a no-session scanner gets an account-gate detour (email magic-link, GitHub, or Google) that preserves the ?t= token across Better Auth. V1 keeps consent blunt: the act of joining IS the consent — recorded + transcribed, or no access — so there's no Record/Transcript/Off chooser and no mid-meeting toggles; recognize-my-voice is default-on but needs a voiceprint first; an already-consented guest skips the screen and drops straight into the room. The only opt-out is revoking guest access to the team (forward-only). Live room shows a Guest badge + a non-dismissible recorded strip. Implemented in sageox-monorepo#1769; pairs with the team-consent-management proposal.

Open mockup
Team members page — email-first invite composer above a Requested/Invited/Active funnel roster with status rails, role badges, and a single ⓘ legend affordance.
2026-06-15 settings · members · simple list

Team members — calm by default

Member management for a sub-10-person team stays a calm, short list, not a dashboard. The email-first InviteComposer leads as the one Copper CTA (any member can invite, role-capped); the roster is the Requested→Invited→Active funnel whose group-header counts ARE the stats; the rail/badge key lives behind a single ⓘ hover (DESIGN.md Rule 17), not a standing legend; stale invites fold into the Invited row as a quiet marker. Deliberately cut after review: a 6-cell stat strip, a role-mix bar, and the always-on legend.

Open mockup
Team Invite coworkers widget — an email chip composer with a Copper Send invites button beside the role select, above a demoted Copy invite link fallback, across empty, invalid, sending, and plain-member states.
2026-06-15 team home · sidebar · 6 states

Team "Invite coworkers" widget → email-first

Flip the team-home invite card so email is the primary action: a multi-email chip composer + role select + one Copper Send invites on a single row, with the copy-link demoted to a single bare-URL fallback (no blurb, no preview). Reuses the InviteComposer in a compact sidebar variant; relaxes invite authz so any member can invite (anti-escalation guard, role shown locked above their level). Full state matrix — empty/invalid/sending/sent, plain-member vs admin, link-copied, and a degraded state where the link fails but email still works.

Open mockup
Record page — Record, Cast, Room segmented nav across 12 states.
2026-06-15 mobile · 12 states

Record page — Record · Cast · Room

The active-recording surface reworked around a 3-view segmented nav — Record, Cast, Room — across private/public, paused, offline, casting (single/multi/scroll/refused/empty), the landscape preview popup, the Invite-to-join QR, and the /join participant webview. Light + dark.

Open gallery
Team & user consent management — admin roster with per-type consent cells, a voiceprint coverage bar, and an unknown-speakers outreach card.
2026-06-15 consent · admin + user · 2 surfaces

Team & user consent management

Per-team, per-modality consent, refreshed to match shipped product: admin people table with a 3-cohort Needs-attention group (member-not-enrolled, joined-no-decision, has-gaps) each with a calm outlined CTA, a new amber Awaiting-decision cell state, a Consented-not-yet-enrolled voiceprint sub-state, unknown-speakers with Play-sample + real speaking time, and a read-only user view (member Leave / guest Revoke).

Open mockup
iPad / tablet experience — sidebar nav with the rotated pop-out record button, a Home two-pane with a standing now-rail, and Table Mode: a large live-transcript board for the table.
2026-06-14 iPad · 11&13-inch · nav/cast/meeting · 9 scenes

iPad / tablet experience

The iPad as the calm board in the middle of the room — a different posture from phone-as-instrument. Width-driven breakpoints (Split View / Stage Manager first-class), a leading sidebar with the loved record button amplified (rotated 64×64 pop-out, never flattened), master-detail two-pane (Conversations, Devices), and Table Mode: the iPad rendering the live meeting's signed cast.* HLS on its own glass as an across-the-table board (28pt transcript, oversized recording pulse, light glare-resistant default). Both cast-surface framings shown for the team to choose; compact <600pt falls back byte-for-byte to the phone layout.

Open exploration
Security settings redesign — posture band with sign-in sparkline, Attention Tray, and dual-timestamp credential rows.
2026-06-09 settings · 3 states

Security settings redesign

A re-think of /settings/security: a Tufte posture band with a 7-day sign-in sparkline, an Attention Tray that surfaces only what needs a decision, and credential rows that encode two times — provenance (added) muted, recency (last used) emphasized — so an actively-used connector is obviously not-to-revoke. Clean, attention, and self-healing-error states.

Open mockup
MCP connect hub: featured Best-experience row with four card-capable client tiles beside a Decision Ledger card preview, then effort-grouped tiles below.
2026-05-31 console · mcp · 3 sections

MCP connect hub — shipped redesign

Archaeology of the shipped MCP connect-surface redesign (sageox-mono PR #1496): a featured Best-experience row promoting hosts that render interactive MCP App cards (objective capability, not a cohort guess), an inline Decision Ledger card preview that shows rather than tells, Shiki-highlighted config snippets, and new Copilot Studio + Goose tiles with a provisioning-model Admin chip. Codifies DESIGN.md rules 14-16.

Open exploration
MCP App cards: the Alt C session control surface with an owner-grouped knowledge palette, a gallery of recording-insight cards, and the PiP recording pill.
2026-05-31 mcp · chatgpt/claude · 3 pages

MCP App cards — catalog, control surface & PiP launcher

The live MCP App card catalog (sageox-mono PR #1494): the Alt C Session Control Surface (owner-grouped read/write scope + capture controls), a 6-card review gallery (Recording Insights, Decision Ledger, Chapter Scrubber, Recordings, Attention Tray, Team murmurs), and the PiP pill launcher (persistent session anchor: recording status + control-surface + tools + earned attention). All on the shared Preact pipeline.

Open exploration
Cast experience — mobile: 15 screens covering settings, control sheet, cast test, recording integration, and recovery surfaces.
2026-05-21 mobile · cast · 15 screens

Cast experience — mobile (windhoek-v3)

Port of the Scribe firmware's cast-to-TV experience to the React Native app. Three-layer gate (cloud flag + local auto-cast + per-TV mode), Wi-Fi-free network identity via discovery-set fingerprinting, mini HLS preview (live + muted), Cast Control sheet with host-as-participant view, multi-TV chooser for corporate networks, and Sacred-data isolation on the recording screen.

Open exploration
SageOx mobile · today — native React Native scope, narrow on purpose.
2026-05-18 mobile · native · narrow scope

SageOx mobile · v1 (current native scope)

What the native React Native app actually does today: splash, sign-in, record setup (team or knowledge bubble), record active (chronograph timer + organic waveform + Stop, no chunk telemetry), devices, account. The companion future-web mockup covers everything else.

Open native scope
SageOx mobile · future-web — webview-delivered cast, meeting, and recording detail surfaces.
2026-05-18 mobile · webview · iterate weekly

SageOx mobile · future-web (cast + meeting)

Future-facing UX delivered via in-app webview so the team can ship weekly without app-store latency. Cast, live meeting participation, recording detail with transcript and decisions, processing states, notifications, activity feeds. The native shell wraps sacred capture; webview owns everything around it.

Open webview vision
Knowledge Bubbles v2 — KB list with sidebar nav, contrast-locked dark mode.
2026-05-15 knowledge bubbles

Knowledge Bubbles v2

Plain-language hierarchy, four-tier surfaces, contrast-locked dark mode, calm-mode that's quiet (not silent), and the chat rail rendering pass that replaced bubble chrome.

Open showcase
BDD visualizations — four planning artifacts for the BDD orchestration layer.
2026-05-13 bdd · 4 plans

BDD visualizations — planning the orchestrator

Four self-contained planning artifacts: the Walks→BDD porting plan, the session-lifecycle cluster model, the multi-persona dispatch routing, and the scenario-outline substitution semantics. Hand-drawn flow diagrams when a prose ADR couldn't carry the geometry.

Open visualizations
TV Cast v1 — gallery of five design-language variants.
2026-04-25 cast · 5 variants

TV Cast — five design languages

Atelier, Workshop, Tactile, Homestead, Expedition. Each in calm and climax states across TV and phone. The exploration that asked: what does a meeting "destination" feel like once recording becomes ambient?

Open gallery
Cast TV Layouts — Broadcast, Facilitator, Theater, Splitstage variants plus phone join.
2026-04-17 cast · early

Cast TV Layouts — early variants

Four layouts — Broadcast, Facilitator, Theater, Splitstage — plus a phone join flow. The first iteration that informed the five-language pass a week later.

Open gallery
Ox Dot v2 — design-system pass on the device UI, all 19 screens.
2026-04-04 device · 19 screens

Ox Dot screens · v2

Design-system pass on the Ox Dot device UI — status arcs, pulse ring, the 30px timer, gear icon, dark QR, 150ms transitions. All 19 UI screens rendered against LVGL.

Open catalog
Ox Dot v1 — baseline pixel-perfect renders of the device UI.
2026-04-04 device · baseline

Ox Dot screens · v1

Pixel-perfect renders of the Ox Dot device UI from real ui.cpp against the LVGL headless renderer. The baseline before the design-system pass — useful for diffing what changed.

Open catalog