My personal RSS feeds piped to Discord, powered by echohello-dev/feedhub.
This repo is just config + state. The worker code lives in feedhub; this repo's only job is to call it and provide feeds.json + state.json.
See feeds.json. Each feed posts to its own Discord channel.
- OpenRouter - New Models — every new model added to openrouter.ai/models.
DISCORD_WEBHOOK_OPENROUTER. - Model Context Protocol Blog — posts from blog.modelcontextprotocol.io.
DISCORD_WEBHOOK_MCP. - Johnny Huynh Blog — posts from johnnyhuy.com.
DISCORD_WEBHOOK_BLOGS. - Free Sauce - videos and articles — videos and articles from frees.au.
DISCORD_WEBHOOK_BLOGS(shared channel with Johnny Huynh).
.github/workflows/rss.yml calls the feedhub composite action daily. The worker diffs each feed against state.json, posts new items to its matching Discord webhook, and commits the updated state.
flowchart LR
cron["cron: 0 0 * * *"] --> act["GitHub Actions"]
act -->|"uses: echohello-dev/feedhub@main"| action["Composite action"]
action --> py["python rss.py"]
py -->|"posts to"| dc["Discord webhooks (one per feed)"]
py -->|"commits"| st["state.json"]
Webhook URLs live as GitHub Actions secrets — never in a file. One per webhook channel:
gh secret set DISCORD_WEBHOOK_OPENROUTER --repo echohello-dev/feeds
gh secret set DISCORD_WEBHOOK_MCP --repo echohello-dev/feeds
gh secret set DISCORD_WEBHOOK_BLOGS --repo echohello-dev/feeds
Then trigger the workflow manually the first time to seed state.json:
mise run trigger
Local commands go through mise (mise tasks). mise run seed marks current items seen without posting.
- Append an entry to
feeds.json(see the template's examples for the schema).webhook_secretis the env-var name, not the URL. - Either reuse an existing secret or set a new one:
gh secret set DISCORD_WEBHOOK_<NAME> --repo echohello-dev/feeds. - Add a matching job
envline in.github/workflows/rss.ymlif you introduced a new secret. - Seed before the first real post, or the backlog floods the channel:
mise run seed.
Edit the cron in .github/workflows/rss.yml. Daily (0 0 * * *) is the default. Hourly or */15 if you want faster; */5 works on public repos (free Actions minutes). Anything sub-5-min breaks the GitHub Actions floor.
.github/workflows/rss.yml references echohello-dev/feedhub@main. For production, replace @main with a tag or commit SHA so feedhub updates don't break this consumer silently.