1ecccc112f7cd204484fd142a6fc09c94ddcff04
The v1.9 settings pane had no way to dismiss once opened. ChatTabBar (which owns the per-pane close X for chat panes) is skipped for settings panes, and the pane header itself only rendered the maximize toggle (desktop-only). Mobile users had zero controls beyond the section tabs. Add three close paths: - X button in SettingsPane header, visible on mobile + desktop, sits next to the maximize toggle. Tap-target sized per the v1.6 mobile convention (max-md:min-h-[44px]). - Esc when the settings pane is the active pane and no input/textarea/ dialog has focus. Maximize-restore still wins when maximized. - Sidebar Settings button is now a strict toggle: opens on first click, closes on second. Renamed openOrFocusSettingsPane → toggleSettingsPane in the panes hook. Edge case: removing the settings pane when it's the only pane left falls back to an empty pane to preserve the "always one pane" invariant. In normal flow this is unreachable (the toggle only appends), but defensive against future entry points. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
boocode
Self-hosted single-user developer chat app. v1: chat only.
Stack
- Node 20, Fastify, postgres (porsager/postgres), ws, zod
- React 18, Vite, TypeScript, Tailwind v4, shadcn/ui
- Postgres 16
- pnpm workspaces
Layout
apps/server— Fastify API + WebSocket + inference loop + file-read toolsapps/web— React frontend; served by Fastify in production, Vite in dev
Local dev
Requires Node 20, pnpm, Docker (for Postgres), and ripgrep.
# install
pnpm install
# bring up postgres only
cp .env.example .env
# edit POSTGRES_PASSWORD if you like; default DATABASE_URL points at the container
docker compose up -d boocode_db
# run server (port 3000) and web (port 5173) in two shells
DATABASE_URL=postgres://boocode:devpass@127.0.0.1:5500/boocode \
LLAMA_SWAP_URL=http://100.101.41.16:8401 \
pnpm dev:server
pnpm dev:web
The Vite dev server proxies /api and /api/ws/* to the Fastify backend with a
synthetic Remote-User: sam header so the Authelia auth layer can be skipped
during development.
Production
cd /opt/boocode
docker compose up --build -d
Binds to 100.114.205.53:9500 (Tailscale). Authelia is expected to gate the
upstream and inject Remote-User. Postgres binds loopback only.
What v1 has
Project sidebar, sessions per project, chat with streaming responses over
WebSocket, four file-read tools scoped to the project root (view_file,
list_dir, grep, find_files), and a model picker driven by llama-swap's
/v1/models.
What v1 does not have lives in v2 (terminal pane) and v3 (Coder pane).
Languages
TypeScript
94.3%
CSS
1.8%
JavaScript
1.1%
Shell
0.8%
PLpgSQL
0.6%
Other
1.4%