A local-first job watchlist that scrapes career pages, scores fit against your profile, and helps you track what to apply to.
Finding relevant job openings across multiple company career pages is time-consuming. Job Scout:
- Monitors - Scrapes company career pages on your schedule
- Scores - Ranks jobs against your backend-focused profile
- Tracks - Keep only openings worth acting on
- Next.js 16 - Web framework
- React 19 - UI library
- TypeScript - Type safety
- SQLite - Local persistence via
node:sqlite - Python/Scrapling - Page fetching bridge for bot detection bypass
Job Scout auto-detects and scrapes from:
| Platform | Source Type | Detection |
|---|---|---|
| Ashby | ashby |
jobs.ashbyhq.com/* |
| Greenhouse | greenhouse |
boards.greenhouse.io/* |
| Lever | lever |
jobs.lever.co/* or jobs.eu.lever.co/* |
| Workable | workable |
apply.workable.com/* |
| Rippling | rippling |
ats.rippling.com/*/jobs |
| Perk (Storyblok) | perk-storyblok |
perk.com/careers |
| Vinted Careers | vinted-careers |
careers.vinted.com |
| Preply Careers | preply-careers |
preply.com/*/careers |
For non-auto-detected platforms, you can manually specify the source type when adding a source.
npm installEnsure Python 3 is available (required for the page fetching bridge).
# Development server
npm run dev
# Open http://localhost:3010# Scrape all configured sources
npm run scrape
# Add new sources via the web UI
# URL format: https://jobs.lever.co/companyname
# The app auto-detects the ATS platform from the URL- Add sources - Enter company career page URLs; the app detects the ATS type
- Scrape - Fetch jobs from each source's API or HTML
- Score - Each job is scored based on keywords in title/description
- Review - Jobs are bucketed by score band:
strong,review,reject - Track - Move jobs through states:
new→saved→applied→rejected
Jobs are scored from 0-100 based on:
- Platform/backend keywords (+10)
- API/distributed/services keywords (+8)
- Seniority match (+5)
- Remote-friendly indicators (+3)
Negative signals:
- Non-software departments (-10)
- Wrong seniority level (-8)
Note: This scoring is tuned for a backend-focused profile. Feel free to customize
lib/scoring.tsto match your own preferences and target roles.
The app is intentionally local-only. For periodic scraping:
- Linux:
cronor systemd user timer - macOS:
launchd - Windows: Task Scheduler
├── app/ # Next.js pages and components
├── lib/
│ ├── db.ts # SQLite setup and schema
│ ├── repository.ts # Data access layer
│ ├── scraper.ts # Main scraping orchestrator
│ ├── sources/ # ATS-specific parsers
│ └── types.ts # TypeScript definitions
├── scripts/
│ └── scrape.ts # CLI entry point
│ └── scrape_page.py # Python page fetcher
└── public/ # Static assets
- Add the source type to
lib/types.ts:SourceType - Create a parser in
lib/sources/<platform>.tsexportingparseXxxJobs - Add the case in
lib/scraper.ts:scrapeSource() - Add URL detection in
lib/source-detection.ts - Add tests in
lib/sources/<platform>.test.ts
MIT
This tool is for personal job tracking purposes. When scraping career pages:
- Respect website terms of service and robots.txt directives
- Use reasonable request rates to avoid overloading servers
- Don't use scraped data for spam, unsolicited outreach, or any prohibited purposes
The author is not responsible for how others use this project. Use responsibly.