diff --git a/CLAUDE.md b/CLAUDE.md
index 5c13967..67a00ed 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -22,6 +22,18 @@ scarf/scarf/ Xcode project root (PBXFileSystemSynchronizedRootGroup
- **Sandbox disabled**: App reads `~/.hermes/` directly.
- **Swift 6 concurrency**: `@MainActor` default. Services use `nonisolated` + async/await.
+## Design System (ScarfDesign)
+
+All app UI uses the typed token bundle in [scarf/Packages/ScarfDesign/](scarf/Packages/ScarfDesign/) — both the `scarf` and `scarf mobile` targets `import ScarfDesign`. Reach for these tokens before inventing new colors, fonts, or spacings.
+
+- **Colors**: `ScarfColor.accent`, `.foregroundPrimary/Muted/Faint`, `.backgroundPrimary/Secondary/Tertiary`, `.border/.borderStrong`, `.success/.danger/.warning/.info`, `.Tool.bash/edit/search/web/think`. All resolve from `ScarfBrand.xcassets` and adapt light/dark automatically.
+- **Typography**: `.scarfStyle(.title2)`, `.scarfStyle(.body)`, `.scarfStyle(.captionUppercase)`, etc. Use these instead of `.font(.system(...))`. Eleven preset styles cover the type scale.
+- **Spacing / radius / shadow**: `ScarfSpace.s1...s10` (4/8/12/16/20/24/32/40), `ScarfRadius.sm/md/lg/xl/xxl/pill`, `.scarfShadow(.sm/.md/.lg/.xl)`. Hardcoded `.padding(12)` or `cornerRadius: 8` is a code smell — convert.
+- **Components**: `ScarfPageHeader("Title", subtitle: "...") { trailing }`, `ScarfCard { ... }`, `ScarfBadge("text", kind: .success)`, `ScarfTextField`, `ScarfSectionHeader`, `ScarfDivider`, `ScarfPrimaryButton/SecondaryButton/GhostButton/DestructiveButton` (apply with `.buttonStyle(...)`).
+- **App icon + accent**: `Assets.xcassets/AppIcon.appiconset/` is the rust set; `Assets.xcassets/AccentColor.colorset` resolves `Color.accentColor` to rust so any unmigrated SwiftUI control still tints correctly.
+- **Reference**: full screen mockups live at `design/static-site/ui-kit/*.jsx` (open `design/static-site/index.html` in a browser). The `ScarfChatView.ChatRootView` reference component in the package is a 3-pane chat redesign target — usable for previews but not yet swapped into the live chat (the existing `RichChatView` machinery still owns the real ACP pipeline).
+- **Don't**: introduce purple/violet tones (we shifted to rust); use yellow `#F0AD4E` for success (that's `.warning` — `.success` is green); bypass the type scale with `.font(.system(size: 13.5))`; ship terminal/syntax-highlight palettes through ScarfColor (those are content semantics, keep them inline).
+
## Key Paths
- Hermes home: `~/.hermes/`
diff --git a/design/Assets.xcassets/AppIcon-iOS.appiconset/Contents.json b/design/Assets.xcassets/AppIcon-iOS.appiconset/Contents.json
new file mode 100644
index 0000000..ce12503
--- /dev/null
+++ b/design/Assets.xcassets/AppIcon-iOS.appiconset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "images" : [
+ {
+ "filename" : "Scarf-AppIcon-iOS-1024.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : { "author" : "xcode", "version" : 1 }
+}
diff --git a/design/Assets.xcassets/AppIcon-iOS.appiconset/Scarf-AppIcon-iOS-1024.png b/design/Assets.xcassets/AppIcon-iOS.appiconset/Scarf-AppIcon-iOS-1024.png
new file mode 100644
index 0000000..e16b745
Binary files /dev/null and b/design/Assets.xcassets/AppIcon-iOS.appiconset/Scarf-AppIcon-iOS-1024.png differ
diff --git a/design/Assets.xcassets/Contents.json b/design/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..d8b757a
--- /dev/null
+++ b/design/Assets.xcassets/Contents.json
@@ -0,0 +1,3 @@
+{
+ "info" : { "author" : "xcode", "version" : 1 }
+}
diff --git a/design/static-site/README.md b/design/static-site/README.md
new file mode 100644
index 0000000..cc02cb5
--- /dev/null
+++ b/design/static-site/README.md
@@ -0,0 +1,52 @@
+# Scarf Design System — static site
+
+A self-contained, offline-friendly site that browses every artifact in the
+Scarf design system. Open `index.html` directly in any browser — no server,
+no build step.
+
+## What's here
+
+```
+static-site/
+├── index.html ← landing page, links into everything
+├── colors_and_type.css ← shared design tokens (referenced everywhere)
+│
+├── ui-kit/ ← interactive macOS UI kit
+│ ├── index.html ← click-thru of every screen in the app
+│ └── *.jsx ← React components (Sidebar, Chat, Dashboard…)
+│
+├── tokens/ ← design-system cards
+│ ├── _preview.css ← shared card styling
+│ ├── colors-*.html ← brand / neutrals / semantic / tool-kinds
+│ ├── type-*.html ← display / body / mono
+│ ├── spacing-*.html ← scale / radii / shadows
+│ ├── components-*.html ← buttons / forms / sidebar / cards / chat / composer / tool-call
+│ ├── iconography.html
+│ └── brand-mark.html
+│
+└── assets/ ← icons, brand artwork
+```
+
+## How to use it
+
+- **Browse offline**: double-click `index.html`. Everything renders locally;
+ the only network dependency is Google Fonts (Inter + JetBrains Mono).
+- **Host as a site**: drop the whole folder onto any static host (Netlify,
+ GitHub Pages, S3, your own nginx). Nothing needs building.
+- **Embed in a doc**: link individual cards directly, e.g.
+ `static-site/tokens/colors-brand.html`.
+- **Show the macOS app**: `static-site/ui-kit/index.html` runs the full
+ React-based interactive kit (single self-contained file — works from
+ `file://`, no server needed). The traffic-light corner makes it look like
+ the real app. Source components live alongside as `*.jsx` for editing —
+ re-bundle into `index.html` when you change them.
+
+## Notes
+
+- The kit's `index.html` is a self-contained bundle — React, Babel, Lucide
+ and every component are inlined, so it works from `file://` with no
+ network. The original split-file source is preserved as
+ `ui-kit/index.source.html` next to the `.jsx` files for editing.
+- The font import in `colors_and_type.css` (`fonts.googleapis.com`) is the
+ only other network call. Replace with locally-served WOFF2 if you need
+ airgapped use.
diff --git a/design/static-site/assets/scarf-app-icon-1024.png b/design/static-site/assets/scarf-app-icon-1024.png
new file mode 100644
index 0000000..e16b745
Binary files /dev/null and b/design/static-site/assets/scarf-app-icon-1024.png differ
diff --git a/design/static-site/assets/scarf-app-icon-128.png b/design/static-site/assets/scarf-app-icon-128.png
new file mode 100644
index 0000000..73107e2
Binary files /dev/null and b/design/static-site/assets/scarf-app-icon-128.png differ
diff --git a/design/static-site/assets/scarf-app-icon-256.png b/design/static-site/assets/scarf-app-icon-256.png
new file mode 100644
index 0000000..f0bceae
Binary files /dev/null and b/design/static-site/assets/scarf-app-icon-256.png differ
diff --git a/design/static-site/assets/scarf-app-icon-512.png b/design/static-site/assets/scarf-app-icon-512.png
new file mode 100644
index 0000000..2b21938
Binary files /dev/null and b/design/static-site/assets/scarf-app-icon-512.png differ
diff --git a/design/static-site/assets/scarf-icon-flame-1024.png b/design/static-site/assets/scarf-icon-flame-1024.png
new file mode 100644
index 0000000..182e9f4
Binary files /dev/null and b/design/static-site/assets/scarf-icon-flame-1024.png differ
diff --git a/design/static-site/assets/scarf-icon-flame-256.png b/design/static-site/assets/scarf-icon-flame-256.png
new file mode 100644
index 0000000..b32ddec
Binary files /dev/null and b/design/static-site/assets/scarf-icon-flame-256.png differ
diff --git a/design/static-site/assets/scarf-icon-geo-1024.png b/design/static-site/assets/scarf-icon-geo-1024.png
new file mode 100644
index 0000000..a2e75e1
Binary files /dev/null and b/design/static-site/assets/scarf-icon-geo-1024.png differ
diff --git a/design/static-site/assets/scarf-icon-geo-256.png b/design/static-site/assets/scarf-icon-geo-256.png
new file mode 100644
index 0000000..829a251
Binary files /dev/null and b/design/static-site/assets/scarf-icon-geo-256.png differ
diff --git a/design/static-site/assets/scarf-icon-horizon-1024.png b/design/static-site/assets/scarf-icon-horizon-1024.png
new file mode 100644
index 0000000..0bfe8f3
Binary files /dev/null and b/design/static-site/assets/scarf-icon-horizon-1024.png differ
diff --git a/design/static-site/assets/scarf-icon-horizon-256.png b/design/static-site/assets/scarf-icon-horizon-256.png
new file mode 100644
index 0000000..0aff12e
Binary files /dev/null and b/design/static-site/assets/scarf-icon-horizon-256.png differ
diff --git a/design/static-site/assets/scarf-icon.png b/design/static-site/assets/scarf-icon.png
new file mode 100644
index 0000000..2eaf0bb
Binary files /dev/null and b/design/static-site/assets/scarf-icon.png differ
diff --git a/design/static-site/colors_and_type.css b/design/static-site/colors_and_type.css
new file mode 100644
index 0000000..f55e07d
--- /dev/null
+++ b/design/static-site/colors_and_type.css
@@ -0,0 +1,193 @@
+/* Scarf Design System — colors + type tokens. v2 (amber→rust)
+ *
+ * Light/dark via [data-theme="dark"] override on a parent. Default light.
+ *
+ * v2 changes: brand shifted from purple to a tri-stop amber→rust gradient.
+ * Neutrals warmed (yellow undertone). Semantic green/blue/red/orange preserved
+ * — those still mean success/info/danger and remain the tool-kind colors in chat.
+ */
+
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
+
+:root {
+ /* ───── Brand — amber → rust ───── */
+ --brand-50: #FBF1E8;
+ --brand-100: #F6E0CB;
+ --brand-200: #EFC59E; /* highlight stop in tri-gradient */
+ --brand-300: #E89360; /* gradient start */
+ --brand-400: #D87844;
+ --brand-500: #C25A2A; /* primary accent — Scarf Rust */
+ --brand-600: #A6481E;
+ --brand-700: #7A2E14; /* gradient end */
+ --brand-800: #5C220F;
+ --brand-900: #3B1608;
+
+ /* ───── Neutrals (warm, slight amber tint) ───── */
+ --gray-0: #FFFFFF;
+ --gray-50: #FBF9F6;
+ --gray-100: #F4F1EC;
+ --gray-200: #EAE5DD;
+ --gray-300: #D8D1C5;
+ --gray-400: #B5ABA0;
+ --gray-500: #8C857B;
+ --gray-600: #6A645B;
+ --gray-700: #4A463F;
+ --gray-800: #2D2A25;
+ --gray-900: #1A1814;
+ --gray-950: #100E0B;
+
+ /* ───── Semantic palette ───── */
+ --green-500: #2AA876;
+ --green-600: #1F7F5A;
+ --green-100: #D8F0E5;
+ --red-500: #D9534F;
+ --red-600: #B83C38;
+ --red-100: #F8DAD8;
+ --orange-500: #F0AD4E; /* reasoning / warning — distinct from brand rust */
+ --orange-100: #FCEAD0;
+ --blue-500: #3498DB;
+ --blue-100: #D8ECF8;
+ --indigo-500: #5B6CD9;
+ --purple-tool-500: #8E5BC9;
+
+ /* ───── Surfaces (light) ───── */
+ --fg: var(--gray-900);
+ --fg-muted: var(--gray-600);
+ --fg-faint: var(--gray-500);
+ --bg: var(--gray-50);
+ --bg-card: var(--gray-0);
+ --bg-quaternary: rgba(45, 42, 37, 0.04);
+ --bg-tertiary: rgba(45, 42, 37, 0.07);
+ --border: rgba(45, 42, 37, 0.08);
+ --border-strong: rgba(45, 42, 37, 0.14);
+
+ /* ───── Brand tokens (semantic) ───── */
+ --accent: var(--brand-500);
+ --accent-hover: var(--brand-600);
+ --accent-active: var(--brand-700);
+ --accent-tint: rgba(194, 90, 42, 0.10);
+ --accent-tint-strong: rgba(194, 90, 42, 0.18);
+ --on-accent: #FFFFFF;
+
+ /* ───── Type stacks ───── */
+ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", "Segoe UI", Roboto, sans-serif;
+ --font-display: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Inter", "Segoe UI", sans-serif;
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
+
+ /* ───── Type scale ───── */
+ --text-caption2: 10px;
+ --text-caption: 12px;
+ --text-footnote: 13px;
+ --text-body: 14px;
+ --text-callout: 15px;
+ --text-subhead: 16px;
+ --text-headline: 17px;
+ --text-title3: 20px;
+ --text-title2: 22px;
+ --text-title1: 28px;
+ --text-largeTitle: 34px;
+
+ --leading-tight: 1.2;
+ --leading-snug: 1.35;
+ --leading-normal: 1.5;
+ --leading-relaxed: 1.6;
+
+ --weight-regular: 400;
+ --weight-medium: 500;
+ --weight-semibold: 600;
+ --weight-bold: 700;
+
+ /* ───── Radii / spacing / shadow ───── */
+ --r-sm: 4px;
+ --r-md: 6px;
+ --r-lg: 8px;
+ --r-xl: 12px;
+ --r-2xl: 14px;
+ --r-pill: 999px;
+
+ --space-1: 4px;
+ --space-2: 8px;
+ --space-3: 12px;
+ --space-4: 16px;
+ --space-5: 20px;
+ --space-6: 24px;
+ --space-8: 32px;
+ --space-10: 40px;
+
+ --shadow-sm: 0 1px 2px rgba(45, 42, 37, 0.05);
+ --shadow-md: 0 1px 2px rgba(45, 42, 37, 0.04), 0 4px 12px rgba(45, 42, 37, 0.04);
+ --shadow-lg: 0 2px 4px rgba(45, 42, 37, 0.06), 0 8px 24px rgba(45, 42, 37, 0.07);
+ --shadow-xl: 0 4px 8px rgba(45, 42, 37, 0.08), 0 16px 40px rgba(45, 42, 37, 0.10);
+ --shadow-focus: 0 0 0 3px rgba(194, 90, 42, 0.28);
+
+ --gradient-brand: linear-gradient(135deg, #E89360 0%, #C25A2A 50%, #7A2E14 100%);
+ --gradient-brand-soft: linear-gradient(135deg, #F6E0CB 0%, #EFC59E 100%);
+
+ --ease-smooth: cubic-bezier(0.32, 0.72, 0, 1);
+ --dur-fast: 120ms;
+ --dur-base: 200ms;
+ --dur-slow: 300ms;
+}
+
+[data-theme="dark"] {
+ --fg: #EDE8E0;
+ --fg-muted: #A39C92;
+ --fg-faint: #756F66;
+ --bg: #15130F;
+ --bg-card: #1F1C18;
+ --bg-quaternary: rgba(255, 248, 235, 0.05);
+ --bg-tertiary: rgba(255, 248, 235, 0.08);
+ --border: rgba(255, 248, 235, 0.08);
+ --border-strong: rgba(255, 248, 235, 0.14);
+
+ --accent: #E89360;
+ --accent-hover: #F0A879;
+ --accent-active: #D87844;
+ --accent-tint: rgba(232, 147, 96, 0.14);
+ --accent-tint-strong: rgba(232, 147, 96, 0.24);
+
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.35);
+ --shadow-md: 0 1px 2px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.35);
+ --shadow-lg: 0 2px 4px rgba(0, 0, 0, 0.45), 0 8px 24px rgba(0, 0, 0, 0.45);
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme="light"]) {
+ --fg: #EDE8E0;
+ --fg-muted: #A39C92;
+ --fg-faint: #756F66;
+ --bg: #15130F;
+ --bg-card: #1F1C18;
+ --bg-quaternary: rgba(255, 248, 235, 0.05);
+ --bg-tertiary: rgba(255, 248, 235, 0.08);
+ --border: rgba(255, 248, 235, 0.08);
+ --border-strong: rgba(255, 248, 235, 0.14);
+
+ --accent: #E89360;
+ --accent-hover: #F0A879;
+ --accent-active: #D87844;
+ --accent-tint: rgba(232, 147, 96, 0.14);
+ --accent-tint-strong: rgba(232, 147, 96, 0.24);
+ }
+}
+
+/* ───── Semantic type rules ───── */
+body, .scarf-body {
+ font-family: var(--font-sans);
+ font-size: var(--text-body);
+ line-height: var(--leading-normal);
+ color: var(--fg);
+ background: var(--bg);
+ -webkit-font-smoothing: antialiased;
+}
+
+.scarf-h1 { font-family: var(--font-display); font-size: var(--text-largeTitle); font-weight: 600; line-height: 1.2; letter-spacing: -0.02em; }
+.scarf-h2 { font-family: var(--font-display); font-size: var(--text-title1); font-weight: 600; line-height: 1.2; letter-spacing: -0.015em; }
+.scarf-h3 { font-family: var(--font-display); font-size: var(--text-title2); font-weight: 600; line-height: 1.35; letter-spacing: -0.01em; }
+.scarf-headline { font-family: var(--font-sans); font-size: var(--text-headline); font-weight: 600; line-height: 1.35; }
+.scarf-subhead { font-family: var(--font-sans); font-size: var(--text-subhead); font-weight: 500; line-height: 1.35; }
+.scarf-body-text { font-family: var(--font-sans); font-size: var(--text-body); line-height: 1.5; }
+.scarf-caption { font-family: var(--font-sans); font-size: var(--text-caption); line-height: 1.5; color: var(--fg-muted); }
+.scarf-caption-strong { font-family: var(--font-sans); font-size: var(--text-caption); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--fg-muted); }
+.scarf-mono { font-family: var(--font-mono); font-size: 0.92em; }
+.scarf-code { font-family: var(--font-mono); font-size: 0.9em; background: var(--bg-quaternary); padding: 1px 5px; border-radius: var(--r-sm); color: var(--fg); }
diff --git a/design/static-site/index.html b/design/static-site/index.html
new file mode 100644
index 0000000..8359017
--- /dev/null
+++ b/design/static-site/index.html
@@ -0,0 +1,382 @@
+
+
+
+
+
+ Scarf Design System
+
+
+
+
+
+
+
+
+
+
+
Scarf Design System
+
A native macOS & iOS companion for the Hermes AI agent — calm, confident, and rust-warm. This site documents the palette, type, components, and screens.
+
+ Today · 9:42 AM
+
+ What's the status of the daily-summary cron job? I need to know if it's healthy before I push the new schedule changes.
+
+
+
+
+
+
+ The daily-summary job ran 14 minutes ago and completed
+ successfully in 14.2 s, using 1,847 tokens. Next run is scheduled for tomorrow at 09:00 — safe to ship the schedule changes.
+
+
+
+
+ Show me what it produced.
+
+
+
+
The latest summary covers April 24, 2026. Highlights:
+ The user wants the status of a specific cron job named "daily-summary".
+ I should check the cron registry first, then look at the most recent execution
+ via hermes cron status. If exit_code is 0,
+ the job is healthy and the schedule push is safe.
+