garrytan/gbrainmarkdown explorer
garrytan/gbrainmaster
admin

DESIGN

admin/DESIGN.md

Design System — GBrain Admin Dashboard

Product Context

  • What this is: Admin dashboard for GBrain MCP server — manage OAuth agents, API keys, monitor requests
  • Who it's for: GBrain operators managing multi-agent access to their brain
  • Space/industry: Developer infrastructure (peers: Supabase dashboard, Vercel, Railway)
  • Project type: Dense utilitarian admin panel — Steve Krug "Don't Make Me Think"

Aesthetic Direction

  • Direction: Industrial/Utilitarian — function-first, data-dense, zero decoration
  • Decoration level: None — every pixel earns its place with information
  • Mood: Ops dashboard for someone who builds. Not a marketing site. Not a consumer app. A cockpit.
  • Reference: Supabase dashboard (dark + dense), Linear (restrained), Grafana (data-forward)

Alignment

  • Text alignment: Left-align everything. No centered text in tables, cards, forms, or labels.
  • Headings: Left-aligned
  • Table data: Left-aligned (including numbers — contextual readability over columnar alignment)
  • Form labels: Left-aligned above inputs
  • Buttons in forms: Right-aligned (action flows left-to-right: Cancel → Submit)
  • Modal titles: Left-aligned
  • Page titles: Left-aligned
  • Only exception: Empty states and the login page lock icon can center for visual weight

Typography

  • Display/Headings: Inter (Semibold 600) — clean, neutral, disappears into the content
  • Body/UI: Inter (Regular 400 / Medium 500)
  • Data/Tables/Code: JetBrains Mono (Regular 400 / Medium 500) — monospace for anything the user might copy, any ID, any token, any technical value
  • Loading: Google Fonts. display=swap.
  • Scale:
    • Page title: 24px / Inter Semibold
    • Section title: 14px / Inter Semibold, uppercase, letter-spacing 0.5px
    • Table header: 12px / Inter Medium, uppercase, letter-spacing 1px, muted color
    • Body: 14px / Inter Regular
    • Small/Caption: 13px
    • Micro: 12px (badges, timestamps)
    • Code/Data: 13px / JetBrains Mono

Color

  • Approach: Monochrome base + semantic color only. No primary brand color. Color means something.
  • Background:
    • Base: #0a0a0f (near-black with blue undertone)
    • Surface/cards: #12121a
    • Hover: #1a1a2a
    • Input/code blocks: #0f0f1a
  • Borders: #1e1e2e (default), #3a3a5a (hover/active)
  • Text:
    • Primary: #e0e0e0
    • Secondary: #888888
    • Muted: #555555
    • Link: #88aaff
  • Semantic (badges only):
    • Success/active: #34a853
    • Error/danger: #ff6b6b
    • Warning: #f5a623
    • Read scope: #3b82f6
    • Write scope: #f59e0b
    • Admin scope: #ef4444
  • No accent color. The data IS the interface. Badges carry all the color.

Spacing

  • Base unit: 4px
  • Density: Dense — this is an ops tool, not a landing page
  • Scale: 4px, 8px, 12px, 16px, 20px, 24px, 32px, 48px
  • Table row padding: 10px 16px
  • Card padding: 24px
  • Modal padding: 24px
  • Section gaps: 24px between sections, 12px between related elements

Layout

  • Sidebar: Fixed left, 200px wide, dark (#0a0a0f)
  • Main content: Fluid, max-width none (fills available space)
  • Grid: Single column for tables (full width), 2-column for stats cards
  • Border radius:
    • Cards/panels: 16px
    • Buttons/inputs: 8px
    • Badges: 9999px (pill)
    • Tables: 0 (sharp edges — data is rectangular)

Components

Tables

  • Full-width, no outer border
  • Header row: uppercase, letter-spaced, muted color, no background
  • Data rows: subtle hover (#1a1a2a), pointer cursor when clickable
  • All text left-aligned
  • Monospace for IDs, tokens, latency values

Badges

  • Pill shape (border-radius: 9999px)
  • Padding: 2px 8px
  • Font: 12px
  • Scoped to semantic meaning: success, danger, read, write, admin

Buttons

  • Primary: white text on #3a3a5a, hover brightens
  • Secondary: muted text on transparent, border #1e1e2e
  • Danger: white text on #ff6b6b background
  • Size: 13px font, 6px 14px padding

Modals

  • Overlay: rgba(0,0,0,0.7)
  • Card: #12121a, border #1e1e2e, border-radius 16px, max-width 480px
  • Title: 18px Semibold, left-aligned
  • Close: top-right ✕ button

Drawers

  • Right-side panel, 400px wide
  • Slide in from right
  • Dark overlay behind
  • Close button top-right
  • Sections separated by section titles (uppercase, muted)

Tabs

  • Inline horizontal, wrapping allowed
  • Active: white text, bottom border
  • Inactive: muted text, no border
  • No background color on tabs

Code blocks

  • Background: rgba(0,0,0,0.3)
  • Border-radius: 8px
  • Padding: 10px 14px
  • Font: JetBrains Mono 12px
  • Copy button: right-aligned, subtle

Empty states

  • Centered text (only exception to left-align rule)
  • Muted color
  • Suggest next action

Motion

  • Approach: Minimal — transitions for hover states only
  • Duration: 150ms for hovers, 200ms for drawer slide
  • No loading spinners — show stale data until fresh arrives
  • SSE live feed: Real-time, no animation on new entries (just prepend)

Anti-Patterns (do NOT do these)

  • ❌ Center-aligned table data
  • ❌ Center-aligned headings or labels (except empty states)
  • ❌ Gradient backgrounds
  • ❌ Shadows (the dark theme IS the depth model)
  • ❌ Rounded table corners
  • ❌ Icons as navigation (use text labels)
  • ❌ Loading skeletons (show real data or nothing)
  • ❌ Confirmation toasts (action → result is immediate and visible)
  • ❌ Color for decoration (every color means something)

Decisions Log

DateDecisionRationale
2026-05-01Dark theme onlyOps dashboard. No light mode needed.
2026-05-01Steve Krug lensZero happy talk, mindless choices, scannable tables, billboard-speed comprehension.
2026-05-01JetBrains Mono for dataAnything copyable or technical should be monospace.
2026-05-03Left-align everythingGarry preference. Centered text is a design crutch. Left-align forces hierarchy through typography weight and spacing, not position.
2026-05-03Incorporate GStack design DNASame family: Inter + JetBrains Mono, dark base, semantic-only color. Diverges on accent (GStack: amber; GBrain: none — data is the color).
2026-05-03Per-client config export tabsClaude Code, ChatGPT, Claude.ai, Cursor, Perplexity, JSON. Every agent has a copy-paste setup path.
2026-05-03Magic link authLogin page tells you to ask your agent. No pasting hex strings into forms.
Continue exploring589 Markdown documents in the local repository