A no-nonsense job search tool that finds listings across multiple sites and scores them against your CV using AI.
3
stars
15
commits
Python
primary language
Sep 6, 2026
updated
Self-hosted job search that scores every listing against your CV — AI optional. Paste your CV and a few keywords, hit Start, and it searches multiple job sites and ranks results 0-10 by how well they actually match you, instead of you skimming ten tabs every morning.
Built it for myself while job hunting. It found the job. Now I'm making it good enough for other people to use too.

docker compose up --build and you have a dashboard, a REST API, and a database. No local Python setup, no dependency hell.
You need Docker. That's it.
cp .env.example .env
Edit .env and drop in any AI keys you have (Groq, Anthropic, or Gemini). If you don't have any, Lite Mode works fine with keyword matching.
docker compose up --build
This builds two containers:
http://localhost:8000 (the brain)http://localhost:8501 (your dashboard)The optional n8n automation engine lives under a separate profile if you want it later:
docker compose --profile automation up
Go to http://localhost:8501, paste your CV, add some keywords like "senior python remote", pick your AI provider (or stay in Lite Mode), and hit Start. Watch the progress bar fill up. High-scoring jobs bubble to the top.
curl http://localhost:8000/export/csv > jobs.csv
This app is designed to run inside Docker containers on a Linux VM. Do not try to run it natively on Windows or macOS. The scraper uses Playwright, the UI needs Streamlit, and the database expects a Unix path structure. Docker handles all of that for you.
Requirements:
| Variable | What it does | Default |
|---|---|---|
GROQ_API_KEY | Groq AI scoring | empty |
ANTHROPIC_API_KEY | Claude AI scoring | empty |
GEMINI_API_KEY | Google AI scoring | empty |
DATA_DIR | Where SQLite and logs live | ./data |
REQUEST_DELAY_SECONDS | Politeness between searches | 2.0 |
RETRY_MAX_ATTEMPTS | How many times to retry a failed search | 5 |
MIN_SCORE_NOTIFY | Minimum score (0-10) to trigger a notification | 7 |
NOTIFICATION_WEBHOOK | Webhook URL for high-score job alerts | empty |
EMAIL_HOST / EMAIL_PORT / EMAIL_USER / EMAIL_PASS / EMAIL_TO | SMTP settings for email alerts | empty |
The scraper exposes a FastAPI server. The UI talks to it, but you can too.
Start a run:
curl -X POST http://localhost:8000/run \
-H "Content-Type: application/json" \
-d '{"provider":"groq","lite_mode":true,"sites":["example.com"],"keywords":["python"],"cv_text":"developer"}'
Check status:
curl http://localhost:8000/status
Pause a running job:
curl -X POST http://localhost:8000/pause
Resume:
curl -X POST http://localhost:8000/resume
Kill it:
curl -X POST http://localhost:8000/stop
make build
make up
make down
make logs
Never commit .env. It is gitignored by default. If you accidentally pushed a key, rotate it immediately.
Issues and PRs are welcome — see CONTRIBUTING.md. If you're using this and hit something, opening an issue is the single most useful thing you can do; this is a solo project so far and every report helps.
If you find it useful, a star helps other people find it too.
15 commits
Python
98.2%
A no-nonsense job search tool that finds listings across multiple sites and scores them against your CV using AI.
3
stars
15
commits
Python
primary language
Sep 6, 2026
updated
Self-hosted job search that scores every listing against your CV — AI optional. Paste your CV and a few keywords, hit Start, and it searches multiple job sites and ranks results 0-10 by how well they actually match you, instead of you skimming ten tabs every morning.
Built it for myself while job hunting. It found the job. Now I'm making it good enough for other people to use too.

docker compose up --build and you have a dashboard, a REST API, and a database. No local Python setup, no dependency hell.
You need Docker. That's it.
cp .env.example .env
Edit .env and drop in any AI keys you have (Groq, Anthropic, or Gemini). If you don't have any, Lite Mode works fine with keyword matching.
docker compose up --build
This builds two containers:
http://localhost:8000 (the brain)http://localhost:8501 (your dashboard)The optional n8n automation engine lives under a separate profile if you want it later:
docker compose --profile automation up
Go to http://localhost:8501, paste your CV, add some keywords like "senior python remote", pick your AI provider (or stay in Lite Mode), and hit Start. Watch the progress bar fill up. High-scoring jobs bubble to the top.
curl http://localhost:8000/export/csv > jobs.csv
This app is designed to run inside Docker containers on a Linux VM. Do not try to run it natively on Windows or macOS. The scraper uses Playwright, the UI needs Streamlit, and the database expects a Unix path structure. Docker handles all of that for you.
Requirements:
| Variable | What it does | Default |
|---|---|---|
GROQ_API_KEY | Groq AI scoring | empty |
ANTHROPIC_API_KEY | Claude AI scoring | empty |
GEMINI_API_KEY | Google AI scoring | empty |
DATA_DIR | Where SQLite and logs live | ./data |
REQUEST_DELAY_SECONDS | Politeness between searches | 2.0 |
RETRY_MAX_ATTEMPTS | How many times to retry a failed search | 5 |
MIN_SCORE_NOTIFY | Minimum score (0-10) to trigger a notification | 7 |
NOTIFICATION_WEBHOOK | Webhook URL for high-score job alerts | empty |
EMAIL_HOST / EMAIL_PORT / EMAIL_USER / EMAIL_PASS / EMAIL_TO | SMTP settings for email alerts | empty |
The scraper exposes a FastAPI server. The UI talks to it, but you can too.
Start a run:
curl -X POST http://localhost:8000/run \
-H "Content-Type: application/json" \
-d '{"provider":"groq","lite_mode":true,"sites":["example.com"],"keywords":["python"],"cv_text":"developer"}'
Check status:
curl http://localhost:8000/status
Pause a running job:
curl -X POST http://localhost:8000/pause
Resume:
curl -X POST http://localhost:8000/resume
Kill it:
curl -X POST http://localhost:8000/stop
make build
make up
make down
make logs
Never commit .env. It is gitignored by default. If you accidentally pushed a key, rotate it immediately.
Issues and PRs are welcome — see CONTRIBUTING.md. If you're using this and hit something, opening an issue is the single most useful thing you can do; this is a solo project so far and every report helps.
If you find it useful, a star helps other people find it too.
15 commits
Python
98.2%