Working-tree changes that had accumulated without being committed. The test
updates matter most: tests/test_caller_gen.py was left behind when caller_gen
started requiring voice and age in regulars_included, so the committed tree had
a failing suite that only passed locally.
- Caller dialog moves from Haiku 4.5 to Sonnet 4.6 (~$1/show to ~$3-4/show)
- Grok pinned to x-ai/grok-4.3; grok-4, grok-4-fast and grok-4.1-fast were
retired from OpenRouter, and llm.py swallows the 404 and returns empty text,
so a retired id makes callers go silent with nothing in the logs
- Devon's web_search now runs against SearXNG on the NAS
- Assorted TTS, audio, news, cost tracker and control-panel changes
- CLAUDE.md updated to match
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- 60s timeout + retry on all LLM calls
- 120-300s timeout on all subprocess/ffmpeg calls
- Per-clip error isolation (one failure doesn't kill the run)
- Progress indicators for each clip being processed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Show full stderr (head + tail) instead of truncating to last 500 chars
- Add --timeout=60000 and --log=verbose to Remotion render command
- Clamp word timestamps to [0, duration] to prevent negative/OOB values
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix TTS text pipeline: new caps handling (spell out unknown acronyms, lowercase
emphasis words), action-word lookahead for parenthetical stripping, abbreviation
expansions (US→United States, NM→New Mexico), pronunciation fixes
- Inworld TTS: camelCase API fields, speakingRate per-voice overrides, retry logic
with exponential backoff (3 attempts)
- Footer redesign: SVG icons for social/podcast links across all pages
- Stats page: show "Rate us on Spotify" instead of "not public" placeholder
- New voices, expanded caller prompts and problem scenarios
- Social posting via Postiz, YouTube upload in publish pipeline
- Episode transcripts 15-25, terms page, sitemap updates
- Fix invoice script: match Timing totals using merged Task+App intervals
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- make_clips.py: Extract best moments from episodes as short-form clips
(9:16 vertical MP4 with captions for TikTok/Shorts/Reels)
- deploy_stats_cron.sh: Deploy podcast_stats.py to NAS as Docker container
running hourly with auto-restart
- podcast_stats.py: Add _find_ytdlp() for Docker compatibility, auto-detect
local Docker for Castopod DB queries
- publish_episode.py: Upgrade Whisper model from base to large-v3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>