All work
Built
PythonSQLiteTelegramcron

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.

pytest — 27 passed offline
pytest — 27 passed offline
The rendered digest (MarkdownV2 for Telegram)
The rendered digest (MarkdownV2 for Telegram)
Feed hashes and database stats from the same run
Feed hashes and database stats from the same run

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.