v1.8.3 (tool-call compaction), themes-v1, v1.9 (settings pane + per-project defaults + bulk archive), and v1.11 (agents Tier 2) were all marked Planned/in-flight in the roadmap despite being merged on main. Reconcile the Batch summary table and reorder the Order of operations to start at v1.10. Drop the stale "Active work" section — themes-v1 description belongs in the past tense now. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
11 KiB
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 (
b09d0ffwas 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_callsAGENTS.md frontmatter,messages.metadatacolumn). - 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/settingsextended, PATCH whitelists 18 theme ids → 400 otherwise - CSS:
apps/web/src/styles/themes/*.css(18 +_tokens.css), imported fromglobals.css(NOTindex.css) .theme-<id>+.theme-<id>.darkcomposed on<html>apps/web/src/lib/theme.ts(new):THEMESconst,applyTheme(id, mode),useTheme()hook. matchMedia subscribed only whenmode === '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-groupinstalled viapnpm dlx shadcn@latest add.button,labelalready present. - FOUC mitigation: localStorage cache + inline
<script>inindex.htmlsets<html>class before React hydrates
Out of scope (v1):
- Custom user palettes (no color picker)
- Per-project / per-session themes
- Shiki syntax-highlighting themes
- Header quick-switcher
Verify after Claude Code hands back:
fuchsia-noirandmidnight-sapphirevisual check — derived, not from preview. Swap hexes if they read wrong.- Light variants of the 16 dark themes — algorithmic. Spot-check 3-4 across families (warm/cool/dark/saturated).
- FOUC on hard reload, theme-switch persistence, system-mode matchMedia teardown.
Batch summary
| Version | Theme | Status |
|---|---|---|
| v1.0 | Initial scaffold, read-only tools, WS streaming | ✅ Merged |
| v1.1-batch1 | Markdown, Copy + Regen, tok/s + ctx, AI naming | ✅ Merged |
| v1.1-batch2 | Sidebar restructure | ✅ Merged |
| v1.1-batch3 | Pane system, FileBrowserPane + Shiki, cross-tab | ✅ Merged |
| v1.1-batch3.5 | Chip infra, @file, line-select |
✅ Merged |
| v1.2 | Chats inside sessions, right-rail, /compact, archive, force-send |
✅ Merged |
| v1.2-project-ux | Project archive, sidebar context, Gitea API, bootstrap | ✅ Merged |
| v1.3 | Tab-close + chat-archive | ✅ Merged |
| v1.4 | Fork message, delete message, header polish (was original Batch 5) | ✅ Merged |
| v1.5 | resolveProjectPath, BOOTSTRAP_ROOT, vitest pin | ✅ Merged |
| v1.5.1 | Bootstrap hotfix (git in container, SSH keypair, known_hosts) | ✅ Merged (4a9f207) |
| v1.6 | Mobile pass: drawer, single-pane, long-press, IME-safe, pull-to-refresh, swipe-close | ✅ Merged |
| v1.6.1 | RightRail mobile wrapper fix | ✅ Merged |
| Tool-loop bump | MAX_TOOL_LOOP_DEPTH 5→15 | ✅ Merged |
| v1.6.2 | Workspace + Session+Project headers, ChatTabBar new-chat, RightRail mobile drawer | ✅ Merged |
| v1.7 | Drag-drop file + paste-as-attachment (was Batch 6) | ✅ Merged |
| v1.8 | Settings drawer + git_status added to ALL_TOOL_NAMES (was Batch 7) |
✅ Merged |
| v1.8.1 | WS reconnect toast tuning (silent/gray/red thresholds), pane status indicators | ✅ Merged |
| v1.8.2 | Tool-loop fixes: read-only cap raised, "depth exceeded" error + continue, max_tool_calls frontmatter, messages.metadata |
✅ Merged |
| v1.x-themes | 18 themes, settings page, dark/light/system, FOUC mitigation | 🔄 Claude Code in flight |
| v1.8.3 | Tool call UI compaction: collapse-by-default, group consecutive same-tool, result preview cap | Planned (small, frontend-only) |
| v1.9 | Settings pane (system prompt per project + session, web search toggle, + button) |
Planned (spec locked, was on branch v1.9-settings-pane) |
| v1.10 | Web search backend: SearXNG web_search + web_fetch |
Planned |
| v1.11 | Agents Tier 2: AGENTS.md, per-agent temp/tools whitelist, AgentPicker in ChatInput |
Planned |
| v1.12 | BooTerm: separate container, xterm.js + node-pty + tmux | Planned |
| v1.13 | Architect: codecontext sidecar (MCP, tree-sitter, no embeddings) | Planned |
| v1.13b | Architect: repo health (call graph, circular deps, dead code) | Planned |
| v1.14 | Tool approval + plan/act mode (cline-style) | Planned |
| Post-v1.x | Append-only event log (OpenHands V1) | Planned |
| Post-v1.x | BooCoder pending-changes (plandex) | Planned |
| Post-v1.x | BooCoder runtime isolation (per-session Docker sandbox) | Planned |
| Optional | Multi-provider LLM abstraction (pi-ai) | Skip unless need surfaces |
| Far future | Workflow graphs (microsoft/agent-framework concepts) | v2.x topic |
Flagged follow-ups (not in a batch yet)
- Agents in
/data/AGENTS.mddon't listgit_statusin theirtools:blocks. Out of scope until pre-BooCoder cleanup pass. - v1.9 dispatch had item (g): verify
useUserEventsbroadcastsproject_updatedon PATCH/projects/:id. Add if missing. - v1.8.2 follow-up: confirm
messages.metadatamigration ran clean in prod DB after deploy.
Order of operations
- v1.x-themes finishes (Claude Code in flight). Audit + smoke test. Merge.
- v1.8.3 — tool call UI compaction. Small frontend batch, addresses current pain.
- v1.9 — settings pane. Branch already named
v1.9-settings-pane. Spec locked. - v1.10 — web search backend.
- v1.11 — agents.
- v1.12 — BooTerm.
Track B (architect, no UI dep, can run parallel anytime): v1.13 → v1.13b → v1.14.
Architecture target state
| Container | Port | Mount | Purpose | Status |
|---|---|---|---|---|
boocode |
100.114.205.53:9500 |
/opt:/opt:ro |
Chat + read-only tools + SPA | Live |
boocode_db |
127.0.0.1:5500 |
boocode_pgdata volume |
Postgres 16-alpine | Live |
codecontext |
100.114.205.53:8765 (internal) |
project root :ro | MCP server for architect tools | v1.13 |
booterm |
100.114.205.53:9501 |
/opt/repos:/opt/repos:rw |
Terminals (tmux + node-pty) | v1.12 |
boocoder |
100.114.205.53:9502 |
per-session sandbox | Write tools | Post-v1.x |
Schema additions ahead
- v1.x-themes (current):
settings.theme_id,settings.theme_mode - v1.9:
projects.default_system_prompt,projects.default_web_search_enabled,sessions.web_search_enabled - v1.11:
sessions.agent_id - v1.13b:
repo_health_cache (project_id, file_hashes_sig, payload JSONB, created_at) - v1.14:
sessions.tool_approval_mode,sessions.approved_tools - Post-v1.x:
session_events; deprecatemessageslong-tail - Post-v1.x:
pending_changes
Decisions log
- Embeddings dropped from BooCode. File-view tools + sidecar analyzers replace RAG.
- Old Batch 11 (aider PageRank port) → replaced by codecontext sidecar (v1.13).
- Old Batch 12 (Harrier indexer) → removed entirely.
- Batch 9 reordered ahead of 5–8, decoupled from Batch 7 (2026-05-16). Subsequently superseded — settings pane (v1.9) and themes (v1.x-themes) jumped ahead. Agents now slated as v1.11.
- Theme work split into its own version (v1.x-themes) rather than blocked behind v1.9 (2026-05-17). Branched off main after v1.8.2 committed.
Workflow
Each batch:
- Verify previous merged.
- Dispatch via Paseo to Claude Code at
/opt/boocode(or OpenCode for smaller batches). - Recon → blocking questions → implement → hand back.
- Compliance review in separate Claude chat.
- Deploy:
docker compose up --build -d. - Smoke test.
- Sam commits and pushes.
Sam reviews all diffs. Sam commits. Never git pull/push/commit on his behalf.