# BooCode — Roadmap Last updated: 2026-05-17 ## Overview BooCode is a standalone code-chat tool at `/opt/boocode/`. Read-only by design in v1.x — pick a project, chat with a local LLM that has file-inspection tools, get streaming responses over WebSocket. Live at `https://code.indifferentketchup.com` (Caddy → Authelia → Tailscale → `100.114.205.53:9500`). **Architectural commitments:** - No embeddings. File-view tools + sidecar analyzers replace RAG. - Read-only in v1.x. Write tools land in BooCoder (separate container, post-v1.x). - One Postgres (`boocode_db`), one frontend SPA, container-per-service for new capabilities. ## Current state - **main:** v1.8.1 (`b09d0ff` was last known tip prior to v1.8.2). - **Just merged / committed to main:** v1.8.2 — tool-loop fixes (read-only loop cap raised, "tool loop depth exceeded" error surfaced with continue button, `max_tool_calls` AGENTS.md frontmatter, `messages.metadata` column). - **In flight RIGHT NOW:** **v1.x-themes** branch — Claude Code implementing 18-theme system. See "Active work" below. ## Active work ### v1.x-themes — Theme system (in flight) **Spec source:** locked in this session. Anchors below derived from `/mnt/user-data/uploads/boocode-theme-previews.html` (16 themes extracted) + spec §3 family rules for the two missing (`fuchsia-noir`, `midnight-sapphire`). **18 themes, grouped:** | Family | IDs | |---|---| | Neutral dark | obsidian (default), gunmetal | | Brown / warm | espresso, volcanic-brown | | Orange / amber | copper, gold | | Red | oxblood, crimson | | Purple | elderflower, plum | | Pink / magenta | steel-pink, fuchsia-noir | | Green | matrix, sage | | Blue | cobalt, midnight-sapphire | | Light-only | ivory, chalk | **Dark anchors (bg, card, border, muted-fg, accent):** ``` obsidian #0c0c0e #15151a #1f1f23 #6b6b75 #8b5cf6 gunmetal #0d1117 #161b22 #21262d #7d8590 #388bfd espresso #1c1410 #241a14 #2e2218 #8a7058 #c8a880 volcanic-brown #140906 #1e0e0a #2e1610 #7a4030 #cc4a1a copper #100800 #1c1408 #2e1f0a #8a6040 #b87333 gold #0e0800 #1a1200 #2a1f00 #a07c30 #d4af37 oxblood #0a0303 #180606 #2a0808 #7a3028 #8b1a1a crimson #0e0404 #1a0808 #2e0a0a #8a3030 #dc143c elderflower #100818 #1c1024 #2c1830 #8a78a0 #b89cd8 plum #0c0814 #180e20 #241830 #7a4878 #8e4585 steel-pink #0e0408 #1a080e #2e0c1a #9a4070 #cc33aa fuchsia-noir #0a0610 #14081a #2a0c2e #8a3878 #ff1493 matrix #000a00 #031403 #0a200a #208030 #00ff41 sage #0a0e08 #141a10 #1e2e1a #7a8870 #9caf88 cobalt #020817 #061434 #0c2244 #3060a0 #0047ab midnight-sapphire #02050e #060c1f #0e1a36 #4a6088 #1e3a8a ivory #fdfcf8 #f5f2e8 #e8e4d8 #8a8478 #3a3328 (light-only) chalk #fafaf7 #f0f0ec #e5e5e0 #75756e #2a2a28 (light-only) ``` **Light-variant derivation (for the 16 dark themes):** - Lightest anchor → background - Accent darkens ~15% (HSL L − 15pp) - Foreground = near-black tinted toward family hue - Surfaces / borders scale up symmetrically **Fallback:** `ivory` or `chalk` + dark mode → `obsidian` dark. **Token map (shadcn nova set):** ``` background ← anchor 1 card / popover ← anchor 2 border / muted ← anchor 3 muted-foreground ← anchor 4 primary / accent ← anchor 5 foreground ← derived: anchor-5 hue, ~92% L, ~25% S --destructive ← red family, unchanged across themes --ring ← per-theme accent --radius ← 0.5rem locked fonts ← Inter + JetBrains Mono locked ``` **Wiring locked:** - Schema: `settings.theme_id TEXT NOT NULL DEFAULT 'obsidian'`, `settings.theme_mode TEXT NOT NULL DEFAULT 'dark' CHECK IN ('dark','light','system')` - API: GET `/api/settings` extended, PATCH whitelists 18 theme ids → 400 otherwise - CSS: `apps/web/src/styles/themes/*.css` (18 + `_tokens.css`), imported from `globals.css` (NOT `index.css`) - `.theme-` + `.theme-.dark` composed on `` - `apps/web/src/lib/theme.ts` (new): `THEMES` const, `applyTheme(id, mode)`, `useTheme()` hook. matchMedia subscribed only when `mode === 'system'` - `apps/web/src/App.tsx`: `useTheme()` at top - Settings page: card grid, mode toggle (radio: Dark/Light/System). No header dropdown. - shadcn primitives: `card`, `radio-group` installed via `pnpm dlx shadcn@latest add`. `button`, `label` already present. - FOUC mitigation: localStorage cache + inline `