# Waggle OS -- Design System Audit **Date:** April 2026 **Scope:** `apps/web/` (primary frontend), `app/` (Tauri app), shared CSS and design tokens **Method:** Automated deep scan of all CSS files, component source, and design token definitions --- ## Summary **Overall Score: 6.3 / 10** Waggle OS has a distinctive and intentional design identity ("Honey on Dark Steel") that is rare among AI products. The Hive DS token system is well-defined at the CSS variable level. However, there is a significant gap between the *defined* design system and its *applied* usage. Arbitrary Tailwind values are rampant (433 instances of `text-[Npx]` across the web app), two separate CSS systems exist for the two app targets with divergent token definitions, and accessibility is weak at the fundamentals level (tiny text, no responsive design, inconsistent focus states). The product looks good in screenshots but would not survive a WCAG audit. --- ## Dimension Scores ### 1. Color Consistency -- 7/10 **What exists:** The Hive DS defines a comprehensive palette in `app/src/styles/globals.css`: - Hive gray scale: 12 stops (`--hive-950` through `--hive-50`) - Honey scale: 8 stops (`--honey-600` through `--honey-50`) plus `--honey-glow` and `--honey-pulse` - Status colors: 5 named (`--status-healthy`, `--status-warning`, `--status-error`, `--status-info`, `--status-ai`) - Semantic surfaces: 5 (`--surface-card`, `--surface-panel`, `--surface-overlay`, `--surface-hover`, `--surface-selected`) - Shadows: 4 (`--shadow-card`, `--shadow-elevated`, `--shadow-overlay`, `--shadow-honey`) - Knowledge graph node colors: 5 (`--kg-person`, `--kg-project`, `--kg-concept`, `--kg-org`, `--kg-default`) **What is actually used:** Components mostly use the semantic Tailwind tokens (`text-foreground`, `bg-card`, `text-primary`, etc.) which is correct. However, there are systemic leaks: - **Direct Tailwind color classes bypass the design system.** Status colors are applied via `text-emerald-400`, `text-amber-400`, `text-violet-400`, `text-cyan-400`, `text-orange-400`, `text-sky-400`, `text-destructive` rather than through the defined `--status-*` tokens. This means status colors are hardcoded in 50+ locations across OS component files. - `CockpitApp.tsx:66` -- `text-emerald-400` / `text-amber-400` inline instead of referencing status tokens - `Desktop.tsx:63-75` -- Each app icon uses a different Tailwind color (`text-amber-300`, `text-cyan-400`, `text-emerald-400`, `text-violet-400`, `text-orange-400`) - `VaultApp.tsx:66-71` -- TYPE_BADGES use `bg-sky-500/20 text-sky-400`, `bg-emerald-500/20 text-emerald-400`, etc. - `CapabilitiesApp.tsx:7-16` -- Trust levels and category colors hardcoded as Tailwind classes - **Two divergent CSS systems exist.** `app/src/styles/globals.css` defines HSL values one way (`--background: 222 20% 4%`), while `apps/web/src/index.css` defines them differently (`--background: 30 6% 8%`). The hue families are completely different (222 cold blue vs 30 warm amber). This means the Tauri app and web app render different colors from the "same" design system. - **Inline hex values in SVG.** `MemoryApp.tsx:62,73` uses `stroke="hsl(38, 92%, 50%)"` and `fill="hsl(38, 92%, 50%)"` directly instead of referencing a CSS variable. - **UserProfileApp.tsx:59-61** -- Default brand colors hardcoded as hex (`#D4A84B`, `#1a1a1a`, `#3b82f6`). The accent `#3b82f6` (Tailwind blue-500) is not part of the Hive DS palette at all. **Fix recommendations:** 1. Create Tailwind theme extensions for status colors: `text-status-healthy`, `bg-status-warning/20`, etc., mapped to the existing `--status-*` CSS variables. 2. Reconcile the two CSS systems. The `apps/web/src/index.css` warm-amber base and `app/src/styles/globals.css` cold-blue base need to converge on one. 3. Replace all inline `hsl()` and hex values in TSX files with CSS variable references. --- ### 2. Typography Hierarchy -- 4/10 **What exists:** - Display font: Space Grotesk (headings, labels) via `.font-display` utility - Body font: DM Sans (web app) / Inter (Tauri app) -- another divergence - Mono font: JetBrains Mono / Cascadia Code / Fira Code - Body font size set to `13px` in `app/src/styles/globals.css` - Chat prose styles are well-defined: h1=18px, h2=16px, h3=14px, p=14px, code=13px **What is actually used -- the font size disaster:** Arbitrary `text-[Npx]` values across `apps/web/src/**/*.tsx`: **433 total instances**. Breakdown by size: | Size | Count | WCAG Status | |------|-------|-------------| | `text-[7px]` | ~2 | FAIL -- unreadable | | `text-[8px]` | ~8 | FAIL -- nearly unreadable | | `text-[9px]` | ~25 | FAIL -- below minimum | | `text-[10px]` | ~45 | FAIL -- below WCAG 12px minimum for body text | | `text-[11px]` | ~10 | BORDERLINE | | `text-[12px]` | ~7 | PASS (barely) | Plus standard Tailwind classes in OS components: **460 instances** of `text-xs` (12px), `text-sm` (14px), `text-base`, `text-lg`, `text-xl`, `text-2xl`, `text-3xl`. The worst offenders: - `StatusBar.tsx` -- Almost all content is `text-[10px]`: workspace name, model name, token count, cost. This is the bar users see constantly. - `ModelPilotCard.tsx` -- 16 instances of arbitrary sizes from `text-[8px]` to `text-[10px]`. The 3-lane model selector is a wall of microscopic text. - `Dock.tsx:121,144` -- Hover labels are `text-[10px]`. - `WorkspaceBriefing.tsx:70` -- Memory stats at `text-[11px]`. - `SpawnAgentDialog.tsx` -- 11 instances of `text-[10px]`. **The core problem:** There is no defined type scale. Developers pick whatever pixel value feels right at the time. The result is at least **10 distinct font sizes** (`7px, 8px, 9px, 10px, 11px, 12px, 13px, 14px, 16px, 18px`) used across the app, with no documented hierarchy. **Fix recommendations:** 1. Define a type scale in the design tokens: `--text-micro: 11px`, `--text-caption: 12px`, `--text-body-sm: 13px`, `--text-body: 14px`, `--text-title: 16px`, `--text-heading: 20px`, `--text-display: 24px`. 2. Map these to Tailwind utilities and ban arbitrary `text-[Npx]` values via ESLint. 3. **Eliminate all text below 11px.** The `text-[7px]`, `text-[8px]`, and `text-[9px]` instances need to be bumped to at minimum 11px. Nothing in a productivity app needs to be 8 pixels tall. 4. The StatusBar and ModelPilotCard need a redesign to work at readable sizes. --- ### 3. Spacing Rhythm -- 7/10 **What exists:** The Tailwind 4px grid is used consistently in most places. Components use standard Tailwind spacing: `p-2`, `p-3`, `p-4`, `gap-1.5`, `gap-2`, `gap-3`, `mb-4`, etc. **What is used well:** - Very few arbitrary spacing values. The grep for `p-[`, `m-[`, `gap-[`, `space-[` found almost no custom component instances (only shadcn UI library internals like `p-[1px]` in scroll-area). - Border radius is consistent at `--radius: 0.75rem` (12px) with `rounded-xl`, `rounded-lg` variations. - Cards use consistent padding patterns: `p-3` for compact, `p-4` for standard. **Minor issues:** - Window sizes are hardcoded pixel values in `Desktop.tsx:58-76`: `"520px"`, `"560px"`, `"640px"`, `"480px"`, etc. These should be tokens or at minimum constants. - `EventsApp.tsx:176` uses `paddingLeft: ${depth * 20 + 8}px` for tree indentation -- calculated inline. **Fix recommendations:** 1. Extract window dimensions to a constant map or config. 2. Replace calculated inline padding with Tailwind `pl-*` classes using data attributes or CSS custom properties for depth. --- ### 4. Component Consistency -- 6/10 **What exists:** Two separate shadcn/ui component libraries: - `app/src/components/ui/` -- 21 components (Tauri app). Uses `@base-ui/react` primitives, newer shadcn patterns with `data-slot` attributes and `class-variance-authority`. - `apps/web/src/components/ui/` -- 49 components (web app). Uses `@radix-ui/react-*` primitives, standard shadcn patterns with `forwardRef`. These are **two completely different component libraries** with different underlying primitives, different APIs, and different styling approaches. The `app/` Button uses `@base-ui/react/button` with CVA variants including `xs`, `sm`, `default`, `lg`, `icon`, `icon-xs`, `icon-sm`, `icon-lg`. The `apps/web/` Button uses `@radix-ui` with `default`, `sm`, `lg`, `icon` sizes. **Custom components in `apps/web/src/components/os/`:** - **Buttons are inconsistent.** Some views use the shadcn `