# 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 tools - `apps/web` — React frontend; served by Fastify in production, Vite in dev ## Local dev Requires Node 20, pnpm, Docker (for Postgres), and ripgrep. ```bash # 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 ```bash 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).