A design system for Threadbase — a cross-platform suite for browsing, searching, and resuming Claude Code conversation history. Threadbase ships as an Electron desktop app, a VS Code extension, an IntelliJ plugin, a CLI, and an Expo / React Native mobile remote-control app for Claude Code agent sessions running on a server.
This design system captures the brand's visual DNA — the midnight canvas, the cyan-blue "thread" lines, the warm amber "live / now" highlights, the IDE-grade density — so any future surface (mobile screens, marketing slides, settings panes, onboarding flows) lands inside the same world.
This system was reverse-engineered from the publicly accessible parts of the Threadbase monorepo. Treat link access as not assumed for the reader.
- Root repo:
github.com/RonenMars/threadbase— README, CLAUDE.md, IMPLEMENTATION-GUIDELINES.md, feature-comparison.md, status-mobile.md - App icons:
threadbase/app-icon/threadbase-icon.svgandthreadbase-icon-chat.svg— copied intoassets/ - The
mobile/submodule (RonenMars/threadbase-mobile, private) and most app submodules (electron,vscode,intellij,landing-page) were not directly readable from this environment. The status doc (status-mobile.md) was the primary written reference for the mobile app's structure and feature set.
⚠️ Caveat for the user. Because the mobile, electron, vscode, intellij, and landing-page submodules were inaccessible, the colors/typography/spacing here are derived from the two SVG icons + Tailwind/NativeWind conventions called out in the docs. Any concrete tokens (exact hex values insidetheme.ts, Tailwindtailwind.config.js, real font choices) should be reconciled against the source if/when the repos become accessible. Sections flagged "📌 derived" below are educated extrapolations.
| Path | What |
|---|---|
README.md |
This file. Brand overview, content fundamentals, visual foundations, iconography. |
SKILL.md |
Cross-compatible Agent Skill manifest — drop the folder into .claude/skills/threadbase-design/ to use as a Claude Code skill. |
colors_and_type.css |
Single source of truth for color + typography CSS variables. Import it on every page. |
assets/ |
Brand SVG icons (logo + "chat" mark variant). Copy from here, never link cross-project. |
preview/ |
Small HTML cards that render in the Design System tab (palettes, type specimens, components, motifs). |
ui_kits/mobile/ |
High-fidelity recreation of the Threadbase mobile (Expo / React Native) app. JSX components + an interactive index.html. |
slides/ |
Not included. No deck template was provided. |
Threadbase sits between two worlds: the developer's terminal (where Claude Code actually runs) and a thoughtful, almost archival reading surface (where past conversations get browsed, searched, and resumed). The brand splits the difference:
- Dark, IDE-grade — near-black canvas (
#070b11), 32-px grid pattern, hairline dividers in deep navy. - Two-color signal — cyan-blue (
#63b3ff) is the "thread" / data / past, amber (#f08a24) is "live / now / running". Almost everything else is greyscale. - Soft glow — both accent colors carry a Gaussian-blur halo when they signify state. Glow is the brand's primary expressive move.
- No decorative gradients, no purple, no emoji-as-UI. Color carries meaning; everything else is grey.
Threadbase writes the way a senior engineer would write internal docs: dense, factual, lightly opinionated, occasionally dry. It assumes the reader knows what a JSONL file is and what ~/.claude/ contains. It does not over-explain.
- Person. Mostly third-person product voice ("Threadbase reads the same local JSONL files…", "All platforms enforce the same layered boundary…"). Second-person ("you") only in setup steps and CTAs. First-person plural ("we") is avoided — this is a tool, not a team blog.
- Tone. Plain, declarative, technical. No marketing throat-clearing. Sentences favor verbs over adjectives.
- Casing. Sentence case in UI ("Resume in terminal", not "Resume In Terminal"). Title Case is reserved for proper nouns and product names ("Claude Code", "VS Code", "IntelliJ Plugin"). UPPER CASE shows up only for status states (LIVE, RUNNING, FAILED) and lane labels in the kanban.
- Punctuation. Em-dashes are normal. Colons introduce specifics. Trailing periods on UI strings are dropped on buttons and labels, kept in body copy.
- Code voice. Backtick everything technical:
pnpm install,~/.claude/,feat(scanner): …. Conventional Commits (feat:,fix:,chore:) are part of the brand voice.
✅ Used:
- Concrete platform/tech names: "Electron", "FlexSearch 0.7", "Lucene 9.x", "node-pty", "JCEF", "xterm.js", "Zustand", "React Query".
- Crisp feature framing: "Two-tier indexing", "Embedded xterm.js terminal", "Speed search overlay".
- Honest scope language: "Tier 1 / Tier 2 / Tier 3", "WIP", "deprecated", "v0.1.0", "Milestone 2".
- Quiet attribution: "MIT — not affiliated with Anthropic. Claude Code is a product of Anthropic." (Always present, never hidden.)
🚫 Avoided:
- Hype words: seamless, powerful, supercharge, revolutionize, AI-powered (ironic given the subject — but the product uses AI history, it doesn't sell AI).
- Emoji in UI copy or marketing prose. The product uses an emoji picker (for user-defined profile avatars) but the system itself never speaks in emoji.
- Exclamation marks. There are essentially zero across the docs.
- Filler intros ("In today's fast-moving world…").
- "A cross-platform suite for browsing, searching, and resuming your Claude Code conversation history."
- "All platforms enforce the same layered boundary: pure domain logic → platform adapter → UI."
- "Sort sessions by recency, message count, or alphabetically from the terminal."
The IMPLEMENTATION-GUIDELINES doc spells this out and we follow it:
| Feature language (avoid) | Benefit language (use) |
|---|---|
| Added --sort flag to cch list | Sort sessions by recency, message count, or alphabetically from the terminal |
| Implemented TaskToolCard component | Task agent cards show AI planning context in-line with the conversation |
Both app icons share one diagram: a vertical "thread spine" running down the left, with horizontal capsule rows branching off it. The top three capsules are cyan-blue (past messages / threads); the bottom one is amber (the active / live row). The whole thing sits on a dark grid. Every screen in this system is allowed — encouraged — to echo that diagram.
| Token | Hex | Role |
|---|---|---|
--tb-ink-1 |
#070b11 |
Canvas. The base everything sits on. |
--tb-ink-2 |
#0b1220 |
Card surface. |
--tb-ink-5 |
#1a2d47 |
Hairlines, the 32-px grid. |
--tb-blue-400 |
#63b3ff |
Brand blue — threads, links, primary actions, focus. |
--tb-amber-400 |
#f08a24 |
Brand amber — live / running / now. |
--tb-success-400 |
#4ade80 |
Completed. |
--tb-danger-400 |
#ff6b6b |
Failed / errors / removed-line bars. |
Rules.
- One accent per surface. If amber is on screen, it means "this is the live one." Don't decorate with it.
- Never put blue on amber or vice versa as adjacent fills — they always sit on ink.
- Light-text-on-dark-surface only. The system has no light mode.
- Tints below 12% opacity over ink read as "soft" backgrounds for chips and lane headers.
Real type stack on the source side is font-sans from Tailwind / NativeWind defaults — i.e. system sans plus emoji fallbacks. We lock to Inter (sans / display) and JetBrains Mono (code, terminal, kbd, message metadata) as a deliberate, brand-flattering substitute that matches the IDE aesthetic.
🔁 Substitution flagged. If the codebase ships a different sans (e.g.
SF Pro,Geist,Söhne), drop the.ttf/.woff2intofonts/and updatecolors_and_type.css.
Scale (see colors_and_type.css for the full set):
| Role | Size / line-height | Family / weight |
|---|---|---|
| Display | 60 / 64 | Inter Semibold, tight tracking |
| H1 | 36 / 44 | Inter Semibold, tight tracking |
| H2 | 24 / 32 | Inter Semibold |
| H3 | 18 / 26 | Inter Semibold |
| Body | 14 / 20 | Inter Regular |
| Body sm | 13 / 18 | Inter Regular |
| Meta | 12 / 16 | Inter Medium, --color-fg-subtle |
| Eyebrow | 12 / 16 | Inter Semibold, UPPER, 0.08em tracking |
| Code / kbd / terminal | 13 / 18 | JetBrains Mono |
A 4-px base. Effective rhythm: 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64. Card interiors land on 16 or 20; section gutters on 24 or 32. Mobile screen padding is 16; desktop sidebar item padding is 12 / 8.
- Canvas: flat
--tb-ink-1. - Marketing / hero / app-icon backgrounds: the canvas + the 32-px grid (
--grid-bgin CSS) + an optional radial glow centered slightly above middle (bgGlow: from#0f1e35core to#070b11edge). - Cards:
--tb-ink-2with a 1-px--tb-ink-5hairline. No drop shadows by default. - No imagery / illustrations / photos. The product is data; the brand is structural. If imagery is needed, mock it as a placeholder.
- No bluish-purple gradients. No textures. No grain. The grid is the only repeating pattern.
- Standard easing:
cubic-bezier(0.2, 0.7, 0.2, 1)(--ease-standard) for almost everything. - Out (entry):
cubic-bezier(0.16, 1, 0.3, 1)for things appearing. - Durations: 120 / 180 / 280 ms. Hover transitions stay at 120 ms.
- No bounces. Nothing overshoots. This is a tool, not a toy.
- Live / running indicators pulse the amber glow (opacity 0.4 → 1 → 0.4 over ~1.6 s) — that pulse is a brand signature.
- Streamed terminal output does not animate beyond the cursor blink (1 s, hard step). Don't fade in lines.
- Hover on bg surfaces: bump from
--tb-ink-2→--tb-ink-3. On accent fills: shift to--tb-blue-300. On text-only links: underline +--tb-blue-300. - Focus: 2 px outline using
--color-focus-ring(rgba blue 0.55), 2 px offset, no rounding override. - Press: color shifts to
--tb-blue-500(one step darker). Buttons translate 0 px (no scale-down). Cards shrink 1 px scale only when explicitly tappable on mobile. - Disabled:
--color-fg-disabledtext on unchanged surface,cursor: not-allowed.
- Default border: 1 px
--color-border(--tb-ink-5). - Dividers between rows in lists: 1 px
--color-divider(8% blue tint over ink). The blue tint is what makes them feel "Threadbase" rather than generic. - The vertical thread spine in lists / chats / timelines is 2-3 px wide,
--tb-ink-7, optionally with a single accent dot on the active row.
| Use | Token |
|---|---|
| Resting card on dark canvas | --shadow-md (subtle, mostly inset hairline) |
| Floating sheet / popover | --shadow-lg |
| Active state on a brand-blue element | --shadow-glow-blue |
| Live / running / now indicator | --shadow-glow-amber |
The glow tokens are how the icons feel — never a hand-rolled filter: drop-shadow(...) — go through the token.
- Sheet overlays use
rgba(4,7,11,0.72)+backdrop-filter: blur(12px). - Bottom sheets and command palettes use the same.
- Inline content does not use translucency. No frosted cards, no glassmorphism beyond modal scrims.
Cool, midnight, tinted slightly cyan. If a photo is ever introduced, run it through a mix-blend-mode: luminosity over the canvas so it doesn't fight the palette. (This is rare — the brand prefers diagrams to photos.)
| Use | Radius |
|---|---|
| Inline chip / kbd | 4 / 6 px |
| Button, input, card | 8 px |
| Larger card / sheet | 12–16 px |
| Bottom sheet top edge | 20 px |
| Pill (status badge, lane chip) | 999 px |
| App icon | 22.5% (iOS-style superellipse) |
A "card" in Threadbase is: --tb-ink-2 background, 1 px --tb-ink-5 border, --radius-lg (12 px) corners, no drop shadow at rest, optional 1-px inset top highlight at 4-5% blue. On hover, raise to --tb-ink-3 and brighten the border one step.
- Mobile. 16-px screen gutter. Top safe area + 12-px header. Bottom tab bar 56 px tall, full-bleed
--tb-ink-2, top hairline only. Bottom-sheet handle is 36×4 px,--tb-ink-6, 8 px above sheet content. - Desktop. Resizable left sidebar (240–800 px, persisted). Top toolbar height 44 px,
--tb-ink-4. Conversation viewer max content width none — code blocks need the room.
Threadbase has a brand mark (and a "chat" variant) that lives in assets/:
assets/threadbase-icon.svg— primary mark. Vertical thread spine, three blue capsule rows, one amber row at the bottom.assets/threadbase-icon-chat.svg— variant that draws message bubbles instead of capsules. Use this for chat-specific surfaces (the terminal screen, conversation viewer empty state, etc).
Both are 512×512 with a 96-px corner radius (≈19% — close to the iOS superellipse target but rendered as rx).
The Threadbase codebases (Tailwind / NativeWind on the mobile and electron sides) most likely lean on Lucide or Heroicons — both are stroke-based, 24×24 with a 1.5-2 px stroke, which match the icon aesthetic of the brand mark (thin, geometric, evenly-weighted).
🔁 Substitution flagged. Until the source codebases are readable, this system links Lucide React from CDN as the icon font. The closest match for stroke weight, line caps, and geometric clarity. If the real codebase uses Heroicons (or a custom set), swap the CDN line.
<!-- in HTML cards / kits -->
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.js"></script>// in React components
import { MessageSquare, Search, Terminal, GitBranch } from 'lucide-react';- Always stroke icons at the same weight as the surrounding type (1.5 px next to body 14, 2 px next to h2+).
- Use brand blue for interactive icon controls; use
--color-fg-mutedfor non-interactive metadata icons. - Use amber-stroke icons only to mean "live" / "running" / "now". Never decorative.
- Status bullets (LIVE, RUNNING, FAILED, COMPLETED) are filled circles 8 px, NOT icons.
- No emoji as icons — except inside the user-controlled "profile emoji" feature, where the user picks one to label themselves. There the emoji is content, not chrome.
- No PNGs. Everything is SVG. Don't rasterize.
- Unicode arrows (
→,↗) are fine in body copy but not as primary controls.
The richer reference is in preview/ and ui_kits/mobile/. Inline summary:
- Button — 8-px radius, 36 px tall (sm) / 40 px (md) / 44 px (lg, hit target on mobile). Primary: amber fill on dark, OR blue fill on dark depending on whether it's a "live action" (start, run, resume) vs "navigate" (open, view). Secondary:
--tb-ink-3fill, 1 px--tb-ink-6border. Ghost: text only, blue. - Input —
--tb-ink-2fill, 1 px--tb-ink-5border, focus = 2 px focus ring. Placeholder--color-fg-disabled. 40 px tall. - Status pill —
--radius-pill, 6-px H padding, 2-px V padding, 11/14 type, UPPER, 0.08em tracking. Background = 12% accent over ink; text = full accent. - Lane header (Kanban) — eyebrow type + count badge. Coloring matches lane semantic.
- Conversation row — 12-px V padding, 16-px H. Title + project + timestamp + chips on right. Live chip is amber-pulsing.
- Tool result card — 12-px radius, monospace content, header row with tool name (mono) + status pill.
This design system describes the look and feel of the Threadbase open-source project (MIT). It is not a Claude or Anthropic brand resource; the README explicitly notes "MIT — not affiliated with Anthropic. Claude Code is a product of Anthropic."