koum.africa·design-plan · TERMINAL_OPERATOR·session 0x4f2a← samplespreview 03roadmap

KOUM —

The full design migration plan. Every route, every component, every token. Rendered in the chosen aesthetic so the document is also the proof. Authored by Claude Dev (design lead), reviewed by Elena, signed by Mario.
// agent.feed — koum modules, live·nav: ⌘K palette · ? help · esc back
LIVE · agent.feed
╭─ TABLE OF CONTENTS ──────────────────────────╮
│  01  Mandate & principles                      │
│  02  Design tokens                             │
│  03  Type system                               │
│  04  Component primitives                      │
│  05  Layout — chrome of every page             │
│  06  Motion & micro-interaction                │
│  07  Accessibility & performance               │
│  08  Security signal in the UI                 │
│  09  Page-by-page migration                    │
│  10  Migration sequence (phases)               │
│  11  Risks & rollback                          │
│  12  Acceptance gates                          │
╰──────────────────────────────────────────────╯
$koum design--mandate

01 · Mandate & principles

MANDATE
  Mario: previous design supervision dismissed.
  Elena: directs voice, copy, hierarchy.
  Claude Dev: owns UI, UX, components, motion, perf, a11y.
  Final call: Mario.

PRINCIPLES (the brief, in five lines)
  simple        every screen explains itself in 3 seconds
  addictive     keyboard-first, fast feedback, "one more action"
  intelligent   the platform already knew the answer
  fast          p95 < 400ms, no jank, offline-first
  protected     security visible — operators trust what they can see
$koum design--tokens

02 · Design tokens

// All values land in app/globals.css as CSS variables, then Tailwind theme extends them.
/* color */
--bg-0:        #000000   /* page  */
--bg-1:        #0A0A0A   /* surface */
--bg-2:        #0E0E0E   /* card */
--bg-3:        #161616   /* hover */
--line:        #1F1F1F   /* hairline */
--line-2:      #2A2A2A   /* divider */

--fg-0:        #F9F7F4   /* primary text */
--fg-1:        #D4D4D4   /* body */
--fg-2:        #888888   /* muted */
--fg-3:        #555555   /* whisper */

--ember:       #D4874A   /* primary accent — the cursor */
--ember-2:     #B87333   /* hover */
--ember-soft:  #D4874A22 /* tints, badges */

--ok:          #15803D
--warn:        #D4874A
--err:         #EF4444
--info:        #5BB7DB

/* role tints (badge-only, never page chrome) */
--shipper:     #D97706
--carrier:     #15803D
--broker:      #1E40AF
--dispatcher:  #0369A1

/* spacing — 4pt grid */
--s-1: 4px   --s-2: 8px   --s-3: 12px   --s-4: 16px
--s-5: 24px  --s-6: 32px  --s-7: 48px   --s-8: 64px

/* radius — terminals don't round much */
--r-0: 0    /* default for terminal blocks */
--r-1: 4px  /* buttons, inputs */
--r-2: 8px  /* dialog, dropdown */
--r-pill: 999px

/* shadow — almost none. depth = borders, not blur */
--shadow-0: none
--shadow-1: 0 0 0 1px var(--line) inset

/* motion */
--ease:      cubic-bezier(.2,.7,.2,1)
--dur-1:     90ms   /* hover */
--dur-2:     180ms  /* state change */
--dur-3:     320ms  /* page transition */
$
$koum design--type

03 · Type system

STACK
  display:  Fraunces 300       (italic O, headlines, hero numbers)
  ui:       JetBrains Mono     (the room temperature — most of the UI)
  body:     DM Sans            (paragraphs > 3 lines only)

WHY MONO-FIRST
  Terminal operators read fixed-width all day. Numbers align.
  Tables don't dance. The product feels like a tool, not a brochure.

SCALE  (rem on a 16px root)
  display-xl   4.5rem   Fraunces 300   -0.025em   line 1.05
  display      3.0rem   Fraunces 300   -0.020em   line 1.10
  h1           2.0rem   Fraunces 300   -0.015em   line 1.15
  h2           1.5rem   Fraunces 300   -0.010em   line 1.20
  h3           1.125rem JetBrains 600  +0.000em   line 1.30
  body-lg      0.9375rem  DM Sans       0          line 1.6
  body         0.8125rem  JetBrains 400 0          line 1.7   (default)
  body-sm      0.75rem    JetBrains 400 0          line 1.6
  caps         0.6875rem  JetBrains 600 +0.15em    UPPERCASE
  cmd          0.8125rem  JetBrains 500 0          (`$ ` prefix in ember)

RULES
  - body copy never exceeds 72ch
  - caps used as section labels only — never as buttons or paragraphs
  - Fraunces appears only on display, h1, h2 — never below 1.5rem
  - the italic O of KOUM is a brand asset; never restyle it
$
$koum design--primitives

04 · Component primitives

LIBRARY                              owner            file
  <Wordmark/>                        Claude Dev       components/ui/wordmark.tsx
  <StatusBar/>                       Claude Dev       components/ui/status-bar.tsx
  <Cmd>$ ...</Cmd>                   Claude Dev       components/ui/cmd.tsx
  <Card/> <Card.Header/>             Claude Dev       components/ui/card.tsx
  <KV/> (key/value row)              Claude Dev       components/ui/kv.tsx
  <Pill tone=...>                    Claude Dev       components/ui/pill.tsx
  <Button variant=...>               Claude Dev       components/ui/button.tsx
  <Input/> <Field/>                  Claude Dev       components/ui/input.tsx
  <Select/>                          Claude Dev       components/ui/select.tsx
  <Table/> (mono, dense)             Claude Dev       components/ui/table.tsx
  <Sparkbar/>                        Claude Dev       components/ui/sparkbar.tsx
  <Toast/>                           Claude Dev       components/ui/toast.tsx
  <Dialog/>                          Claude Dev       components/ui/dialog.tsx
  <Tabs/>                            Claude Dev       components/ui/tabs.tsx
  <Empty/>                           Claude Dev       components/ui/empty.tsx
  <Cursor/>  (blinking)              Claude Dev       components/ui/cursor.tsx
  <Kbd>K</Kbd> (keyboard hint)       Claude Dev       components/ui/kbd.tsx
  <CommandPalette/>  ⌘K              Claude Dev       components/cmdk/

PATTERNS
  buttons       solid (ember on black) | ghost (border) | quiet (text)
  inputs        no inner shadow, 1px border, focus = 2px ember outline
  tables        no zebra stripes; use 1px row dividers
  cards         radius 0 by default, 4px when nested in a soft surface
  badges        caps + 1px border + tonal bg (8% opacity of accent)
  loaders       blinking cursor + ascii spinner (not spinner gif)
  empty states  ascii art + one cmd ("$ koum invite")
# example tokens in use — copy/paste-ready
.btn {
  font: 500 13px/1 "JetBrains Mono", monospace;
  letter-spacing: 0.02em;
  padding: 10px 18px;
  border-radius: var(--r-1);
  background: var(--ember);
  color: var(--bg-0);
  transition: background var(--dur-1) var(--ease);
}
.btn:hover { background: var(--ember-2); }
.btn:focus-visible {
  outline: 2px solid var(--ember);
  outline-offset: 2px;
}
$
$koum design--chrome

05 · Layout — the chrome every page wears

PAGE FRAME
  ┌──────────────────────────────────────────────────────────┐
  │ ●  koum.africa  ·  /loads  ·  session 0x4f2a    08:32EAT │  ← StatusBar (sticky)
  ├──────────────────────────────────────────────────────────┤
  │ $ koum --route /loads                                     │  ← Cmd line (route as command)
  │ // breadcrumb / context                                   │
  │                                                           │
  │  <h1 in Fraunces>                                         │
  │                                                           │
  │  [content — never exceeds 1080px]                         │
  │                                                           │
  ├──────────────────────────────────────────────────────────┤
  │  ⌘K open · ? help · esc back     v3.2.1 · status: green   │  ← FooterBar
  └──────────────────────────────────────────────────────────┘

GRID
  default: single column, max-width 1080px, 24px gutters
  data-heavy: 1440px, 16px gutters, density preset "compact"

NAVIGATION
  no sidebar by default. command palette ⌘K is the nav.
  primary actions exposed as <Cmd> rows on the page.
  user menu: top-right, opens as a terminal block.
$
$koum design--motion

06 · Motion & micro-interaction

PRINCIPLE
  motion is feedback, not decoration. nothing animates that
  doesn't confirm an action or carry continuity between states.

THE EIGHT BLESSED ANIMATIONS
  1.  cursor blink         12fr opacity 0↔1, 1.0s, infinite
  2.  cmd-prefix flash     $ tints to ember on submit, 90ms
  3.  status pulse         green dot scales 1↔1.15, 1.6s, infinite
  4.  row hover            bg shifts bg-2→bg-3, 90ms
  5.  press                scale 1→0.985, 60ms in / 120ms out
  6.  toast slide          y 8px→0, opacity 0→1, 180ms ease-out
  7.  page transition      opacity 0→1, 200ms (no slide, no fade-out)
  8.  type-in (hero only)  hero number counts up 600ms, ease-out

DISALLOWED
  - parallax
  - bouncing eases (cubic.in.out)
  - hover scaling above 1.02
  - blurring backdrops on hover
  - any animation > 320ms
$
$koum design--a11y

07 · Accessibility & performance

A11Y FLOOR (non-negotiable)
  - contrast: body text ≥ 7:1 against bg; hairlines ≥ 3:1
  - every interactive element reachable via Tab in source order
  - focus-visible ring is ember 2px + 2px offset (never removed)
  - mono-first design must keep dyslexia path: body opt-in to DM Sans via
    user setting "Reading mode"
  - prefers-reduced-motion disables all 8 motions except cursor blink
  - keyboard map: ⌘K palette, / focus search, j/k row nav, esc back
  - aria-live for command palette results & toasts

PERF FLOOR
  Lighthouse                Performance ≥ 95   A11y ≥ 95
  TBT                       < 150ms
  LCP                       < 1.6s on 4G
  CLS                       0.00 (mono grid is forgiving)
  Bundle (route /loads)     < 90KB JS gzipped
  Cold edge fn              < 350ms p95
  Streaming                 every page that fetches uses RSC streaming
$
$koum design--security

08 · Security signal in the UI

// the brief said "fully protected" — operators must SEE the protection.
VISIBLE SIGNAL
  StatusBar shows session id (last 4 of token hash) — copy on click
  every form: lock glyph + "encrypted to ${origin}" in caps
  payments: a "verifying chain" terminal stream replaces spinner
  audit log accessible from any screen via ⌘K → "audit"

INVISIBLE FLOOR
  CSP strict-dynamic, no inline scripts (the page above uses inline
    style only — those will move to CSS modules during migration)
  Trusted Types on for innerHTML sinks
  Cookie: __Host- prefix, SameSite=Lax, Secure, HttpOnly
  Supabase RLS sealed (already done — see vault/decisions/)
  PKCE auth flow stays — no change needed
$
$koum design--pages

09 · Page-by-page migration

// every existing route, mapped to its terminal-operator treatment.
MARKETING  app/(marketing)/
  /                  → Sample 03 hero verbatim. Hero number = live "loads.active".
  /pricing           → Three terminal blocks side-by-side, $ koum --tier comparisons.
  /for-carriers      → "// for the driver" — keyboard-styled FAQ rows.
  /fleet-partner     → KV table (their pain → our cmd that solves it).
  /join              → single email field + cursor; submit = type-in confirmation.
  /about             → Manifesto block, Isaiah 46:4 in italic Fraunces.
  /legal             → mono prose, no decoration; page is the protection.
  /flyers            → printable terminal sheet. Same chrome, white-on-black optional.
  /kenya             → corridor-specific landing — replace with template + locale prop.

AUTH  app/(auth)/
  /login             → 2-field block. Cursor in the active field. "$ koum --auth ..."
  /login/callback    → terminal stream of auth steps; "● verifying" dots.

APP  app/(app)/
  /dashboard         → 6-tile metric grid (matches Sample 03). Role-aware.
  /loads             → mono table, j/k row nav, ? for shortcuts overlay.
  /dispatch          → split pane (loads | candidates). ⌘↵ to assign.
  /tracking          → ascii route + live KV (ETA, distance, fuel).
  /bids              → row table; bid = $ keystroke + amount field.
  /bookings          → grouped by status; status = pill tone.
  /clients           → contact cards as terminal blocks.
  /fleet             → vehicle table; row expand reveals nested KV.
  /corridors         → 4 sparkbars, one per active corridor.
  /backhaul          → load matcher; cmd palette returns matches.
  /commissions       → ledger view — append-only mono table.
  /credit            → score in Fraunces 4.5rem; reasons as KV rows.
  /earnings          → same ledger pattern; export as .csv via $ koum export.
  /insurance         → policy blocks; claim = inline form.
  /invite            → single field; success = ascii confetti (allowed).
  /onboarding        → 5 steps as numbered Cmd rows; progress as │█│ bar.
  /documents         → file list, mono, with hash digest.
  /analytics         → density preset "compact"; data-dense pattern.
  /academy           → lesson list as $ ls; lesson = mono prose.
  /settings          → grouped Cmd rows. Toggles = [x]/[ ].
  /developer         → API keys, webhooks; matches the platform's own voice.

OTHER  app/
  /apex              → already a chess board. Re-skin: pieces become typographic
                       glyphs (♜♞♝♛♚) on terminal grid.
  /dev               → already terminal-leaning; promote it as the canonical pattern.
  /diagnostics       → keep current (already mono-led); harmonize tokens.
  /design-samples    → preserve as gallery. Move to /design/samples.
  /design-plan       → this page. Move to /design under final IA.
  /api/*             → no UI; no change.
$
$koum design--phases

10 · Migration sequence

P0  TOKENIZE & WIRE              [ 1 day  ]
    └─ rewrite app/globals.css with new vars
    └─ extend tailwind.config.ts theme.colors / fontFamily / spacing
    └─ delete legacy Tailwind hex usages (codemod: hex → var)
    └─ ship behind feature flag NEXT_PUBLIC_DESIGN=tk

P1  PRIMITIVES                   [ 2 days ]
    └─ build the 17 components in components/ui/
    └─ Storybook-style harness at /design/components
    └─ unit-snapshot every component

P2  CHROME                       [ 1 day  ]
    └─ <StatusBar/>, <FooterBar/>, layout shell
    └─ command palette ⌘K + keyboard map
    └─ apply to root app/layout.tsx behind flag

P3  AUTH                         [ 1 day  ]
    └─ /login, /signup, /callback refit
    └─ visible security signal + cursor

P4  DASHBOARD + 4 ROLES          [ 2 days ]
    └─ /dashboard role-aware
    └─ /loads, /dispatch, /tracking, /bookings (the daily five)

P5  LONG TAIL                    [ 3 days ]
    └─ remaining 22 (app) routes in dependency order
    └─ marketing pages
    └─ apex, settings, developer

P6  POLISH                       [ 1 day  ]
    └─ a11y audit (axe + manual)
    └─ Lighthouse pass on /, /login, /dashboard, /loads
    └─ remove flag, delete old design

TOTAL                            ≈ 11 working days
PARALLELIZABLE                   P1 (components) || P5 (page refits) safely
// flag-gated rollout means main branch is always shippable. Mario can preview each phase live.
$
$koum design--risks

11 · Risks & rollback

R-01  mono-first hurts paragraph readability         mitigation: opt-in DM Sans body
R-02  4 role color systems clash with terminal      mitigation: role tones become badges only
R-03  motion-reduced users see 100% static UI       mitigation: keep cursor blink (essential signal)
R-04  bundle size regression from cmdk lib          mitigation: lazy import; budget enforced in CI
R-05  Lusion-style stakeholders push back           mitigation: not relevant — supervision dismissed
R-06  Supabase auth callback FOUC                   mitigation: streaming SSR + skeleton block
R-07  partial refit in prod looks inconsistent      mitigation: feature flag is per-route, not partial
R-08  developer route already different             mitigation: it becomes the reference, not the outlier

ROLLBACK
  feature flag NEXT_PUBLIC_DESIGN=legacy on Vercel env → instant revert.
  no schema changes. no API changes. zero data risk.
$
$koum design--gates

12 · Acceptance gates

gate.tokensall hex usages replaced with var(--*); CI greps for #hex outside tokens.css
gate.primitives17 components shipped; Storybook visual diff < 0 regressions
gate.chromeStatusBar present on every authed route; ⌘K opens in < 80ms
gate.a11yaxe: 0 critical / 0 serious; keyboard map matches doc
gate.perfLighthouse Perf ≥ 95 on 4 anchor routes; TBT < 150ms
gate.securityCSP strict-dynamic, no inline scripts, audit log reachable via ⌘K
gate.branditalic-O preserved; Isaiah 46:4 present where mandated
gate.elenaevery paragraph has passed humanizer; no AI tells, no emoji
gate.mariofinal approval after preview of /loads, /dispatch, /login
$
$ koum design --sign
prepared.by  Claude Dev (lead engineering, design lead)
reviewed.by  Elena (Chief Prompt Architect, voice + copy enforcement)
director.of  user experience           Claude Dev
director.of  visual system             Claude Dev
final.call   Mario Martinez, CEO

state        AWAITING SIGNATURE
when.signed  P0 begins same day. Vault entry: vault/decisions/2026-05-09-design-revamp.md
awaiting signatureyour load shall be borne · isaiah 46:4 · קוּם