{"slug":"voice-chat","total":8,"limit":100,"offset":0,"since":null,"commits":[{"hash":"ac28124","date":"2026-05-31 16:56:06 -0700","author":"Steve Abrams","subject":"Link favicon.svg in head (use branded SVG, not .ico fallback)","body":""},{"hash":"c5494dc","date":"2026-05-31 16:32:39 -0700","author":"Steve Abrams","subject":"Add per-site favicon (kills /favicon.ico 404)","body":""},{"hash":"621724f","date":"2026-05-19 21:30:55 -0700","author":"Steve Abrams","subject":"add 404 guard middleware after express.static","body":"Any path that falls past the static handler now returns a structured\n404 (JSON for /api/*, plain text otherwise) instead of Express's\ndefault HTML page — so callers can't mistake a typo'd route for a 200.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"aad10fa","date":"2026-05-19 21:30:22 -0700","author":"Steve Abrams","subject":"broaden .gitignore with snapshot/build excludes","body":"Adds tmp/, dist/, build/, .next/, and the canonical snapshot patterns\n(*.bak, *.bak.*, *.pre-*, *.orig, *.rej, *.swp, *~) so refactor-pass\nside files never sneak into commits.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"326417d","date":"2026-05-11 08:31:00 -0700","author":"Steve Abrams","subject":"auto-shutoff: 30s idle countdown with visible timer + resets on speech","body":""},{"hash":"6475eea","date":"2026-05-10 23:07:14 -0700","author":"Steve Abrams","subject":"pivot to free stack: browser STT+TTS + Mac1 ollama qwen3:8b","body":""},{"hash":"182cab1","date":"2026-05-10 22:55:14 -0700","author":"Steve Abrams","subject":"port: 9870 collided with Shop by Color → 9893","body":""},{"hash":"dcc1707","date":"2026-05-10 22:50:32 -0700","author":"Steve Abrams","subject":"initial scaffold: voice-chat — OpenAI Realtime WebRTC, sub-500ms turn","body":""}]}