<?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>discogs-mcp v3.6.0 — Self-hosting on the Workers Free plan</title><link>https://elezea.com/2026/10/discogs-mcp-v3-6-0/</link><guid isPermaLink="true">https://elezea.com/2026/10/discogs-mcp-v3-6-0/</guid><description>This release is mostly for people who run their own copy of `discogs-mcp`. The one-click deploy works on the Workers Free plan again, and a large collection…</description><pubDate>Wed, 07 Oct 2026 13:26:03 GMT</pubDate><content:encoded>&lt;p&gt;This release is mostly for people who run their own copy of &lt;code&gt;discogs-mcp&lt;/code&gt;. The one-click deploy works on the Workers Free plan again, and a large collection now finishes syncing there. Login links and status messages also make more sense on a self-hosted server.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;Breaking changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If you self-host, an MCP client that signed in by naming your &lt;code&gt;/mcp&lt;/code&gt; URL as its OAuth resource will have to sign in once more after you upgrade. Clients that used your bare domain, which is what the server advertised, stay signed in.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_cache_stats&lt;/code&gt; shows how far your collection sync has got: how many items the snapshot holds, when it was fetched, and which page a sync in progress is on (page N of M).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Deploy to Cloudflare button failed at its first step on the Workers Free plan. It works again.&lt;/li&gt;
&lt;li&gt;Collection sync on the Workers Free plan used to stall partway through a large collection, because each page it saved cost more CPU time than the last. Each page now costs the same, so a big collection finishes over a few scheduled runs. One self-hoster&apos;s 4,157-release collection synced completely this way. Searching a collection that size can still run out of CPU time on the Free plan, and the README&apos;s sizing note says where the line is (roughly 2,000 releases).&lt;/li&gt;
&lt;li&gt;The login links in &lt;code&gt;auth_status&lt;/code&gt;, &lt;code&gt;server_info&lt;/code&gt;, and every tool&apos;s &amp;quot;please sign in&amp;quot; message pointed at discogs-mcp.com, which is a private instance. They now point at your own deployment.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth_status&lt;/code&gt; showed a session expiry date of January 1, 1970. It shows the real date now, or leaves the line out when the server doesn&apos;t know it.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;refresh_collection&lt;/code&gt; fails, it tells you why. If Discogs is rate limiting you, that includes how long to wait.&lt;/li&gt;
&lt;li&gt;A sign-in link with something missing (no client ID, say) gets a plain error message and never reaches Discogs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_collection_stats&lt;/code&gt; labels decades as &amp;quot;2010s&amp;quot; and not &amp;quot;2010ss&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded the OAuth library (&lt;code&gt;@cloudflare/workers-oauth-provider&lt;/code&gt;) from 0.3 to 1.2. Existing sign-ins keep working, and it&apos;s the base for a consent screen in a later release.&lt;/li&gt;
&lt;li&gt;Tools and prompts register through &lt;code&gt;registerTool()&lt;/code&gt; and &lt;code&gt;registerPrompt()&lt;/code&gt;, the only registration methods in version 2 of the MCP SDK.&lt;/li&gt;
&lt;li&gt;The test suite runs on Vitest 4 and Node 22.&lt;/li&gt;
&lt;li&gt;Removed an unused entry point and JWT module.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>lastfm-mcp v2.6.0 — Sign-in without client registration</title><link>https://elezea.com/2026/10/lastfm-mcp-v2-6-0/</link><guid isPermaLink="true">https://elezea.com/2026/10/lastfm-mcp-v2-6-0/</guid><description>MCP clients can now sign in by pointing at a web address that describes them, with no registration step first. This is the method the current MCP spec prefers,…</description><pubDate>Mon, 05 Oct 2026 16:04:29 GMT</pubDate><content:encoded>&lt;p&gt;MCP clients can now sign in by pointing at a web address that describes them, with no registration step first. This is the method the current MCP spec prefers, and existing connections keep working as before. All five changes behind it came from &lt;a href=&quot;https://github.com/vhata&quot;&gt;Jonathan Hitchcock&lt;/a&gt;, the project&apos;s first outside contributor.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sign-in with Client ID Metadata Documents. A client can use an HTTPS URL as its ID, and the server reads the client&apos;s name and allowed redirect addresses from the document at that URL. Some clients support nothing else. The documents Claude Code and VS Code publish are accepted as they are.&lt;/li&gt;
&lt;li&gt;If a client&apos;s document can&apos;t be fetched or doesn&apos;t validate, sign-in stops with a plain &lt;code&gt;Invalid client_id&lt;/code&gt; error.&lt;/li&gt;
&lt;li&gt;Dynamic client registration is still on, so clients that rely on it are unaffected and nobody needs to sign in again.&lt;/li&gt;
&lt;li&gt;The landing page at &lt;a href=&quot;https://lastfm-mcp.com&quot;&gt;lastfm-mcp.com&lt;/a&gt; has current setup steps for Claude, two more example questions, and a link to the privacy policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server_info&lt;/code&gt;, the discovery card, and &lt;code&gt;/health&lt;/code&gt; report the real server version. They said 1.0.0 before.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Four indirect dependencies (&lt;code&gt;fast-uri&lt;/code&gt;, &lt;code&gt;hono&lt;/code&gt;, &lt;code&gt;ip-address&lt;/code&gt;, &lt;code&gt;qs&lt;/code&gt;) moved to patched versions after new security advisories. None of them ship in the deployed Worker, and &lt;code&gt;npm audit&lt;/code&gt; on production dependencies is back to zero.&lt;/li&gt;
&lt;li&gt;Wrangler is pinned to 4.124.0, the version the test runner uses, so local dev, deploys, and tests share one runtime. Dev and deploys had been on a Wrangler more than a year older.&lt;/li&gt;
&lt;li&gt;CI fails on unformatted code, after a one-time cleanup of files that had drifted.&lt;/li&gt;
&lt;li&gt;The suite is at 183 tests, up from 174. The new ones include full sign-in round trips using the document shapes Claude Code and VS Code publish.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>Discrobble v1.3.6 — Your Discogs notes on the album page</title><link>https://elezea.com/2026/08/discrobble-v1-3-6/</link><guid isPermaLink="true">https://elezea.com/2026/08/discrobble-v1-3-6/</guid><description>Discrobble now shows the Notes you keep against a record in your Discogs collection, and lets you edit them from the album page. This release also collects…</description><pubDate>Fri, 28 Aug 2026 19:10:44 GMT</pubDate><content:encoded>&lt;p&gt;Discrobble now shows the Notes you keep against a record in your Discogs collection, and lets you edit them from the album page. This release also collects everything shipped since 1.3.1: marketplace prices, the full Wikipedia intro, cleaner artist names, and compilations that scrobble properly.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Album pages show the Notes from your Discogs collection, and you can edit and save them without leaving the app. Turn it on with &amp;quot;Show collection notes&amp;quot; in Settings. If you own two copies of a release, the notes come from the first one, with a &amp;quot;1 of N copies&amp;quot; caption so you know which.&lt;/li&gt;
&lt;li&gt;The album page can also show what a record is going for: how many copies are for sale on the Discogs Marketplace, the lowest asking price, and a link through to the listings. There&apos;s a Settings toggle for that one too.&lt;/li&gt;
&lt;li&gt;The Wikipedia section gives you the full introduction now, paragraph breaks and all, where it used to stop after a sentence or two.&lt;/li&gt;
&lt;li&gt;Settings has a small ask at the bottom: a link that opens the App Store review sheet, if you feel like leaving a rating.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Discogs disambiguation numbers are gone from artist names, so &amp;quot;Nirvana (2)&amp;quot; displays and scrobbles as &amp;quot;Nirvana&amp;quot;. Albums already in your library get cleaned up once, on launch.&lt;/li&gt;
&lt;li&gt;Compilations whose tracks carry no artist of their own now scrobble under the performer credited on the release. Last.fm quietly drops anything filed under &amp;quot;Various&amp;quot;, so those plays used to disappear without a word.&lt;/li&gt;
&lt;li&gt;When a scrobble does fail, the app tells you why.&lt;/li&gt;
&lt;li&gt;If your Discogs collection is set to private, sync now says so and points at the privacy setting to change. It used to fail with &amp;quot;Sync interrupted after 5 attempts&amp;quot; and no explanation.&lt;/li&gt;
&lt;li&gt;Fixed a crash that could hit when an album left your collection while you had the grid or that album&apos;s page open.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>lastfm-mcp v2.5.0 — Latest MCP protocol support</title><link>https://elezea.com/2026/08/lastfm-mcp-v2-5-0/</link><guid isPermaLink="true">https://elezea.com/2026/08/lastfm-mcp-v2-5-0/</guid><description>The server now speaks the current MCP revision (2026-07-28, the stateless one) natively, while older clients keep working through the SDK&apos;s compatibility lane.…</description><pubDate>Tue, 25 Aug 2026 00:04:31 GMT</pubDate><content:encoded>&lt;p&gt;The server now speaks the current MCP revision (2026-07-28, the stateless one) natively, while older clients keep working through the SDK&apos;s compatibility lane. Tool responses also got smarter about what to call next, and two long-standing crash bugs in the public catalog tools are gone.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;Breaking changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Mcp-Session-Id&lt;/code&gt; header is no longer read or echoed, since the 2026-07-28 spec removed protocol sessions. If you connected through the manual &lt;code&gt;/login&lt;/code&gt; flow, pass &lt;code&gt;?session_id=&lt;/code&gt; on the &lt;code&gt;/mcp&lt;/code&gt; URL, which was always the documented way. Nothing changes for OAuth clients such as Claude.ai, Claude Code, or Claude Desktop.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MCP 2026-07-28 support: &lt;code&gt;server/discover&lt;/code&gt;, the &lt;code&gt;_meta&lt;/code&gt; request envelope, and the &lt;code&gt;MCP-Protocol-Version&lt;/code&gt;, &lt;code&gt;Mcp-Method&lt;/code&gt;, and &lt;code&gt;Mcp-Name&lt;/code&gt; headers. Clients on the 2024 and 2025 revisions still connect with &lt;code&gt;initialize&lt;/code&gt; and get the same tools.&lt;/li&gt;
&lt;li&gt;Every tool response ends with a &amp;quot;Next steps&amp;quot; block listing the most likely follow-up calls with their exact arguments. Where the response has a clear top item (your top artist this month, the most recent week in a chart list), the first suggestion is filled in with it. The server also ships instructions naming the recommended tool path per entity, so a model lands on the right verb without reading all 21 descriptions.&lt;/li&gt;
&lt;li&gt;Numeric parameters (&lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;page&lt;/code&gt;, &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;) accept strings, because some clients send numbers that way. The same bounds still apply.&lt;/li&gt;
&lt;li&gt;Resource templates advertise a description and MIME type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mcp&lt;/code&gt; is rate limited per IP at 60 requests a minute to protect the shared Last.fm API budget. That is well above what any interactive client does.&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;, &lt;code&gt;get_track_info&lt;/code&gt;, and &lt;code&gt;get_artist_info&lt;/code&gt; no longer throw for an album, track, or artist with exactly one tag, one track, or one similar artist, or with none at all. Last.fm sends those as a bare object or leaves the key out; the tools handle all three shapes now. This was producing a few dozen errors a week in production.&lt;/li&gt;
&lt;li&gt;A failed Last.fm fetch raised a second, unhandled rejection alongside the error the caller already received.&lt;/li&gt;
&lt;li&gt;The discovery card and &lt;code&gt;server_info&lt;/code&gt; reported protocol &lt;code&gt;2024-11-05&lt;/code&gt;. Both now report &lt;code&gt;2026-07-28&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@modelcontextprotocol/server&lt;/code&gt; 2.0 and &lt;code&gt;@modelcontextprotocol/client&lt;/code&gt; 2.0 replace the v1 SDK, with Cloudflare Agents SDK 0.21 (&lt;code&gt;createMcpHandler&lt;/code&gt; from &lt;code&gt;agents/mcp/server&lt;/code&gt;) and &lt;code&gt;@cloudflare/workers-oauth-provider&lt;/code&gt; 0.10. &lt;code&gt;npm audit&lt;/code&gt; on production dependencies reports zero vulnerabilities, down from 14.&lt;/li&gt;
&lt;li&gt;All tool, prompt, and resource registrations use the &lt;code&gt;register*&lt;/code&gt; APIs with &lt;code&gt;z.object()&lt;/code&gt; schemas.&lt;/li&gt;
&lt;li&gt;Two OAuth workarounds for Claude.ai&apos;s RFC 8707 &lt;code&gt;resource&lt;/code&gt; parameter are gone; the provider handles it correctly now.&lt;/li&gt;
&lt;li&gt;Test stack is vitest 4, &lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt; 0.22, and Node 22. CI runs the suite again (174 tests) after a long stretch with that step disabled. New tests drive a real SDK client through the Worker on both protocol lanes and snapshot the advertised catalogue.&lt;/li&gt;
&lt;li&gt;Dead code removed: the session-logging utilities, leftover type files, and an unused OAuth registration wrapper.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>discogs-mcp v3.5.0 — Egress relay, faster 429 recovery</title><link>https://elezea.com/2026/08/discogs-mcp-v3-5-0/</link><guid isPermaLink="true">https://elezea.com/2026/08/discogs-mcp-v3-5-0/</guid><description>This release is about the Discogs rate limit: fewer 429s to begin with, and a quick, clear answer when one does happen. Discogs throttles by source IP and a…</description><pubDate>Mon, 17 Aug 2026 22:39:19 GMT</pubDate><content:encoded>&lt;p&gt;This release is about the Discogs rate limit: fewer 429s to begin with, and a quick, clear answer when one does happen. Discogs throttles by source IP and a Worker&apos;s calls leave from Cloudflare&apos;s shared IPs, so &lt;code&gt;discogs-mcp&lt;/code&gt; can now send its traffic through a relay on a machine you own (the hosted instance already does). When you are throttled, an interactive call tells you within seconds.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Route Discogs calls through your own IP. Point &lt;code&gt;DISCOGS_RELAY_ORIGIN&lt;/code&gt; at a Cloudflare Tunnel to any always-on machine (a home Mac, a small VPS) running a local reverse proxy in front of &lt;code&gt;api.discogs.com&lt;/code&gt;, guard it with a Cloudflare Access service token, and the whole 60-requests-a-minute budget is yours. The README has the setup, including the &lt;code&gt;X-Forwarded-Host&lt;/code&gt; gotcha that bites cloudflared on its own. If the relay machine is off, calls go direct and nothing stops working.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ping&lt;/code&gt; and &lt;code&gt;server_info&lt;/code&gt; now say how Discogs traffic is leaving (&amp;quot;Discogs egress: via relay relay.discogs-mcp.com, no fallbacks recorded&amp;quot;) and, if the relay has failed, how many times and how recently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A single rate-limited request could take the server down for ten minutes. Now the limiter stops assuming a full budget after idle periods, backs off exponentially, and forgets stale 429 streaks across restarts, so the circuit breaker trips only on real, sustained throttling.&lt;/li&gt;
&lt;li&gt;Interactive tool calls report a throttle in seconds; they used to sit through around 80 seconds of retries first. The background collection sync, which has nobody waiting on it, still waits the throttle out, and it now queues behind your requests.&lt;/li&gt;
&lt;li&gt;Every authenticated tool used to spend a Discogs request just to look up your username. That now comes off the session, so a cold cache can&apos;t burn budget or trip the breaker before your actual call.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_wantlist&lt;/code&gt; serves the page size you asked for when the answer comes from cache.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The 6-hourly collection sync runs at :23 past odd hours, away from the crowd of &lt;code&gt;0 */6&lt;/code&gt; crons on the shared IPs.&lt;/li&gt;
&lt;li&gt;Relay fallback rule: an error status with neither an &lt;code&gt;x-discogs-*&lt;/code&gt; header nor a JSON body is treated as the relay layer (530, 502, Access 401, HTML 404) and retried directly. A 429 never is.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>TL;DL v2.5.0 — Editorial decks everywhere and a new transcription model</title><link>https://elezea.com/2026/08/tldl-v2-5-0/</link><guid isPermaLink="true">https://elezea.com/2026/08/tldl-v2-5-0/</guid><description>The first TL;DL release in four months. Episode summaries now carry their editorial deck and pull quote into the email newsletter and the RSS feed,…</description><pubDate>Sun, 02 Aug 2026 19:16:55 GMT</pubDate><content:encoded>&lt;p&gt;The first TL;DL release in four months. Episode summaries now carry their editorial deck and pull quote into the email newsletter and the RSS feed, transcription runs on OpenAI&apos;s new gpt-transcribe model, and a season of pipeline reliability fixes ships alongside.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Summary emails now open with the episode&apos;s editorial deck and feature its pull quote, matching the broadsheet look of the site.&lt;/li&gt;
&lt;li&gt;The RSS feed leads each item with the episode&apos;s deck, so feed readers see the standfirst instead of a raw summary excerpt.&lt;/li&gt;
&lt;li&gt;Transcription moved to OpenAI&apos;s &lt;a href=&quot;https://developers.openai.com/api/docs/guides/speech-to-text&quot;&gt;gpt-transcribe&lt;/a&gt; model — their recommended successor to the 4o-transcribe family. Transcripts now reliably run to the end of the episode (the old model could stop early on some files), and the whisper-1 safety net for unusual audio is unchanged.&lt;/li&gt;
&lt;li&gt;The admin dashboard was redesigned into a tabbed layout, including a new subscribers view.&lt;/li&gt;
&lt;li&gt;Shared links look better: a proper 1200×630 social card, and page titles that lead with the tagline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Curly quotes and other special characters in episode titles no longer show as raw &lt;code&gt;&amp;amp;#8220;&lt;/code&gt;-style codes — new titles are decoded at ingest, and existing ones were cleaned up.&lt;/li&gt;
&lt;li&gt;An episode whose final minutes can&apos;t be decoded now keeps its transcript (marked partial) instead of failing outright.&lt;/li&gt;
&lt;li&gt;Long episodes hosted on rate-limiting CDNs (looking at you, Substack) now ride out the throttling instead of failing mid-transcription.&lt;/li&gt;
&lt;li&gt;Episodes no longer show up twice when the monitor and a manual submission both pick them up.&lt;/li&gt;
&lt;li&gt;Adding a podcast whose directory listing is incomplete can no longer queue up its entire back catalog by mistake.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Queue processing hardened: zombie messages are dropped instead of retried forever, and the consumer&apos;s CPU budget was raised for very long episodes.&lt;/li&gt;
&lt;li&gt;Test stack upgraded to vitest 4 + Workers pool 0.15, CI now runs on every push, and Hono security patches applied.&lt;/li&gt;
&lt;li&gt;A summary-model A/B harness compares candidate models on real transcripts before any model swap.&lt;/li&gt;
&lt;li&gt;The Postmark email templates are now versioned in the repo as source-of-truth copies.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>discogs-mcp v3.4.0 — Wantlist support</title><link>https://elezea.com/2026/06/discogs-mcp-v3-4-0/</link><guid isPermaLink="true">https://elezea.com/2026/06/discogs-mcp-v3-4-0/</guid><description>Your Discogs wantlist is now first-class in `discogs-mcp`. Browse the records you want but don&apos;t own, add one the moment you spot it, and clear it off the list…</description><pubDate>Sun, 28 Jun 2026 14:47:11 GMT</pubDate><content:encoded>&lt;p&gt;Your Discogs wantlist is now first-class in &lt;code&gt;discogs-mcp&lt;/code&gt;. Browse the records you want but don&apos;t own, add one the moment you spot it, and clear it off the list once you&apos;ve finally tracked it down — all from your LLM client, without a trip to the Discogs site.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_wantlist&lt;/code&gt; browses the releases you want but don&apos;t own, paged, with the details for each so you can scan the list in conversation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add_to_wantlist&lt;/code&gt; adds a release to your wantlist by its Discogs release ID — pair it with &lt;code&gt;search_discogs&lt;/code&gt; to find the release, then add it in the same breath.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove_from_wantlist&lt;/code&gt; takes a release off your wantlist once you own it.&lt;/li&gt;
&lt;li&gt;There&apos;s a ready-made workflow built on these: the &lt;a href=&quot;https://github.com/rianvdm/product-ai-public/tree/main/.opencode/skills/finding-original-cds&quot;&gt;&lt;code&gt;finding-original-cds&lt;/code&gt;&lt;/a&gt; skill picks the best original, non-remastered CD pressing of an album and adds it to your wantlist for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The server now backs off cleanly when Discogs rate-limits a request. A per-entry retry cap and circuit breaker stop it from retrying in a tight loop, so a burst of 429s during a big collection sync pauses and recovers on its own instead of wedging.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Collection sync now runs every 6 hours instead of hourly — the snapshot stays plenty fresh at that cadence and it&apos;s far gentler on the Discogs API.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>Discrobble v1.3.1 — Free to start, plus a Wikipedia summary on each album</title><link>https://elezea.com/2026/06/discrobble-v1-3-1/</link><guid isPermaLink="true">https://elezea.com/2026/06/discrobble-v1-3-1/</guid><description>Discrobble is now free to start, with a one-time $4.99 unlock for unlimited scrobbling. If you were already using the app before this change, you keep…</description><pubDate>Fri, 19 Jun 2026 16:29:07 GMT</pubDate><content:encoded>&lt;p&gt;Discrobble is now free to start, with a one-time $4.99 unlock for unlimited scrobbling. If you were already using the app before this change, you keep unlimited scrobbling for free — thanks for being an early user. This update also adds a Wikipedia summary on the album page, a clearer view of your membership in Settings, and the option to show or hide album ratings.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Discrobble is free to start. New listeners get 20 free scrobbles, then a single $4.99 purchase unlocks unlimited scrobbling, with no subscription and no ads. Anyone who used Discrobble before this change keeps unlimited scrobbling for free.&lt;/li&gt;
&lt;li&gt;Album pages now include a summary from Wikipedia, with a link to read the full article.&lt;/li&gt;
&lt;li&gt;Settings shows your membership status, and lets you upgrade or restore your purchase.&lt;/li&gt;
&lt;li&gt;You can choose whether to show album ratings, under Settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>Discrobble v1.2.1 — Rate your albums</title><link>https://elezea.com/2026/06/discrobble-v1-2-1/</link><guid isPermaLink="true">https://elezea.com/2026/06/discrobble-v1-2-1/</guid><description>Discrobble now shows your Discogs rating for every album and lets you set or change it without leaving the app. Open an album, tap a star, and your rating…</description><pubDate>Fri, 12 Jun 2026 23:05:41 GMT</pubDate><content:encoded>&lt;p&gt;Discrobble now shows your Discogs rating for every album and lets you set or change it without leaving the app. Open an album, tap a star, and your rating saves straight to your Discogs collection.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Your Discogs rating now appears on each album&apos;s detail screen.&lt;/li&gt;
&lt;li&gt;Tap a star to rate an album from 1 to 5, or tap the star you&apos;ve already selected to clear the rating. Ratings save to your Discogs account, so they stay in sync wherever you use Discogs.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>Discrobble v1.2.0 — Synced scrobble history</title><link>https://elezea.com/2026/05/discrobble-v1-2-0/</link><guid isPermaLink="true">https://elezea.com/2026/05/discrobble-v1-2-0/</guid><description>Your Recently Scrobbled history now syncs across all your devices. Scrobble an album on your iPhone and it&apos;s there on your iPad — your recent plays follow you…</description><pubDate>Sun, 31 May 2026 20:45:54 GMT</pubDate><content:encoded>&lt;p&gt;Your Recently Scrobbled history now syncs across all your devices. Scrobble an album on your iPhone and it&apos;s there on your iPad — your recent plays follow you anywhere you&apos;re signed in with the same Last.fm account.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Recently Scrobbled now syncs across every device signed into the same Last.fm account. It&apos;s there on launch — no pull-to-refresh needed.&lt;/li&gt;
&lt;li&gt;Clear your history on one device and it clears everywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Older scrobbles from before this update may show without cover art. They clear out on their own as you keep scrobbling, or you can tidy them up right away with Clear Recent History in Settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><item><title>Discrobble v1.1.0 — Native iPad support</title><link>https://elezea.com/2026/05/discrobble-v1-1-0/</link><guid isPermaLink="true">https://elezea.com/2026/05/discrobble-v1-1-0/</guid><description>Discrobble now runs natively on iPad, with a denser collection grid and a side-by-side album view that puts the cover and tracklist together. This release also…</description><pubDate>Tue, 26 May 2026 20:30:26 GMT</pubDate><content:encoded>&lt;p&gt;Discrobble now runs natively on iPad, with a denser collection grid and a side-by-side album view that puts the cover and tracklist together. This release also clears out a sticky onboarding bug, makes sync safer when it gets interrupted, and fully removes your data from the server when you delete your account.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2&gt;What&apos;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Native iPad support. The collection grid adapts to the screen — more albums per row on iPad, same comfortable density on iPhone. The album screen shows the cover and the tracklist side by side in both portrait and landscape.&lt;/li&gt;
&lt;li&gt;The onboarding and sync screens stay at a readable width on iPad instead of stretching edge to edge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The app could occasionally get stuck on the setup screen after you connected your accounts. Once you&apos;re signed in, you now move on.&lt;/li&gt;
&lt;li&gt;Collection sync is safer. If a sync is interrupted partway through, it can no longer remove albums from your collection by mistake.&lt;/li&gt;
&lt;li&gt;Deleting your account from Settings now fully removes your data from the server, not just from your device.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Under the hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In-flight auth tokens are now encrypted at rest on the server (AES-256-GCM).&lt;/li&gt;
&lt;li&gt;Added the Apple required-reason API privacy manifest.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item><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 Last.fm 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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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 Last.fm 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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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 tldl-pod.com.&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 tldl-pod.com 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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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 elezea.com.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;Thanks for still believing in RSS! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</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! &lt;a href=&quot;https://elezea.com/contact&quot;&gt;Get in touch&lt;/a&gt; if you have any comments or feedback.</content:encoded><author>Rian van der Merwe</author></item></channel></rss>