{"id":50593171,"url":"https://github.com/qualityshepherd/discover","last_synced_at":"2026-06-05T12:01:31.662Z","repository":{"id":353775254,"uuid":"1218180127","full_name":"qualityshepherd/discover","owner":"qualityshepherd","description":"A hand-curated list of RSS feeds worth following. Writers, makers, and thinkers who actually share their work via RSS.","archived":false,"fork":false,"pushed_at":"2026-05-12T13:38:55.000Z","size":2061,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-12T15:34:46.845Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qualityshepherd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-22T16:01:39.000Z","updated_at":"2026-05-12T14:06:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/qualityshepherd/discover","commit_stats":null,"previous_names":["qualityshepherd/discover"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/qualityshepherd/discover","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualityshepherd%2Fdiscover","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualityshepherd%2Fdiscover/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualityshepherd%2Fdiscover/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualityshepherd%2Fdiscover/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qualityshepherd","download_url":"https://codeload.github.com/qualityshepherd/discover/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualityshepherd%2Fdiscover/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33939227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-05T12:01:30.868Z","updated_at":"2026-06-05T12:01:31.652Z","avatar_url":"https://github.com/qualityshepherd.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [discover](https://discover.brine.dev)\n\n**Curated RSS discovery. Federation by fork. No algorithm. No platform.**\n\nAuthors 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.\n\nHand-picked playlists of RSS/Atom feeds, organized by vibe. Browse, follow, read inline, export to your reader. Runs on Cloudflare Workers + D1.\n\nAnyone 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.\n\n## Features\n\n- **Browse** — curated playlists with tag filtering, full-text search (returns individual blogs, not playlists), random shuffle, and a \"new\" view of recently-added sources\n- **Feed** — follow playlists or individual sources, read posts inline, export/import OPML, add any RSS URL directly\n- **Suggest a feed** — public submission form on `/about`; server-side validation rejects click-through and invalid feeds before they hit the queue\n- **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\n- **PWA** — installable, dark/light theme, works offline for cached views\n- **Analytics** — privacy-friendly, no third parties. Tracks hits, top paths, countries, and RSS feed subscribers. No cookies, no JS fingerprinting\n\n## Requirements\n\n- Node.js\n- [Cloudflare](https://cloudflare.com) account (free tier)\n- A domain/subdomain (optional but recommended)\n\n## Setup\n\n```bash\ngit clone https://github.com/qualityshepherd/discover\ncd discover\nnpm install\ncp wrangler.example.toml wrangler.toml\nwrangler login\nwrangler d1 create discover\nwrangler r2 bucket create discover\n```\n\nPaste the D1 database `id` and R2 bucket name into `wrangler.toml`. Set your `name` and `DOMAIN_NAME`, then run the migrations:\n\n```bash\nwrangler d1 execute discover --remote --file migrations/0001_init.sql\nwrangler d1 execute discover --remote --file migrations/0002_fts.sql\nwrangler d1 execute discover --remote --file migrations/0003_source_title.sql\nwrangler d1 execute discover --remote --file migrations/0004_backfill_source_title.sql\nwrangler deploy\n```\n\nGo to `/admin`, enter a passphrase, copy your pubkey, paste it into `wrangler.toml` as `OWNER`, redeploy. Done.\n\n## Admin\n\n`/admin` — manage playlists, sources, and content moderation.\n\n- **Playlists** — create and edit themed groups of RSS sources\n- **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\n- **Curate** — review suggested feed candidates mined from link content; approve, dismiss, or block. Use \"rebuild mentions\" to regenerate the webmentions graph on demand\n- **Batch validate** — paste multiple URLs, validate in bulk, add directly or queue to pending\n- **Blocked domains** — hostname blocklist; exact match or subdomain (`example.com` blocks `sub.example.com` but not `notexample.com`)\n- **Analytics** — hit counts, top paths, countries\n\n## Deployment\n\n```bash\nwrangler deploy\n```\n\nCustom domains are set in the Cloudflare dashboard, not `wrangler.toml`.\n\n## Local dev\n\n```bash\nnpx wrangler dev\n```\n\n## Tests\n\n```bash\nnpm test\n```\n\nAGPL · brine\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualityshepherd%2Fdiscover","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqualityshepherd%2Fdiscover","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualityshepherd%2Fdiscover/lists"}