Skip to content

Releases: rianvdm/tldl

v2.0.1 — Per-Podcast RSS Feeds

02 Apr 15:49
323e411

Choose a tag to compare

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

15 Mar 14:30

Choose a tag to compare

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 /admin with stats row (episodes, podcasts, errors, last check), quick actions, and recent activity feed
  • Activity log system (activity:log KV 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/:id moved behind admin auth

Request a Podcast

  • New /request page 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.ts with 51 tests covering all admin routes
  • New test/discord.test.ts with 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/:id removed from public API (moved to /admin/jobs/:id)
  • Cloudflare Access must protect both /admin and /admin/* paths

v1.1.4

08 Mar 04:08

Choose a tag to compare

What's Changed

Model Upgrades

  • Transcription: Switched from whisper-1 to gpt-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

18 Feb 17:31

Choose a tag to compare

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 the TRANSCRIPTION_PROVIDER env 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 &amp;, &quot;, 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

08 Feb 12:52

Choose a tag to compare

What's Changed

  • RSS Feed Fixes:
    • Restored podcast name and episode duration at the top of each item
    • Markdown summaries are now converted to HTML for proper rendering in RSS readers

v1.1.1

08 Feb 01:51

Choose a tag to compare

What's Changed

  • RSS Feed Enhancement: The RSS feed (/feed) now includes the full AI-generated summary for each episode in the <description> field, making it easier to read summaries directly in RSS readers without visiting the website.

v1.1.0 - Extended Episode Duration

25 Jan 18:20

Choose a tag to compare

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.md to AGENTS.md for agent-agnostic AI coding guidance

Files Changed

  • wrangler.toml - Updated MAX_EPISODE_MINUTES env var
  • src/lib/errors.ts - Updated error message
  • src/routes/public.ts - Updated UI text
  • src/lib/audio.ts - Updated comment
  • src/queue/consumer.ts - Updated fallback default
  • src/index.ts - Updated hardcoded limit
  • AGENTS.md - Renamed from CLAUDE.md