# board-viewer ## About Read-only HTML kanban-viewer над `.tasks/*.md` + Gitea API. Рендерит 5-колоночную доску (⚪ open / 🔴 in-progress / 🟡 paused / 🔵 blocked / 🟢 done) по агрегированным таскам из всех whitelisted проектов. Хост: `board.kzntsv.site` за traefik на VDS. Обновление: cron-тик ~5 мин, перегенерация статической HTML. Design: `.wiki/concepts/board-viewer.md` (canonical). Process trace: `~/projects/.workshop/.archive/2026-05-22-board-viewer.md`. ## Quick start ```bash npm install npm test # 43 tests npm run typecheck # Local build (writes ./dist): node --experimental-strip-types src/cli.ts # auth.toml needs: gitea_url, gitea_token, board_viewer_repos = ["owner/repo", ...] # See deploy/auth.toml.example for the full shape. # Then open dist/index.html via any static server, e.g. ( cd dist && python -m http.server 8765 ) & # → http://localhost:8765/ ``` ## Deploy See `deploy/README.md` — Docker-compose stack on VDS, Traefik route + basic-auth. ## Architecture ``` src/parser.ts STATUS.md (markdown) → StatusBlock[] (pure) src/gitea.ts Gitea HTTP API (DI'd fetch) → file content + last commit ISO + raw URL src/reader.ts readBoard(client, repos) → TaskRecord[] (orchestrator) src/render.ts renderBoard(records, opts) → HTML string (pure) src/cli.ts load config → reader → render → dist/index.html + dist/static/ static/ CSS + ESM JS (filter, drawer, toggle-grouping) ``` Read-only: write-side intentionally absent. Drag-drop blocked on upstream `projects-meta` bug cluster — see brainstorm trace.