2.4.0 (2026-06-04)
Bug Fixes
- add 100vh fallback for older browsers (93b884a)
- address PR review findings — logging, tests, DRY, docs (9931407)
- ci: add source path to mypy install-types and restore mypy cache (0ae6b65)
- ci: collapse redundant mypy steps into one (f71dfdf)
- ci: remove --install-types from mypy invocations (b6e97da)
- ci: restore optional integration check flag (1dbfb5a)
- clear SQLAlchemy identity map after each writer command (2e5a957), closes #199
- cover all env var fields in read-only UI, API stripping, and runtime overlay (00ae8a6), closes #196
- dark mode contrast and readability tweaks (fa8fa68)
- docker: avoid undocumented --project file path in uv sync (7281803)
- docker: install deps via uv export requirements (a2aba0e)
- docker: pin uv version and remove dead pip env vars (58135fb)
- docker: restore diagnostic echo lines in dependency install (c531dd1)
- docker: use uv sync and uv run in container (e1a752d)
- don't strip out rich html from podcast feeds. (bdf5f87)
- double casting (191612f)
- enhance word boundary refiner with improved JSON output handling. Output was geting truncated resulting in wasted LLM calls. (c66f139)
- fix issues with dark mode text input coloring and sub-settings selector (2358644)
- fix podcast feed spacing on mobile so buttons shapes behave correctly on mobile layouts (6ba9bf3)
- fix refresh button being hard coded as black, and transparent borders not being transparent in dark mode (fdb8b94)
- Implement auto-whitelist check for first member in feed (c052e93)
- Implement auto-whitelist check for first member in feed so (38d320a)
- Implement auto-whitelist check for first member in feed so (ad3fe13)
- jobs: skip job creation for whitelisted posts with existing processed audio (1172f02)
- Make the first click both reveal the in-page player and actually start playback, instead of needing a second click. (85e3c25)
- merge duplicate ad_segments JSON keys from local LLMs (5d19488), closes #185
- only re-queue failed jobs on cleanup and set step_name on cancel (2f296c1)
- preserve rich feed HTML while normalizing problematic whitespace, and generate share/feed URLs with the correct HTTPS scheme behind forwarded proxy headers. (4585ed0)
- re-add response_format to ad classification LLM calls (aa59013), closes #184
- resolve NameError and linting issues (0113a2d)
- revert cleanup re-queue change, keep cancel step_name fixes (ddf299f)
- scripts: restore --install-types --non-interactive to ci.sh mypy (c6a9853)
- tests: stabilize flaky post cleanup tests with explicit file mtimes (56b0eaf)
- use dvh units to prevent bottom cutoff on Android Chrome (118c2d6)
- use expunge_all() not expire_all() — actually frees identity map (e2b89d1)
- use original episode duration for ad percentage and timeline stats (984f9c7)
- use original episode duration for processing cost calculation (bf9a532)
Features
- add advertisement removal summary and processing stats to the UI (046d112)
- Add advertisement removal summary and timeline visualization to LLMProcessingStats component that was accidently removed in a previous refactoring PR (63682d9)
- add build options for AMD64 and ARM64 images in Docker workflow (af5eb48)
- add debug information for post stats including audio paths and processing details (6fcc0bc)
- Add feed detail route and handle feed selection in HomePage component (a4d8d7e)
- Add feed detail route and handle feed selection in HomePage component (8a81f5c)
- add function to refine transcript chapter boundaries and enhance processing logic to ensure blocks are too large in long episodes (2df470c)
- add functionality to cancel all queued jobs with API integration and UI support (0387ec9)
- add LLM chapter fallback tagging configuration and related tests (aa45d06)
- add manual workflow inputs for Docker image builds and update conditions for job execution (6d448d1)
- Add Sorting Behavior to the podcast feed (a0b6119)
- add support for manual workflow dispatch in Docker publish process (40abc03)
- enhance audio processing and duration handling across routes and models (e2f754b)
- Enhance episode description handling with expandable view and HTML decoding (5fa0c77)
- enhance feed settings handling with chapter fallback logic and validation (f481d00)
- frontend: add persisted dark mode toggle and contrast fixes (0cda964)
- Implement admin cost dashboard and feed subscriber view with new job management actions. (e3afea6)
- Implement advanced episode description parsing and rendering (0736bfe)
- implement audio path resolution in JobManager and add unit tests for validation logic (6318fd1)
- implement find_existing_processed_audio_path utility and refactor audio path handling in jobs manager and cleanup actions (c96f183)
- introduce configurable cost rate per hour setting in app configuration. (72c7f39)
- make env vars authoritative over database config (9a97c51), closes #190
- retain more info on cleanup and integration check (80069fc)
- retain most recent post after cleanup (add27e1)
- simplify conditional checks for Docker build jobs and add variant selection logic (c66a2ec)
Performance Improvements
- feed: drop synchronous refresh_feed from GET /feed/ (bef20fd)