Public Feeds API
Makenot.work publishes creator and project content as RSS 2.0 feeds. The feeds are unauthenticated, uncapped by application, and stable, so aggregators can rely on them without registering an app or requesting a key.
The fan-facing walkthrough lives at RSS Feeds. This page is for aggregators, feed readers, and anyone building on top of MNW content.
Open by Policy
These feeds are a permanent, first-class integration surface. Any aggregator, including ones that compete with Balanced Breakfast (our own aggregator), can consume them on equal footing. There is no privileged internal path; BB reads the same URLs as everyone else.
Concretely, this means:
- The URL shapes below will not be broken. Additions are fine; removals require a migration path and an entry in the changelog feed.
- No API key, contract, or business relationship is required to poll them.
- We will not rate-limit a well-behaved aggregator more aggressively than a browser polling the same URL.
Endpoints
All responses are application/rss+xml; charset=utf-8, RSS 2.0.
| Endpoint | Contents |
|---|---|
GET /u/{username}/rss | A creator’s public items across all projects |
GET /p/{slug}/rss | A project’s public items |
GET /p/{slug}/blog/feed.xml | A project’s published blog posts |
GET /changelog/feed.xml | Platform changelog (canonical alias for the changelog project blog) |
GET /feed/{user_id}?sig={hmac}&v={version} | Personal feed of items from followed creators and projects |
Sandbox accounts are excluded from all feeds; requests against a sandbox username or slug return 404.
Item Feeds (/u/*/rss, /p/*/rss)
Each <item> element carries:
| Field | Source |
|---|---|
<title> | Item title |
<link> | {host}/i/{item_id}: the canonical item page |
<description> | Item description (empty string if unset) |
<pubDate> | Item created_at |
<guid> | Item ID (UUID). Stable for the life of the item. |
The GUID is the item’s UUID, not its URL, so aggregators can detect a renamed or moved item as the same entry.
Blog Feeds (/p/*/blog/feed.xml, /changelog/feed.xml)
Blog <item> elements carry:
| Field | Source |
|---|---|
<title> | Post title |
<link> | {host}/p/{project_slug}/blog/{post_slug} (or {host}/changelog/{post_slug} for the changelog alias) |
<description> | First 300 characters of the post body (Markdown, not rendered) |
<pubDate> | published_at, falling back to created_at if unset |
<guid> | Post ID (UUID) |
Only published posts appear. Drafts and scheduled-future posts are omitted.
Personal Feed (/feed/{user_id})
The personal feed aggregates new items from creators and projects the user follows. Unlike the other endpoints, it is per-user and private, so it is authenticated by an HMAC signature in the query string (no cookie or bearer token), which lets any RSS reader fetch it.
The signed URL is minted for the user in the dashboard. Users can rotate it (the URL carries a version v; when the user regenerates, the old version’s signatures are rejected). Aggregators should treat a 403 on this endpoint as a signal that the user needs to paste in a fresh URL.
URL Stability
The paths above are load-bearing. In particular:
/u/{username}/rssand/p/{slug}/rsswill remain valid for as long as the username or slug exists.- If a creator renames their account or a project changes slug, the old feed URL stops working. There is no automatic redirect. GUIDs remain stable across renames, so an aggregator that already ingested items will not lose de-duplication.
/changelog/feed.xmlis a canonical alias; it will follow the changelog wherever it moves.
New endpoints may be added under /feed/, /u/, or /p/. Existing ones will not be removed without a deprecation window announced on the changelog feed.
Discovery
There is no JSON directory endpoint yet, but three existing mechanisms cover the common cases:
- Sitemap.
GET /sitemap.xmlenumerates every active public creator (/u/{username}) and every public item (/i/{item_id}). An aggregator can walk the sitemap and construct/u/{username}/rssfrom each creator URL. The sitemap is cached and rate-friendly to crawl. - Autodiscovery
<link>tags. Three page types advertise their feed via<link rel="alternate" type="application/rss+xml">in the HTML<head>:/u/{username}: the creator’s item feed/p/{slug}: the project’s item feed/p/{slug}/blog: the project’s blog feed Standard feed-reader auto-detection picks these up.
- Direct construction. If you have a username or project slug already, build the URL from the endpoint table above.
A JSON discovery endpoint (creators and projects opting into aggregation, with metadata) is a planned addition; it will land here when it ships.
Polling
Feeds are cheap to generate but not free. Recommended cadence:
- Item and blog feeds: poll no more than every 15 minutes per URL.
- Changelog feed: hourly is plenty.
- Personal feed: poll on the same cadence the user’s reader would: typically 15–60 minutes.
There is no per-endpoint rate limit distinct from the platform baseline described in API Overview. Feeds share the general read-path budget. If you are polling thousands of URLs, stagger requests rather than firing them in a burst.
Conditional requests (If-Modified-Since, ETag) are not currently honored. Every request re-renders the feed. Assume you will download the full body each poll and de-duplicate on GUID. This may change; watch the changelog feed.
Content and Licensing
The feeds carry titles, descriptions, publication dates, and canonical links back to makenot.work. They do not carry the underlying media (audio, video, downloads, or paid content), which remains gated behind the item page.
Redistribution of feed metadata (titles, descriptions, links) for the purpose of aggregation, indexing, or notification is expressly permitted. Attribution back to the creator’s makenot.work page via the <link> element is required and is included in every entry by default. Do not strip it.
Republishing feed content as if it were your own, or scraping full media through the feed’s link elements, is not permitted and is not what these feeds are for. When in doubt, link back.
See Also
- RSS Feeds (fan guide): subscribing in a reader, podcast setup
- API Overview: shared error format and rate-limit policy
- Changelog: platform changes, including feed additions and deprecations