Releases: rianvdm/tldl
Releases · rianvdm/tldl
v2.0.1 — Per-Podcast RSS Feeds
What's New
- Per-podcast RSS feeds — each podcast now has its own feed at
/podcasts/:podcastId/feed, scoped to that podcast's episodes only - RSS autodiscovery — podcast pages include a
<link rel="alternate">tag so RSS readers detect the feed automatically - Updated About page — documents the new per-podcast feed pattern
Fixes
- RSS
<source>element now correctly references the current feed URL instead of always pointing to the global/feed - Extracted shared summary-fetching helper to reduce code duplication
Contributors: @allank
v2.0.0 — Admin-First Pivot
Summary
TLDL shifts from a user-submitted podcast summary tool to an admin-curated podcast archive. The site is a public read-only archive with an RSS feed. Only admins can submit episodes and manage podcasts. Visitors can request new podcasts via a contact form.
What changed
Architecture
- All admin functionality moved to
/admin/*(from/profile/*), protected by Cloudflare Access - Removed public submit, waitlist, and job status pages
- Removed auth-conditional UI from public pages (no login button, no auth scripts)
- Removed per-user episode tracking (
listEpisodesByUser, rate limiting) - Added fail-closed admin auth (
requireAdmin) with malformed JWT rejection
Admin Dashboard
- New admin dashboard at
/adminwith stats row (episodes, podcasts, errors, last check), quick actions, and recent activity feed - Activity log system (
activity:logKV key) tracks episode completions, failures, and monitoring events - Podcast monitoring page improved with status summary bar, relative timestamps, and Apple Podcasts links
Reliability
- Discord webhook notifications on job failures and monitoring errors (
src/lib/discord.ts) - Stale job timeout detection — jobs stuck >20 minutes are auto-marked as failed, logged, and sent to Discord
- Timeout sweep runs on every home page render and in the cron handler
- All debug routes disabled in production (were partially exposed before)
- Unauthenticated
DELETE /api/job/:idmoved behind admin auth
Request a Podcast
- New
/requestpage with Turnstile-protected form - Sends email via Postmark to admin when visitors request a podcast
- Links added to home page hero, footer, and about page
Testing
- 305 tests across 15 files (up from 284)
- New
test/admin.test.tswith 51 tests covering all admin routes - New
test/discord.test.tswith 5 tests - Expanded integration tests: full CRUD lifecycle, access control verification, request form
Breaking changes
/submit,/waitlist,/profile/*,/job/*routes removed (return 404)DELETE /api/job/:idremoved from public API (moved to/admin/jobs/:id)- Cloudflare Access must protect both
/adminand/admin/*paths
v1.1.4
What's Changed
Model Upgrades
- Transcription: Switched from
whisper-1togpt-4o-mini-transcribe- Added MIME-to-extension mapping so M4A/AAC podcasts are correctly identified (fixes "corrupted or unsupported" errors)
- Content type from the audio source is now threaded through to the API call instead of hardcoding
audio/mpeg
- Summarization: Bumped from GPT 5.2 to GPT 5.4
Other
- Gate debug routes behind ENVIRONMENT check in production
v1.1.3
Groq Whisper Transcription Support
Add Groq as an alternative transcription provider, reducing transcription costs by ~9x compared to OpenAI Whisper.
New Features
- Multi-provider transcription: Switch between OpenAI (
whisper-1) and Groq (whisper-large-v3-turbo) via theTRANSCRIPTION_PROVIDERenv var - Groq free tier: No credit card required, rate-limited but usable for testing and low-volume usage
- Easy switching: Single env var change to swap providers — no code changes needed
Bug Fixes
- Fix HTML entity decoding in Apple page titles: Titles containing
&,", etc. are now properly decoded before episode matching, fixing failures for episodes with&in their titles
Details
- Groq pricing: $0.04/hr (vs OpenAI $0.36/hr)
- Both providers use the same OpenAI-compatible API shape
- Legacy API maintained for backwards compatibility
- 9 new tests for provider switching (269 total tests)
- Setup guide:
docs/groq-transcription-setup.md
v1.1.2
v1.1.1
v1.1.0 - Extended Episode Duration
What's New
Extended Episode Duration Support
- Maximum episode length increased from ~1h45m to 2 hours (121 minutes)
- Updated all UI messaging and error messages to reflect the new limit
Housekeeping
- Renamed
CLAUDE.mdtoAGENTS.mdfor agent-agnostic AI coding guidance
Files Changed
wrangler.toml- Updated MAX_EPISODE_MINUTES env varsrc/lib/errors.ts- Updated error messagesrc/routes/public.ts- Updated UI textsrc/lib/audio.ts- Updated commentsrc/queue/consumer.ts- Updated fallback defaultsrc/index.ts- Updated hardcoded limitAGENTS.md- Renamed from CLAUDE.md