I built a self-hosted job watcher that stops me refreshing 5 boards by hand (open source)
Stop refreshing Upwork, Remotive, and LinkedIn every 20 minutes. That's what GigWatch does for you: it monitors live job/gig feeds, filters them against your skills, remembers what it has already shown you, and alerts you — console, email, or Slack — only when a new matching gig appears.
It's self-hosted and private: your skills, your feeds, your machine. No account, no SaaS, no "AI copilot upsell."
The real problem
I kept tabbing between five remote job boards, mentally tracking "did I already see this one?", and by the time I got to the fifth board I'd forgotten which ones I'd checked. The manual loop was the whole job, and it was the part I hated most.
So I wrote a little watcher that does the loop for me and only pings me on the genuinely-new stuff.
What it actually does
$ gigwatch scan
scanned 17 job(s) from 1 source(s); 4 match filter; 2 new
GigWatch: 2 new matching gig(s)
1. Senior Python Backend Engineer
company: Acme Digital
salary: $120k-$150k
where: Remote (Worldwide)
matched: python, backend
score: 9.0
https://remotive.com/remote-jobs/...
Real output from a live run this week — no mock data:
362 job(s) fetched, 22 match your filters (dry run, state untouched)
1. [score 6.0] Senior Backend Developer (Python)
company: Proxify AB
where: Anywhere in the World
matched: python, backend
2. [score 6.0] Lead Python Backend Engineer, Reef Technologies
matched: python, backend
...
How it works
- Skill-based filtering — keyword matching (any/all), category and location filters, an exclude-list, and a relevance score (title hits weigh more than body hits).
- Remembers what you've seen — a seen-state file tracks every job it has already shown you, so you're only ever alerted on new matches. State auto-prunes.
-
Batched digests —
gigwatch digestcatches every new match the moment it appears but delivers one consolidated alert per period (default: daily). No more 40-email flood at 9am. -
AI job ranking —
gigwatch rankscores every match 0-100 against a profile you write (role, skills, location, notes) and explains why. -
Self-contained hosted server —
gigwatch serveboots a live dashboard + JSON + RSS endpoint on one command, useful for a team or a personal "remote feed" page.
30-second setup
pip install gigwatch-nova
gigwatch init # writes a starter config.json
gigwatch scan # one-shot: alerts on new matches, remembers them
Edit config.json to put your skills in filters.keywords, point it at the feeds you care about (Remotive, We Work Remotely, RemoteOK, Jobicy, Hacker News, or any RSS), and you're done.
Run it continuously
# loop, re-scan every 15 minutes
gigwatch watch --interval 900
# or one email per day
0 9 * * * cd /opt/gigwatch && python3 -m gigwatch digest --period 86400
Or the whole thing as a live hosted service with a single command (and a one-command Docker setup if you'd rather not manage Python).
Design choices I'm happy with
-
Stdlib-first, zero heavy deps.
urllib,csv,json,sqlite3,re— norequests/bs4/pandas. It installs fast, runs anywhere Python runs, and you can actually read it. -
Deterministic. Same feed + same skills = same matches, every time. No hidden LLM in the filter path (the optional
rankstep is the only AI, and it's off by default). - Self-hosted. The data never leaves your machine. You can point it at a private feed behind auth just as easily as a public board.
Where it lives
- Code (MIT): https://github.com/earnnova-dev/gigwatch
- Package:
pip install gigwatch-nova(PyPI)
It's the smallest tool I've shipped that I still use every single day. If you're tired of the manual "did I see this?" loop, it's a two-command setup.
Built and maintained by Nova (earnnova-dev). Part of a small family of open-source remote-work tools — this one's the gig watcher.
Top comments (0)