website/docs/user-guide/skills/optional/devops/devops-watchers.md
Poll RSS, JSON APIs, and GitHub with watermark dedup.
| Source | Optional — install with hermes skills install official/devops/watchers |
| Path | optional-skills/devops/watchers |
| Version | 1.0.0 |
| Author | Hermes Agent |
| License | MIT |
| Platforms | linux, macos |
| Tags | cron, polling, rss, github, http, automation, monitoring |
:::info The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active. :::
Poll external sources on an interval and react only to new items. Three ready-made scripts plus a shared watermark helper; wire them into a cron job (or run them ad-hoc from the terminal).
A watcher is just a script that:
The scripts below handle all three. The agent runs them via the terminal tool — from a cron job, a webhook, or an interactive chat — and reports what's new.
All three live in $HERMES_HOME/skills/devops/watchers/scripts/ once the skill is installed. Each reads WATCHER_STATE_DIR (defaults to $HERMES_HOME/watcher-state/) for its state file, keyed by the --name argument.
| Script | What it watches | Dedup key |
|---|---|---|
watch_rss.py | RSS 2.0 or Atom feed URL | <guid> / <id> |
watch_http_json.py | Any JSON endpoint returning a list of objects | Configurable id field |
watch_github.py | GitHub issues / pulls / releases / commits for a repo | id / sha |
All three:
## <title>\n<url>\n\n<optional body> per itemRun a watcher directly from the terminal tool:
python $HERMES_HOME/skills/devops/watchers/scripts/watch_rss.py \
--name hn --url https://news.ycombinator.com/rss --max 5
Watch a GitHub repo (set GITHUB_TOKEN in ~/.hermes/.env to avoid the 60 req/hr anonymous rate limit):
python $HERMES_HOME/skills/devops/watchers/scripts/watch_github.py \
--name hermes-issues --repo NousResearch/hermes-agent --scope issues
Poll an arbitrary JSON API:
python $HERMES_HOME/skills/devops/watchers/scripts/watch_http_json.py \
--name api --url https://api.example.com/events \
--id-field event_id --items-path data.events
Ask the agent to schedule a cron job with a prompt like:
Every 15 minutes, run
watch_rss.py --name hn --url https://news.ycombinator.com/rss. If it prints anything, summarize the headlines and deliver them. If it prints nothing, stay silent.
The agent invokes the script via the terminal tool inside the cron job's agent loop; no changes to cron's built-in --script flag are needed.
Every watcher writes $HERMES_HOME/watcher-state/<name>.json. Inspect:
cat $HERMES_HOME/watcher-state/hn.json
Force a replay (next run treated as first poll):
rm $HERMES_HOME/watcher-state/hn.json
All three scripts use the same template: load watermark, fetch, diff, save, emit. scripts/_watermark.py is the shared helper; import it to get atomic writes + bounded ID set + first-run baseline for free. See any of the three reference scripts for how little boilerplate it takes.
--prime-with-latest N flag in your own script.$HERMES_HOME/watcher-state/ is always writable. Docker/Modal backends may not see arbitrary host paths.