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. Currently:
- OpenRouter - New Models — every new model added to openrouter.ai/models. Posts to a Discord channel via the
DISCORD_WEBHOOK_OPENROUTERsecret.
.github/workflows/rss.yml calls the feedhub composite action daily. The worker diffs the feed against state.json, posts new items, 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 webhook"]
py -->|"commits"| st["state.json"]
This repo is private. The webhook URL is stored as a GitHub Actions secret (DISCORD_WEBHOOK_OPENROUTER) — never in a file. To set it:
gh secret set DISCORD_WEBHOOK_OPENROUTER --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.
- Add an entry to
feeds.json(see the template's examples for the schema). - Add the corresponding webhook secret —
gh secret set DISCORD_WEBHOOK_<NAME> --repo echohello-dev/feeds. - Add a matching job
envline in.github/workflows/rss.yml. - Push. Next workflow run picks it up.
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.