JobHunter 🎯
AI-Powered, Highly Concurrent, Zero-Database Automated Job Hunting Pipeline
JobHunter is a robust, production-grade Python CLI application designed to fully automate the job search and filtering lifecycle. It continuously scrapes Applicant Tracking Systems (ATS) and job boards, filters opportunities against precise regex and keyword criteria, evaluates candidate-job fit using Large Language Models (LLMs) with strict JSON schemas, and dispatches rich real-time alerts directly to Telegram.
🚀 Key Features
- High Concurrency & Rate Limiting: Powered by
concurrent.futureswith dynamic worker bounds, exponential backoff retries on transient network errors, and intelligent request pacing. - ATS WAF & API Bypass: Bypasses heavy frontend anti-bot walls by querying official public underlying JSON/XML board APIs directly (Greenhouse, Lever, Personio, Workable, Recruitee, Ashby, plus aggregators like Remotive, RemoteOK, and Arbeitnow).
- Multi-Stage Filtering: Filters jobs through regex word-boundary matching for titles, excluded companies, location rules, remote requirements, posting age, and minimum tech stack keyword hits (
stack_hits). - AI-Driven Evaluation: Evaluates shortlisted candidates against your exact CV (
config/cv.md) and preferences (config/preferences.md) using OpenAI-compatible LLMs, enforcing hard gates, scoring rubrics, and anti-hallucination guardrails. - Telegram Rich Alerts: Dispatches beautifully formatted HTML notifications featuring VIP priority badges, score color-coding, AI reasoning, score breakdowns, professional pitches, and direct links.
- Autonomous Maintenance Tools: Includes built-in CLI commands to automatically discover new company career boards via DuckDuckGo and prune dead or broken board URLs.
- Zero-Database State Management: Uses atomic file writes with file locking (
filelock) and a rolling 90-day retention cache (seen.json) to prevent duplicate processing without requiring an external database.
🛠️ Quickstart Guide
Prerequisites
- Python >= 3.14
- uv (recommended Python package and project manager)
1. Install
Install the CLI globally via PyPI using uv (recommended) or pip:
uv tool install jobhunter-cli
# OR
pip install jobhunter-cli
2. Initialize Your Workspace
Create a dedicated folder for your job search and run the init command to automatically download the configuration templates:
mkdir my-job-search && cd my-job-search
jobhunter init
3. Configure
The init command creates a .env file and a config/ directory.
- Open
.envand add your API keys:TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here TELEGRAM_CHAT_ID=your_telegram_chat_id_here LLM_API_KEY=your_openai_or_compatible_api_key_here
- Edit the templates in the
config/folder (config.json,cv.md,preferences.md) with your specific details.
💡 Note on GitHub Actions:
JobHunterautomatically falls back to environment variables (CONFIG_JSON,CV,PREFERENCES) if physical files do not exist on disk. This allows deploying via GitHub Actions on public repositories using GitHub Secrets.
4. Run the Pipeline
Execute the full pipeline (Fetch -> Evaluate -> Send) from within your workspace directory:
jobhunter run
🔄 The 5-Stage Pipeline
[Discover / Configure] ──> [Fetch & Filter] ──> [AI Evaluate] ──> [Send to Telegram] ──> [State Purge & Seen Sync]
- Discover / Configure: Resolve targets from
config.jsonor discover new company boards usingjobhunter discover. - Fetch: Scrape raw job postings concurrently across configured ATS boards and aggregators.
- Filter & Prune: Discard duplicates, previously seen jobs, and postings failing title, location, age, or stack keyword criteria. Rank candidates by VIP priority and stack keyword hits.
- Evaluate: Submit shortlisted candidates to the LLM. Enforce hard gates and score against your CV and preferences.
- Send & Purge: Dispatch passing job alerts to Telegram. Log processed jobs to
seen.jsonwith a 90-day retention window and purge completed items from active state files.
📖 Documentation Deep Dives
For comprehensive technical documentation, consult the downloaded docs/ folder or view them on GitHub:
- Architecture Guide: Detailed breakdown of the decoupled pipeline modules, concurrency model, and zero-database state lifecycle.
- Configuration & Settings: Comprehensive guide to
config.json, Pydantic settings, environment variables, and prompt engineering setup (cv.md/preferences.md).
💻 CLI Commands Reference
| Command | Description | Key Options |
|---|---|---|
jobhunter init |
Scaffolds a new workspace by downloading templates and docs | [TARGET_DIR] (Target directory to initialize) |
jobhunter run |
Runs the full pipeline (fetch -> evaluate -> send) | -s, --source (Specific ATS/aggregator to fetch from)--no-aggregators (Skip aggregators)--ignore-seen (Ignore seen cache)-l, --limit (Override max candidates)--dry-run (Alert without cache updates) |
jobhunter fetch |
Scrapes and filters jobs from configured boards | -s, --source, --no-aggregators, --ignore-seen, -l, --limit |
jobhunter evaluate |
Scores and evaluates pending candidates using AI | -j, --job (Evaluate specific job UID), -l, --limit |
jobhunter send |
Dispatches passing job evaluations to Telegram | --dry-run |
jobhunter discover |
Discovers new company ATS slugs via DuckDuckGo | -w, --write (Persist to config), -s, --source, -t, --titles (Comma-separated titles) |
jobhunter prune |
Validates and prunes broken company slugs from config | -w, --write, -s, --source |
jobhunter prompt |
Prints the compiled AI evaluation system prompt | None |
🏗️ Building from Source (Development)
If you want to contribute or modify the source code directly:
git clone https://github.com/ziad-aboughaleb/job-hunter.git
cd job-hunter
uv sync
uv run jobhunter init
uv run jobhunter run
Metadata
Release files for jobhunter-cli 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| jobhunter_cli-1.0.1.tar.gz | 72.0 kB | Without provenance | Details for jobhunter_cli-1.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| jobhunter_cli-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for jobhunter_cli-1.0.1-py3-none-any.whl |
Total release size: 119.0 kB
Release files / jobhunter_cli-1.0.1.tar.gz
| Download URL | jobhunter_cli-1.0.1.tar.gz |
|---|---|
| Size | 72.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17ef492f4a041fb4087311342c3df6cdcc72c89b8783add964e6b36de4769552
|
|
BLAKE2b-256 checksum How to use checksums |
e5a580188aa9808be30bc550f80753b2158211d2b1e7a20464c433c294f5df8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / jobhunter_cli-1.0.1-py3-none-any.whl
| Download URL | jobhunter_cli-1.0.1-py3-none-any.whl |
|---|---|
| Size | 47.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6d487cbfac2a8ce6bf8bd5dddb363790eb63cf91fbcf4a75c85485ff7696b226
|
|
BLAKE2b-256 checksum How to use checksums |
dedca178d54061f64ccfcb0234a1a9714edb460394025a062c8472e689b52546
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for jobhunter-cli 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.