Files
ipx/crates/directory/CHANGELOG.md
rays cd7a9b8530 Apple Podcasts' top charts into the directory weekly, and its categories checked (#252)
With apple_country set, the directory fetches Apple's top 100 podcasts and the top 50 of each of
its 19 categories for that country (itunes.apple.com/{cc}/rss/toppodcasts), looks up each
show's RSS address (/lookup, 100 ids a call, three seconds apart, as Apple asks for no more than
about twenty a minute), and stores them as the snapshot apple-podcasts with no subscribers. The
refresher fetches them like any feed; the most-subscribed chart is unchanged. Apple's primary
genre goes in as the snapshot's category, used only while a feed names none.

The same weekly run reads Apple's genre tree (ws/genres?id=26) and warns when it differs from
ipx_feed's CATEGORIES; on 2026-10-15 they were the same, all 19 and their subcategories.

A syncs table keeps when it last ran: at start if a week has passed, again weekly, an hour after
a failure. keep_instances spares apple-podcasts, which no token holds, and no token may take
the name. A trace a sync, a span each answer.

CLAUDE.md: builds one cargo command at a time, the load looked at before and after, after a
build chained with a test compile took Tower past 200.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:21:48 +00:00

3.1 KiB

Changelog: ipx-directory

The directory of public podcasts that ipx servers share (docs/directory.md). ipx's changelog is crates/ipx/CHANGELOG.md, the page's web/CHANGELOG.md.

Its version is in crates/directory/Cargo.toml, and a release is tagged directory-vX.Y.Z.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

Added

  • With apple_country set, Apple Podcasts' top charts for that country (the top 100 and the top 50 of each category) come into the directory every week, beside what servers share, without counting as subscribers; and a warning says when Apple's categories no longer match ipx's (#252).

Changed

  • Each feed is checked every twelve hours instead of six (#243).
  • Feeds are fetched accepting brotli and zstd as well as gzip (#244).
  • On Postgres the server keeps all ten of its database connections open, so a request does not wait for a new one (#241).

1.1.1 - 2026-10-15

Changed

  • The directory checks five feeds at a time, so a publisher that does not answer no longer holds up the rest of its round (#227).
  • A feed's server that takes 10 s to connect, or sends nothing for 15 s, is given up on (#230).

Security

  • A failed feed check is logged without its address's query or password (#238).

1.1.0 - 2026-10-13

Added

  • With metrics_bind set, the directory serves Prometheus metrics on a port of its own: memory, open files, and the feeds it has fetched and their bytes. A feed check's trace says how large the feed was (#224).

Changed

  • The directory uses mimalloc instead of glibc's allocator, so it gives back memory it has freed instead of holding over a gigabyte while idle (#224).
  • The example in docs/directory.md has no healthcheck; ipx-directory health is still there to run by hand (#218).

Security

  • A feed check's trace keeps the feed's address without its query or password (#225).

1.0.0 - 2026-10-12

Added

  • Anyone can browse the directory in a web browser, read only: the most subscribed, categories, every feed A to Z, a search by name, and each feed's page with its latest items and its address to copy into any podcast app (#215).
  • GET /v1/instances lists the servers holding a snapshot, with their feeds and subscribers, for an admin token (#206).
  • ipx-directory, a directory of public podcasts that ipx servers share: each sends the public feeds its people subscribe to, and any server with a token browses them, each feed listed once it has been read. Tokens are in its config file, each read-only, read-write or admin, and revoked one at a time (#204, #205).
  • Traces: a span a request, joining the trace of the ipx server that called, and a trace a refresher round with a span a feed (#213).