Summary
Built and shipped a live audio PM interview practice tool at pezant.ca/interview/. Claude CLI (Max subscription) as interviewer, browser SpeechSynthesis for TTS with 50+ voice options, Web Speech API for STT with auto voice activity detection. Loads 7+ interview prep files as context. Structured scoring rubric (5 categories, advance decision). All loose ends resolved: PM2 for server persistence, autossh for tunnel, 9 company prep mappings + auto-scan, clickable session review page with full transcripts.
Architecture
Browser (STT+TTS) ↔ WebSocket ↔ Express:3456 (WSL) ↔ autossh tunnel ↔ pezant.ca Apache /interview/ (HTTPS). Claude CLI via stdin pipe, sonnet model, Max OAuth.
Key Decisions
- Claude CLI over API — user requested leveraging Max subscription, zero marginal cost
- Browser SpeechSynthesis over Edge TTS — user tested Edge TTS, said terrible; browser voices much better
- 15s silence timeout — original 1.8s too aggressive for PM interview answers
- Settings panel with Save button — user explicitly requested explicit save vs live-apply
Commits
- c82aeb0 — Initial implementation
- 6aed990 — Context/progress files
- 67290f3 — Loose ends: PM2, autossh, company mappings, session review
- f115f67 — Final context update
Learnings
- Edge TTS npm broken on Node 22 (TypeScript in node_modules)
- ngrok now requires account; Cloudflare quick tunnel API unreliable
- Web Speech API not-allowed error creates infinite retry loops without denial tracking
- Claude CLI large prompts must pipe via stdin, not -p argument