Phone notification within minutes of a hardware internship posting. Runs free on GitHub Actions (and optionally a Cloudflare Worker).
Sources (all public JSON): curated company boards (Greenhouse/Lever/Ashby),
the listings.json behind SimplifyJobs-style repos, markdown/atom scrapes, and
Workday (NVIDIA, Micron, ADI, KLA). Each source has a policy that decides how
hard it's filtered - curated boards skip the keyword gate ("Engineering Intern"
at a hand-picked company is wanted); bulk/aggregator sources require keywords.
Every role is filtered (season, geography, seniority, defense), then scored hardware-first (hardware +4, robotics-software/perception/CV +3, wrong-skill -2) and split into two tiers:
- Tier A - score >= 3, US, Summer-2027-eligible -> instant ntfy push.
- Tier B - everything else that survives -> low-priority, batched hourly (1-3 roles arrive individually so each keeps its apply link; 4+ as one list).
Two runners: a Cloudflare Worker polls curated boards every minute (instant),
and GitHub Actions runs watch.py every ~5 min over the aggregators + Workday
(with description enrichment and scoring). Delivery is ntfy
(free app, no account). Dropped roles are logged; a weekly digest samples them.
- Fork this repo. Keep it public so Actions minutes stay free.
- Add a repo secret
NTFY_TOPIC(Settings, Secrets and variables, Actions). Pick something unguessable, e.g.vigil-3f9a2c8b. - Actions tab, enable workflows, Run workflow. The first run seeds silently (records what is already posted, alerts on nothing).
- Install the ntfy app and subscribe to your topic.
Laptop can be off. Alerts keep coming.
cd cloudflare
npx wrangler login
powershell -ExecutionPolicy Bypass -File .\deploy.ps1
This deploys the worker and sets a SKIP_ATS repo variable so Actions and the
worker never alert the same role twice.
Edit config.json, or put personal changes in config.local.json (gitignored,
so your topic and filters stay out of the repo):
greenhouse,lever,ashby,workday: company boards. Add your targets.scoring:[weight, regex]rows - the hardware-vs-software ranking lives here.season_drop_terms/season_a_terms: what counts as off-season vs Tier-A-eligible.include_keywords,exclude_keywords,exclude_companies: regex filters.tagged_subregex: pulls robotics-software out of the AI/ML and Software buckets.
Tools: python watch.py --dry (per-source/per-tier table, sends nothing) and
python watch.py --explain <job-id> (full decision trace for one role). Changing
any filter auto-forces a silent reseed, so widening never floods you with backfill.
MIT.