{"slug":"qwen38-viewer","total":18,"limit":100,"offset":0,"since":null,"commits":[{"hash":"ee652bf","date":"2026-08-25 10:48:59 -0700","author":"Steve","subject":"creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)","body":"Fleet inoculation — opening this basic-auth app with credentials in the URL\npoisoned document.baseURI and made relative fetch('/api/…') throw. Guard resolves\nnon-absolute request URLs against location instead. Ref: creds-in-url-fetch-guard-fleet-pattern.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"442d905","date":"2026-08-19 12:17:55 -0700","author":"steve","subject":"proxy: idle-timeout guard (90s no-data -> clean 'model overloaded, retry' instead of a multi-minute hang)","body":""},{"hash":"4956adc","date":"2026-08-19 12:08:53 -0700","author":"steve","subject":"chore: v1.1.0 (session close) — already lint/refactor-clean (code-reviewer pass bc74a90), 25 tests green","body":""},{"hash":"598f376","date":"2026-08-19 11:51:49 -0700","author":"steve","subject":"add true E2E (npm run test:e2e): real Chromium drives full chat — 3D scene appears, reply streams, 3D removed on done, zero page/3D errors","body":""},{"hash":"6ce074b","date":"2026-08-19 11:44:35 -0700","author":"steve","subject":"5x: two clean sweeps (7/7, 0 defects) — REPORT.md","body":""},{"hash":"518f2cf","date":"2026-08-19 11:38:37 -0700","author":"steve","subject":"remove misleading Kamatera .deploy.conf; document local-only deploy in DEPLOY.md","body":""},{"hash":"114f772","date":"2026-08-19 11:35:33 -0700","author":"steve","subject":"add npm test: 18 regression checks (auth matrix incl no-colon, static, streaming proxy, think/keep_alive passthrough, upstream-error, bad-request) against a stub Ollama","body":""},{"hash":"bc74a90","date":"2026-08-19 11:30:06 -0700","author":"steve","subject":"debug+refactor: fix 3D fallback setState + WebGL try/catch + render throttle; auth no-colon guard + upstream cancel + listener cleanup; mail-bridge fd-leak, dead-line, SMTP reuse+try/except, plus-address guard","body":""},{"hash":"3718af9","date":"2026-08-19 11:18:26 -0700","author":"steve","subject":"self-host three.js (local /vendor/three.min.js) with CDN fallback — zero external dependency","body":""},{"hash":"29dca6a","date":"2026-08-19 11:16:57 -0700","author":"steve","subject":"three.js 3D thinking scene w/ state machine: Thinking(orange)/Generating(teal)/STUCK(red+stutter) + stall watchdog; thinking toggle (default off); think passthrough","body":""},{"hash":"411e696","date":"2026-08-19 11:09:12 -0700","author":"steve","subject":"send keep_alive as integer -1 (valid 'keep forever')","body":""},{"hash":"6458573","date":"2026-08-19 11:02:48 -0700","author":"steve","subject":"pin model permanently warm (keep_alive -1) — no cold loads","body":""},{"hash":"78d2199","date":"2026-08-19 11:00:17 -0700","author":"steve","subject":"viewer: motion-graphics thinking feedback (pulsing orb, elapsed timer, adaptive cold-load msg, live-streaming reasoning + caret)","body":""},{"hash":"b4efa8a","date":"2026-08-19 10:49:44 -0700","author":"steve","subject":"qwen mail bridge: allowlisted email -> uncensored qwen -> inline reply (armed, launchd 2min)","body":""},{"hash":"18c37a5","date":"2026-08-19 10:41:25 -0700","author":"steve","subject":"add case-insensitive shared access code Dust2026","body":""},{"hash":"e9ac061","date":"2026-08-19 10:22:27 -0700","author":"steve","subject":"multi-user basic auth (admin + Dave)","body":""},{"hash":"5db1398","date":"2026-08-19 09:58:21 -0700","author":"steve","subject":"keep model warm (keep_alive 30m) to avoid ~2min cold loads","body":""},{"hash":"46278be","date":"2026-08-19 09:53:48 -0700","author":"steve","subject":"qwen38-viewer: auth-gated web chat for local Qwen3.8-27B Heretic (Ollama)","body":""}]}