Skip to content

Self-hosted job search automation: scrape multiple boards, de-dupe, score to your prefs, and alert you—private by default; runs locally for free or ~$5/mo in your own private cloud.

License

Notifications You must be signed in to change notification settings

cboyd0319/JobSentinel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
JobSentinel Logo

JobSentinel

Private job alerts on your machine

Local-first job search automation • Smart scoring • Zero tracking • $0 forever

License Python Version React

CI/CD Coverage codecov CodeQL Scorecard

QuickstartFeaturesDocumentationWiki


What is JobSentinel?

The problem: Job boards are noisy, privacy-invasive, and require manual filtering. Paid services charge monthly fees ($30-100/mo), sell your data, and still miss the best opportunities.

The solution: JobSentinel runs 100% locally on your machine. It scrapes top job boards, scores matches against your preferences, and sends high-value alerts (80+ score) to Slack or email—all while keeping your data private. No tracking. No subscriptions. $0 forever.

Who is this for?

  • Job seekers who value privacy and want automated alerts for high-match roles
  • Passive candidates monitoring the market without broadcasting availability
  • Recruiters tracking positions for clients (GDPR/HIPAA compliant)
  • Developers who want local-first automation without cloud dependencies

What's New

  • React 19 + Vite 7 modern web UI with real-time updates
  • Platform installers one-click setup for Windows and macOS
  • WCAG 2.1 AA accessibility compliance
  • Resume analyzer AI-powered job-resume matching
  • Application tracker manage your job search pipeline
  • Dark mode eye-friendly interface

Quickstart

Option 1: Windows (One-Click Install)

  1. Download: https://github.com/cboyd0319/JobSentinel/archive/refs/heads/main.zip
  2. Extract to Desktop
  3. Double-click: deploy/local/windows/launch-gui.bat

Done! A GUI opens. Click "Start JobSentinel" and view logs in the interface.

Option 2: macOS (5-Minute Wizard)

  1. Download: https://github.com/cboyd0319/JobSentinel/archive/refs/heads/main.zip
  2. Extract to Desktop
  3. Double-click: deploy/local/macos/setup-macos.sh
    • If blocked: Right-click → Open → Open

Follow the interactive wizard to configure your preferences.

Option 3: Linux/Command Line

# Clone repository
git clone https://github.com/cboyd0319/JobSentinel
cd JobSentinel

# Create virtual environment
python3 -m venv .venv && source .venv/bin/activate

# Install dependencies
pip install -e .
playwright install chromium

# Configure preferences
cp deploy/common/config/user_prefs.example.json deploy/common/config/user_prefs.json
# Edit config with your keywords, locations, salary, etc.

# Run single scan
python -m jsa.cli run-once

# Or start daemon (every 2 hours)
python -m jsa.cli run-daemon --interval 7200

# Or launch web UI
python -m jsa.cli web --port 8000
# Open: http://localhost:8000

First time using a terminal?Quickstart Guide


How It Works

graph LR
    A[Job Boards] -->|Scrape| B[JobSentinel]
    B -->|Score| C[Matcher Engine]
    C -->|80+ score| D[Alerts]
    C -->|All jobs| E[SQLite DB]
    D -->|Slack/Email| F[You]

    style A fill:#43A047
    style C fill:#1976D2
    style D fill:#F57C00
    style F fill:#E91E63
Loading

Workflow

  1. Scrape - Pull jobs from Greenhouse, Lever, Reed, JobsWithGPT, JobSpy
  2. Normalize - Convert to standard format (source, title, company, location, salary, URL)
  3. Score - Match against preferences (skills 40%, salary 25%, location 20%, company 10%, recency 5%)
  4. Alert - Send high matches (80+ score) via Slack/email
  5. Store - Save to local SQLite database (data/jobs.sqlite)

Privacy-first: All data stays on your machine. No telemetry. No external API calls (except job board scraping).


Features

Job Scraping

  • Multiple sources: Greenhouse, Lever, Reed, JobsWithGPT, JobSpy
  • Auto-detection of job board types
  • Rate limiting respects robots.txt
  • Deduplication across sources
  • Incremental updates (only fetch new jobs)

Smart Scoring

  • Multi-factor scoring:
    • Skills match: 40%
    • Salary range: 25%
    • Location: 20%
    • Company preferences: 10%
    • Recency: 5%
  • Keyword matching (weighted by importance)
  • Deny list (exclude companies/titles)
  • Salary filtering (min/max ranges)

Web UI (NEW)

  • Dashboard with job statistics
  • Search & filter by source, date, score
  • Application tracker manage pipeline
  • Resume analyzer AI-powered matching
  • Real-time updates via WebSocket
  • Dark mode support
  • WCAG 2.1 AA accessibility

Alerts & Notifications

  • Slack integration (incoming webhooks)
  • Email notifications (SMTP)
  • Threshold filtering (only high scores)
  • Batching (daily/weekly digests)
  • Rich formatting (job details, links, scores)

Data Storage

  • SQLite database (~50MB per 1000 jobs)
  • Full job history (never lose opportunities)
  • Search queries saved for re-runs
  • Export to CSV for analysis
  • Privacy-first (local-only, no cloud)

Security & Privacy

  • Local-first - All data on your machine
  • No telemetry - Zero tracking
  • OWASP ASVS Level 2 compliant (17 controls)
  • Secrets in .env - Never hardcoded
  • Read-only scrapers - Don't post to job boards
  • Input validation - All external data validated

Platform Support

  • Windows 11+ (one-click installer)
  • macOS 15+ (interactive wizard)
  • Linux (Ubuntu, Debian, Fedora)
  • Docker (containerized deployment)
  • Python 3.12+ required

Installation

Prerequisites

Tool Version Purpose Required
Python ≥ 3.12 Runtime (includes SQLite) Yes
Git any Clone repository (or download ZIP) No
Disk Space 1GB App + ML models + job data Yes
Slack Webhook N/A Alerts (optional) No
Reed API Key N/A UK jobs (optional) No

Installation Guide

See Quickstart Guide for detailed instructions.


Configuration

Edit deploy/common/config/user_prefs.json:

{
  "keywords": ["python", "backend", "api"],
  "locations": ["Remote", "San Francisco"],
  "min_salary": 120000,
  "denied_companies": ["Meta", "Amazon"],
  "job_sources": {
    "jobswithgpt": {"enabled": true},
    "reed": {"enabled": false, "api_key": ""}
  },
  "alerts": {
    "slack": {
      "enabled": false,
      "webhook_url": ""
    },
    "email": {
      "enabled": false,
      "smtp_host": "smtp.gmail.com",
      "smtp_port": 587,
      "from_email": "",
      "password": ""
    }
  }
}

Key Configuration Options

Key Type Default Example
keywords list[str] [] ["python", "backend"]
locations list[str] [] ["Remote", "SF"]
min_salary int 0 120000
denied_companies list[str] [] ["Meta", "Amazon"]

Validate config:

python -m jsa.cli config-validate

Usage

Command Line

# Single scan
python -m jsa.cli run-once

# Daemon (every 2 hours)
python -m jsa.cli run-daemon --interval 7200

# Web UI
python -m jsa.cli web --port 8000

# Health check
python -m jsa.cli health

Web UI

  1. Start web server: python -m jsa.cli web --port 8000
  2. Open browser: http://localhost:8000

Features:

  • Dashboard with job statistics
  • Search and filter jobs
  • Application tracker
  • Resume analyzer (AI-powered)
  • Real-time updates (WebSocket)
  • Dark mode support
  • WCAG 2.1 AA accessibility

Troubleshooting

Top 5 Issues

Error: Python not found

Cause: Python 3.12+ not installed

Fix:

# Check version
python --version  # Need 3.12+

# Install:
# Windows: python.org
# macOS: brew install python@3.12
# Linux: apt install python3.12
Error: Config not found

Cause: Missing user_prefs.json

Fix:

cp deploy/common/config/user_prefs.example.json deploy/common/config/user_prefs.json
No jobs found

Cause: Keywords too specific, salary too high, or sources disabled

Fix:

  • Broaden keywords (e.g., "engineer" instead of "senior staff principal engineer")
  • Lower minimum salary threshold
  • Check enabled sources: python -m jsa.cli config-validate
Slack alerts not working

Cause: Invalid webhook URL or Slack app misconfigured

Fix:

# Test webhook
curl -X POST "YOUR_WEBHOOK" \
  -H "Content-Type: application/json" \
  -d '{"text":"Test"}'

# Verify webhook in config
cat deploy/common/config/user_prefs.json | grep webhook_url
Database locked error

Cause: Multiple JobSentinel processes running

Fix:

# Find and kill processes
ps aux | grep jobsentinel
kill <PID>

# Or restart system

More help: Troubleshooting GuideGitHub Discussions


Performance

Expected performance:

  • Scrape time: 30–60s per source
  • Scoring: <5s per 100 jobs
  • Alert latency: <10s (Slack/email)
  • Memory usage: <500MB (includes ML models)
  • Disk usage: ~50MB per 1000 jobs
  • Database: SQLite (<100MB typical)

Tested with: 10,000+ jobs in SQLite without performance degradation.


Roadmap

v0.9.0 (Current)

  • React 19 + Vite 7 UI
  • Consolidated documentation
  • Platform installers (Windows/macOS)
  • WCAG 2.1 AA accessibility

v1.0 (Q1 2026)

  • GPT-4 integration (optional, cost-controlled)
  • Multi-language support
  • Browser extension
  • Mobile companion app

See AI/ML Roadmap for AI/ML features.


Documentation

Getting Started

Architecture & Design

Operations


Contributing

Contributions welcome! See CONTRIBUTING.md.

Before submitting:

  • Tests pass: make test
  • Lint passes: make lint
  • Type check passes: make type
  • Coverage ≥85%: make cov
  • No secrets committed

Quick start for developers:

git clone https://github.com/cboyd0319/JobSentinel
cd JobSentinel
make dev  # Install dev dependencies
make test  # Run tests

License

MIT License - See LICENSE for full text.

✅ Commercial use allowed
✅ Modification allowed
✅ Distribution allowed
✅ Private use allowed
📋 License and copyright notice required

TL;DR: Use it however you want. Just include the license.

Learn more: https://choosealicense.com/licenses/mit/


Support & Community

Need help?

Resources:

Support Policy

This is a single-developer, personal project. Support is best-effort with no SLAs. Security issues are prioritized; feature requests and questions are handled as time allows.


⭐ Spread the Word

If JobSentinel helps you find your next opportunity, give us a star

Star History

Active DevelopmentPrivacy-FirstCommunity-Driven

Made with ❤️ for job seekers who value privacy

⬆ Back to top

About

Self-hosted job search automation: scrape multiple boards, de-dupe, score to your prefs, and alert you—private by default; runs locally for free or ~$5/mo in your own private cloud.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Sponsor this project

Contributors 5