Watcher
2026 · mhmudsaed/hermes-watcher
Checks six job boards every morning, skips anything it has already seen, and sends one short Telegram digest with whatever is new and worth reading.
Built and verified · recorded run, offline test suite, and full source below.
The problem
Checking a handful of job boards by hand every morning takes real time, and everything blurs together. What I wanted was not more listings but fewer: one message a day containing only the things worth reading, with anything I've already seen filtered out.
Pipeline architecture
The watcher runs on a schedule on my home server. Each cycle it pulls the public feeds (RemoteOK's API, We Work Remotely's RSS, Hacker News' Who's Hiring thread, Remotive, Arbeitnow, and Akhtaboot for Jordan), scores each entry against a short list of what I'm looking for, and appends new finds to a local SQLite database keyed by URL. Whatever is new and scores well goes into a single Telegram message the next morning.
Recorded run
Recorded live in a real terminal: the offline test suite, then ./scripts/demo.sh — one full fetch → score → digest cycle, then a rerun that correctly reports nothing new. No credentials, no network.



Key decisions
Public feeds instead of scraping
Every source it watches has a public API or RSS feed, so there is no login, no fragile HTML parsing, and nothing that breaks when a site redesigns. Sources that do require a session are handled separately as a weekly browser job rather than daily scraping.
It only does work when something changed
Each feed's content is hashed, and the scoring step only runs when a hash differs from the last cycle. Quiet days cost a couple of HTTP requests and nothing else.
A database, not a chat history
Every listing ever seen is stored locally with its URL as a unique key, so re-running the watcher can never re-report an old job. The Telegram message is just a view over that table.
Guardrails
- It only reads. Nothing is ever applied to, clicked, or submitted.
- Feeds are polled on a slow human-paced schedule, not hammered.
- A dead feed is skipped and noted; it never blocks the digest.
Verification
Targets thirty minutes of manual board-checking saved each morning. The recorded run verifies the mechanics — 14 listings collected, 3 pass the filter, a rerun reports zero new — with the daily time saving to be measured over a real month of runs.