Skip to content

omar-dulaimi/job-scout

Repository files navigation

Job Scout

A local-first job watchlist that scrapes career pages, scores fit against your profile, and helps you track what to apply to.

Why Job Scout?

Finding relevant job openings across multiple company career pages is time-consuming. Job Scout:

  1. Monitors - Scrapes company career pages on your schedule
  2. Scores - Ranks jobs against your backend-focused profile
  3. Tracks - Keep only openings worth acting on

Stack

  • 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

Supported ATS Platforms

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.

Installation

npm install

Ensure Python 3 is available (required for the page fetching bridge).

Running

# Development server
npm run dev

# Open http://localhost:3010

Running the Scraper

# 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

How It Works

  1. Add sources - Enter company career page URLs; the app detects the ATS type
  2. Scrape - Fetch jobs from each source's API or HTML
  3. Score - Each job is scored based on keywords in title/description
  4. Review - Jobs are bucketed by score band: strong, review, reject
  5. Track - Move jobs through states: newsavedappliedrejected

Scoring System

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.ts to match your own preferences and target roles.

Local Scheduling

The app is intentionally local-only. For periodic scraping:

  • Linux: cron or systemd user timer
  • macOS: launchd
  • Windows: Task Scheduler

Project Structure

├── 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

Adding a New ATS Source

  1. Add the source type to lib/types.ts:SourceType
  2. Create a parser in lib/sources/<platform>.ts exporting parseXxxJobs
  3. Add the case in lib/scraper.ts:scrapeSource()
  4. Add URL detection in lib/source-detection.ts
  5. Add tests in lib/sources/<platform>.test.ts

License

MIT

Disclaimer

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.

About

Local-first job watchlist that scrapes career pages and scores fit against your profile

Topics

Resources

Stars

Watchers

Forks

Contributors