Curated RSS discovery. Federation by fork. No algorithm. No platform.
Authors don't sign up, don't federate, don't install anything. They just keep blogging like it's 2005 and a discover instance picks them up.
Hand-picked playlists of RSS/Atom feeds, organized by vibe. Browse, follow, read inline, export to your reader. Runs on Cloudflare Workers + D1.
Anyone can fork this, stand up their own instance, and curate their own playlists to their taste. Your corner of the web for the low, low price of $0.
- Browse — curated playlists with tag filtering, full-text search (returns individual blogs, not playlists), random shuffle, and a "new" view of recently-added sources
- Feed — follow playlists or individual sources, read posts inline, export/import OPML, add any RSS URL directly
- Suggest a feed — public submission form on
/about; server-side validation rejects click-through and invalid feeds before they hit the queue - Webmentions via RSS — when sources in the directory link to each other, the cited author gets a mention feed at
/api/mentions/{domain}.xml(e.g./api/mentions/gordonmclean.co.uk.xml). Delivered the same way authors read everything else: their RSS reader - PWA — installable, dark/light theme, works offline for cached views
- Analytics — privacy-friendly, no third parties. Tracks hits, top paths, countries, and RSS feed subscribers. No cookies, no JS fingerprinting
- Node.js
- Cloudflare account (free tier)
- A domain/subdomain (optional but recommended)
git clone https://github.com/qualityshepherd/discover
cd discover
npm install
cp wrangler.example.toml wrangler.toml
wrangler login
wrangler d1 create discover
wrangler r2 bucket create discoverPaste the D1 database id and R2 bucket name into wrangler.toml. Set your name and DOMAIN_NAME, then run the migrations:
wrangler d1 execute discover --remote --file migrations/0001_init.sql
wrangler d1 execute discover --remote --file migrations/0002_fts.sql
wrangler d1 execute discover --remote --file migrations/0003_source_title.sql
wrangler d1 execute discover --remote --file migrations/0004_backfill_source_title.sql
wrangler deployGo to /admin, enter a passphrase, copy your pubkey, paste it into wrangler.toml as OWNER, redeploy. Done.
/admin — manage playlists, sources, and content moderation.
- Playlists — create and edit themed groups of RSS sources
- Sources — add RSS/Atom feed URLs; the cron fetches all sources every run and builds the link graph for webmentions. Filter by status: ok, warning, error, stale, dead, never fetched
- Curate — review suggested feed candidates mined from link content; approve, dismiss, or block. Use "rebuild mentions" to regenerate the webmentions graph on demand
- Batch validate — paste multiple URLs, validate in bulk, add directly or queue to pending
- Blocked domains — hostname blocklist; exact match or subdomain (
example.comblockssub.example.combut notnotexample.com) - Analytics — hit counts, top paths, countries
wrangler deployCustom domains are set in the Cloudflare dashboard, not wrangler.toml.
npx wrangler devnpm testAGPL · brine