<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Elezea — releases</title><description>Rian van der Merwe&apos;s blog</description><link>https://elezea.com/</link><item><title>Discrobble v1.0.2 — Free on the App Store</title><link>https://elezea.com/2026/05/discrobble-v1-0-2/</link><guid isPermaLink="true">https://elezea.com/2026/05/discrobble-v1-0-2/</guid><description>My first iPhone app is live! Discrobble is now on the [App Store](https://apps.apple.com/us/app/id6761305573), free. It connects to your Discogs collection and your Last.fm account so you can track plays from your vinyl and CDs…</description><pubDate>Sat, 09 May 2026 20:05:48 GMT</pubDate><content:encoded>&lt;p&gt;My first iPhone app is live! Discrobble is now on the &lt;a href=&quot;https://apps.apple.com/us/app/id6761305573&quot;&gt;App Store&lt;/a&gt;, free. It connects to your &lt;a href=&quot;https://www.discogs.com/&quot;&gt;Discogs&lt;/a&gt; collection and your &lt;a href=&quot;https://www.last.fm/&quot;&gt;Last.fm&lt;/a&gt; account so you can track your physical music listening in two taps: pick an album, hit &amp;quot;Scrobble,&amp;quot; and the tracks land in your &lt;a href=&quot;http://Last.fm&quot;&gt;Last.fm&lt;/a&gt; history. There&apos;s more on the &lt;a href=&quot;https://elezea.com/discrobble/&quot;&gt;product page&lt;/a&gt; about how it works.&lt;/p&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>discogs-mcp v3.3.0 — Background sync, instant search</title><link>https://elezea.com/2026/05/discogs-mcp-v3-3-0/</link><guid isPermaLink="true">https://elezea.com/2026/05/discogs-mcp-v3-3-0/</guid><description>The first search of the day is now instant. `discogs-mcp` pre-fetches your collection in the background every hour and keeps it in a snapshot, so…</description><pubDate>Tue, 05 May 2026 01:13:29 GMT</pubDate><content:encoded>&lt;p&gt;The first search of the day is now instant. &lt;code&gt;discogs-mcp&lt;/code&gt; pre-fetches your collection in the background every hour and keeps it in a snapshot, so &lt;code&gt;search_collection&lt;/code&gt; doesn&apos;t have to paginate the Discogs API from cold any more.&lt;/p&gt;
&lt;p&gt;The server also tells your LLM client how to navigate it — every tool response ends with a &amp;quot;Next steps&amp;quot; block listing the most likely follow-up calls and the exact arguments to use, so chained queries like &amp;quot;find me a mellow jazz album, then expand the top hit&amp;quot; don&apos;t make the model guess.&lt;/p&gt;
&lt;p&gt;And if you&apos;ve been putting off deploying your own copy, there&apos;s now a Deploy to Cloudflare button in the README — one click, three secrets, done.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hourly background sync keeps your collection snapshot fresh. Add or remove a record on Discogs and it&apos;s visible to search within an hour, automatically.&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;refresh_collection&lt;/code&gt; tool forces an immediate snapshot refresh — useful when you&apos;ve just bought an album and want it visible to search right now.&lt;/li&gt;
&lt;li&gt;Server-level &lt;code&gt;instructions&lt;/code&gt; and per-tool &amp;quot;Next steps&amp;quot; breadcrumbs make the server self-navigating for any LLM client. The instructions name a recommended path (&lt;code&gt;search_collection&lt;/code&gt; → &lt;code&gt;get_release&lt;/code&gt; → mutations); each tool response ends with the most likely follow-up calls, with real values templated in (&lt;code&gt;get_release(release_id=28861354)&lt;/code&gt;, not &lt;code&gt;release_id=&amp;lt;ID&amp;gt;&lt;/code&gt;). Inspired by &lt;a href=&quot;https://taoofmac.com/space/blog/2026/04/29/2341&quot;&gt;Rui Carmo&apos;s MCP server post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;One-click self-hosting via the Deploy to Cloudflare button in the README. Cloudflare provisions the KV namespaces, Durable Object, cron, and prompts for the secrets — no &lt;code&gt;wrangler kv namespace create&lt;/code&gt; needed, and pushes to your fork redeploy automatically via Workers Builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;First &lt;code&gt;search_collection&lt;/code&gt; call after a cold cache no longer times out. Previously this could take 30 seconds to two minutes on a 1,500-item collection, often longer than the MCP request timeout. It&apos;s now sub-second.&lt;/li&gt;
&lt;li&gt;Mood queries (&amp;quot;mellow Sunday morning&amp;quot;, &amp;quot;road trip music&amp;quot;) respond just as fast as keyword queries — they used to pay the same pagination cost as everything else.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;syncCollection&lt;/code&gt; module with per-page retry, resumable progress, and atomic snapshot swap so readers never see partial state.&lt;/li&gt;
&lt;li&gt;Cron runs hourly with a probe path: one API call to compare count + page-1 instance IDs against the snapshot. Full repaginate only when something changed. Steady-state cron tick now costs 1 Discogs request instead of 16.&lt;/li&gt;
&lt;li&gt;Self-healing across MCP request timeouts: if a sync stalls partway through, the next call resumes from where it left off rather than restarting.&lt;/li&gt;
&lt;li&gt;Dropped the &lt;code&gt;MCP_LOGS&lt;/code&gt; KV binding. Sync outcomes now structured-log to the Workers runtime so Cloudflare Observability ingests them — one fewer namespace for self-hosters to create.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>lastfm-mcp v2.4.0 — Top tracks and 8K fewer lines</title><link>https://elezea.com/2026/04/lastfm-mcp-v2-4-0/</link><guid isPermaLink="true">https://elezea.com/2026/04/lastfm-mcp-v2-4-0/</guid><description>The big shifts in this release: three new tools, a glassmorphism-redesigned landing page, timezone-aware day boundaries on `get_recent_tracks`, and a…</description><pubDate>Thu, 30 Apr 2026 20:09:55 GMT</pubDate><content:encoded>&lt;p&gt;The big shifts in this release: three new tools, a glassmorphism-redesigned landing page, timezone-aware day boundaries on &lt;code&gt;get_recent_tracks&lt;/code&gt;, and a 8,300-line cull of the original session-based worker now that the OAuth path has been the only one in production for a while.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Three new tools.&lt;/strong&gt; &lt;code&gt;get_top_tracks&lt;/code&gt; fills the obvious symmetry gap with the existing &lt;code&gt;get_top_artists&lt;/code&gt; and &lt;code&gt;get_top_albums&lt;/code&gt;. &lt;code&gt;get_artist_top_tracks&lt;/code&gt; and &lt;code&gt;get_artist_top_albums&lt;/code&gt; surface an artist&apos;s globally most-played catalog — useful for &amp;quot;what&apos;s the canonical record by X&amp;quot; questions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date-aware &lt;code&gt;get_recent_tracks&lt;/code&gt;.&lt;/strong&gt; New &lt;code&gt;date&lt;/code&gt; param accepts a &lt;code&gt;YYYY-MM-DD&lt;/code&gt; calendar date plus a &lt;code&gt;timezone&lt;/code&gt; (IANA name, e.g. &lt;code&gt;America/New_York&lt;/code&gt;) and the server computes the correct UTC day boundaries. Way better than juggling &lt;code&gt;from&lt;/code&gt;/&lt;code&gt;to&lt;/code&gt; Unix timestamps for &amp;quot;what did I listen to yesterday&amp;quot; queries. The response also echoes the queried range back so an LLM can self-verify it asked the right question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redesigned landing page&lt;/strong&gt; at &lt;a href=&quot;https://lastfm-mcp.com&quot;&gt;lastfm-mcp.com&lt;/a&gt; — glassmorphism, animated waves, glow effects.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_album_info&lt;/code&gt; no longer renders &lt;code&gt;[object Object]&lt;/code&gt; when &lt;a href=&quot;http://Last.fm&quot;&gt;Last.fm&lt;/a&gt; returns the album artist as an object instead of a string. Latent bug, fixed via a &lt;code&gt;formatArtist&lt;/code&gt; helper that handles both shapes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deleted the legacy worker.&lt;/strong&gt; Removed &lt;code&gt;src/index.ts&lt;/code&gt; plus the homemade JSON-RPC dispatch layer in &lt;code&gt;src/protocol/&lt;/code&gt; and the SSE transport in &lt;code&gt;src/transport/&lt;/code&gt;. The OAuth worker (&lt;code&gt;src/index-oauth.ts&lt;/code&gt;) has been the only production deployment for months; the legacy &lt;code&gt;[env.legacy]&lt;/code&gt; block in &lt;code&gt;wrangler.toml&lt;/code&gt; was never deployed to Cloudflare. Net diff: &lt;strong&gt;−8,293 lines, 0 added.&lt;/strong&gt; Test suite went from 376 tests / 5 failing → 167 tests / 0 failing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dropped dead deps:&lt;/strong&gt; &lt;code&gt;crypto-js&lt;/code&gt;, &lt;code&gt;@types/crypto-js&lt;/code&gt;, &lt;code&gt;oauth-1.0a&lt;/code&gt; — zero imports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removed dead throttle.&lt;/strong&gt; &lt;code&gt;LastfmClient.throttleRequest&lt;/code&gt; was per-request (clients are instantiated per-request in the OAuth worker), so it never observed a previous request — it did nothing while implying rate-limit safety. Existing 429-aware retry handles rate limits correctly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic tool catalog.&lt;/strong&gt; The &lt;code&gt;lastfm_auth_status&lt;/code&gt; tool list lives in one place now (&lt;code&gt;src/mcp/tools/catalog.ts&lt;/code&gt;) instead of being hardcoded in three.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>tldl v2.4.0 — Broadsheet redesign</title><link>https://elezea.com/2026/04/tldl-v2-4-0/</link><guid isPermaLink="true">https://elezea.com/2026/04/tldl-v2-4-0/</guid><description>TL;DL has a new look. Inspired by classic broadsheet newspapers, the redesigned site puts episode summaries in a layout that&apos;s calmer to read and easier to…</description><pubDate>Wed, 29 Apr 2026 21:25:26 GMT</pubDate><content:encoded>&lt;p&gt;TL;DL has a new look. Inspired by classic broadsheet newspapers, the redesigned site puts episode summaries in a layout that&apos;s calmer to read and easier to scan — with proper typography, a featured &amp;quot;lead&amp;quot; episode, and a cleaner detail page for every summary.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Broadsheet-style homepage.&lt;/strong&gt; A featured lead episode at the top, then the rest of the week&apos;s episodes laid out as numbered index entries. Episode count grows? Pagination kicks in at 20 per page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redesigned episode pages.&lt;/strong&gt; New typography (Fraunces + Inter Tight + JetBrains Mono), a generated deck and pull quote on every episode, links out to the podcast&apos;s website and Apple Podcasts, and a &amp;quot;More from this podcast&amp;quot; section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search and tag browsing.&lt;/strong&gt; Search the homepage with &lt;code&gt;?q=...&lt;/code&gt;, click any tag to see every episode with that tag, or browse the full tag and podcast directories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Polished mobile and tablet layouts.&lt;/strong&gt; Episode rows stack their metadata neatly on smaller screens. Tags wrap onto their own row. Pull quotes tighten up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscribe, preferences, and request flows live in the new design.&lt;/strong&gt; No more jarring jump from the new site into the old forms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restored social previews.&lt;/strong&gt; Favicon, Open Graph, and Twitter Card tags are back, so links shared on social and in chat apps look right again.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iPad portrait layout&lt;/strong&gt; no longer cuts off episode titles — the index now collapses to the simpler mobile-style row at tablet widths too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Masthead date&lt;/strong&gt; shows the correct day in Pacific time instead of drifting based on the reader&apos;s timezone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Episode summaries&lt;/strong&gt; no longer show a duplicate title at the top — the redundant first heading is now stripped automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editorial metadata&lt;/strong&gt; (deck and pull quote) generation now retries cleanly on transient failures instead of giving up on the first error.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>tldl v2.3.0 — Email subscriptions</title><link>https://elezea.com/2026/04/tldl-v2-3-0/</link><guid isPermaLink="true">https://elezea.com/2026/04/tldl-v2-3-0/</guid><description>Per-podcast email subscriptions for tldl. Pick the shows you care about at [/subscribe](https://tldl-pod.com/subscribe) and the summary lands in your inbox as…</description><pubDate>Wed, 22 Apr 2026 23:11:37 GMT</pubDate><content:encoded>&lt;p&gt;Per-podcast email subscriptions for tldl. Pick the shows you care about at &lt;a href=&quot;https://tldl-pod.com/subscribe&quot;&gt;/subscribe&lt;/a&gt; and the summary lands in your inbox as soon as a new episode is out.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Per-podcast email subscriptions.&lt;/strong&gt; Sign up at &lt;code&gt;/subscribe&lt;/code&gt;, confirm via double-opt-in, and get an HTML summary email (TL;D&lt;strong&gt;L&lt;/strong&gt; header, red CTA, summary body inline) every time a monitored podcast publishes a new episode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preferences management.&lt;/strong&gt; Returning subscribers can update which podcasts they&apos;re subscribed to via a signed &lt;code&gt;/preferences/manage&lt;/code&gt; link delivered by email. One-click unsubscribe per podcast, or unsubscribe from everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From address on &lt;a href=&quot;http://tldl-pod.com&quot;&gt;tldl-pod.com&lt;/a&gt;.&lt;/strong&gt; Emails now come from &lt;code&gt;&amp;quot;TL;DL&amp;quot; &amp;lt;summaries@tldl-pod.com&amp;gt;&lt;/code&gt; with DKIM and SPF aligned on the &lt;a href=&quot;http://tldl-pod.com&quot;&gt;tldl-pod.com&lt;/a&gt; domain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New D1 database (&lt;code&gt;tldl-subscribers&lt;/code&gt;) for subscribers, subscriptions, and pending confirmations.&lt;/li&gt;
&lt;li&gt;Postmark broadcast stream (&lt;code&gt;episode-summaries&lt;/code&gt;) with HMAC-SHA-256 signed manage/unsubscribe tokens.&lt;/li&gt;
&lt;li&gt;Zone-level rate limiting on &lt;code&gt;POST /subscribe&lt;/code&gt; and &lt;code&gt;POST /preferences&lt;/code&gt; (5 req / 10 min per IP + colo, 1-hour block).&lt;/li&gt;
&lt;li&gt;Double-opt-in flow with throttled per-email pending confirmations.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>discogs-mcp v3.2.0 — Catalog-wide search</title><link>https://elezea.com/2026/04/discogs-mcp-v3-2-0/</link><guid isPermaLink="true">https://elezea.com/2026/04/discogs-mcp-v3-2-0/</guid><description>Adds `search_discogs` for catalog-wide queries beyond your own collection, plus two real-world accuracy fixes: owned-marker correctness across pressings, and…</description><pubDate>Sun, 19 Apr 2026 19:58:22 GMT</pubDate><content:encoded>&lt;p&gt;Adds &lt;code&gt;search_discogs&lt;/code&gt; for catalog-wide queries beyond your own collection, plus two real-world accuracy fixes: owned-marker correctness across pressings, and exact genre/style matching.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;search_discogs&lt;/code&gt; tool&lt;/strong&gt; — search the full Discogs catalog, not just your collection. Default type is &lt;code&gt;master&lt;/code&gt; so album lookups don&apos;t return duplicate pressings. Results get a ✓ marker when you already own them.&lt;/li&gt;
&lt;li&gt;Tool lists in README, marketing page, &lt;code&gt;auth_status&lt;/code&gt;, and &lt;code&gt;server_info&lt;/code&gt; refreshed with grouped categories (Search, Collection, Folders, Custom Fields, Diagnostics).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exact genre/style matching&lt;/strong&gt; (&lt;a href=&quot;https://github.com/rianvdm/discogs-mcp/issues/17&quot;&gt;#17&lt;/a&gt;) — substring matching caused &lt;code&gt;music&lt;/code&gt; to match &lt;code&gt;Non-Music&lt;/code&gt;, flipping the filter to OR mode and returning unrelated releases. Now uses exact equality per release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release-result owned-marker is now strict on &lt;code&gt;release.id&lt;/code&gt;.&lt;/strong&gt; Previously, owning one pressing of an album marked every other pressing as owned too, because &lt;code&gt;isOwned()&lt;/code&gt; matched on &lt;code&gt;master_id&lt;/code&gt; first. Caught by real-world dogfood on &amp;quot;Christian Scott Stretch Music&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Root &lt;code&gt;CLAUDE.md&lt;/code&gt; for Claude Code auto-discovery; removed stale &lt;code&gt;development/CLAUDE.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;GitHub release workflow auto-cross-posts to &lt;a href=&quot;http://elezea.com&quot;&gt;elezea.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item><item><title>tldl v2.2.0 — RSS-first monitoring and audio-URL dedup</title><link>https://elezea.com/2026/04/tldl-v2-2-0/</link><guid isPermaLink="true">https://elezea.com/2026/04/tldl-v2-2-0/</guid><description>Two meaningful changes since v2.1.0. tldl now detects new podcast episodes directly from RSS feeds with conditional GETs instead of relying on Podcast Index…</description><pubDate>Sun, 19 Apr 2026 18:59:50 GMT</pubDate><content:encoded>&lt;p&gt;Two meaningful changes since v2.1.0. tldl now detects new podcast episodes directly from RSS feeds with conditional GETs instead of relying on Podcast Index re-crawls, so episodes typically land in the queue within minutes of publication. A second fix catches episodes that get retitled or have their GUIDs regenerated after publication — a surprisingly common pattern in the wild.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RSS-first monitoring.&lt;/strong&gt; The monitor now fetches RSS feeds directly with &lt;code&gt;If-Modified-Since&lt;/code&gt; / &lt;code&gt;If-None-Match&lt;/code&gt; headers, queues full episode metadata without a Podcast Index round-trip, and falls back to PI only on RSS errors. Detection lag drops from &amp;quot;hours&amp;quot; (PI re-crawl cadence) to &amp;quot;minutes&amp;quot; for feeds that update frequently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;POST /admin/rebuild-index&lt;/code&gt;.&lt;/strong&gt; Backfill endpoint now populates &lt;code&gt;audioUrl&lt;/code&gt; on every existing index entry so the new dedup check works retroactively.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Silent duplicate episodes.&lt;/strong&gt; Episodes that publishers edited after publishing — new title, regenerated GUID, or both — used to slip past dedup and get transcribed twice. A new audio-URL dedup signal (origin + pathname, query-stripped, lowercased) catches them. Confirmed against a real-world retitle where Lenny&apos;s Podcast re-published an episode with a different title + GUID, and 100 historical near-duplicates silently deduped on the first force-check after deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Queue messages carry full episode metadata when the source is RSS, so the consumer branches on &lt;code&gt;rssSourced&lt;/code&gt; and skips Podcast Index + iTunes enrichment entirely on that path.&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;audioUrl&lt;/code&gt; field on &lt;code&gt;EpisodeIndexEntry&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Monitor cron cadence tuned to every 2 hours — RSS conditional GETs keep the feed-scan cost low, and most monitored feeds don&apos;t publish often enough to justify the previous 30-minute cadence.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! Feel free to &lt;a href=&quot;https://elezea.com/contact&quot;&gt;get in touch&lt;/a&gt;.</content:encoded><author>Rian van der Merwe</author></item></channel></rss>