Autonomous AI-powered job search assistant CLI — scans, scores, tailors, and applies.
Project description
Jobberman — Agentic Job Search Assistant
An autonomous, AI-powered CLI tool that scans job boards, scores relevance, tailors your resume, and applies — all on autopilot, powered by Gemini.
_ _ _
| | | | | |
| | ___ | |__ | |__ ___ _ __ _ __ ___ __ _ _ __
_ | |/ _ \ | '_ \| '_ \ / _ \ '__| '_ ` _ \ / _` | '_ \
| |__| | (_) | |_) | |_) | __/ | | | | | | | (_| | | | |
\____/ \___/|_.__/|_.__/ \___|_| |_| |_| |_|\__,_|_| |_|
Features
| Feature | Description |
|---|---|
| Autopilot Mode | Continuously scans job boards, scores, tailors, and auto-applies |
| Gemini-Powered Scoring | Rates candidate–job fit 0–100 before wasting API calls |
| Resume & Cover Letter Tailoring | AI-generates tailored content per job description |
| Portfolio Coaching | Suggests projects to strengthen your application |
| Mock Interview Prep | Generates role-specific questions with feedback |
| LinkedIn Auto-Apply | Best-effort Easy Apply via Playwright automation |
| Storage Management | Auto-prunes packages, rotates logs for production |
| Deduplication | Never reprocesses the same job listing |
Quick Start
1. Install
# Clone and install globally
git clone https://github.com/joey727/Jobberman && cd Jobberman
pip install -e .
2. Set Your API Key
export GEMINI_API_KEY="your-gemini-api-key"
Get one free at Google AI Studio.
3. Run a Single Job Analysis
job-search full \
-j job_description.txt \
-r resume.txt \
--name "Jordan Doe" \
--email "jordan@example.com" \
--headline "Backend Engineer" \
--years-experience 5 \
--skills "Python, Django, PostgreSQL, AWS"
4. Start Autopilot
job-search autopilot \
--query "python backend" \
--sources remoteok,remotive \
--interval 30 \
--min-score 60 \
-r resume.txt \
--name "Jordan Doe" \
--email "jordan@example.com" \
--headline "Backend Engineer" \
--years-experience 5 \
--skills "Python, Django, PostgreSQL"
This will:
- Scan RemoteOK + Remotive every 30 minutes
- Score each job against your profile (skip below 60/100)
- Tailor your resume + cover letter for qualifying jobs
- Save consolidated application packages to
autopilot_output/ - Log every action to
application_log.jsonl
Stop with Ctrl+C — graceful shutdown guaranteed.
Autopilot Output Structure
autopilot_output/
├── packages/
│ ├── 20260320T184500_senior-python-engineer.json ← Single consolidated file
│ └── 20260320T185200_backend-developer-aws.json
├── applied_jobs.json ← Dedup tracker (never reapply)
├── application_log.jsonl ← Structured action log
└── application_log.old.jsonl ← Rotated archive
Each package JSON contains the job description, score, tailored resume, and cover letter in one file.
Storage Management Flags
| Flag | Default | Description |
|---|---|---|
--max-packages |
50 | Auto-delete oldest packages beyond this limit |
--max-log-lines |
5000 | Rotate log file when exceeding this line count |
All CLI Commands
| Command | Description |
|---|---|
job-search full |
Single job: parse JD → tailor resume → portfolio → interview |
job-search autopilot |
Continuous bot: scan → score → tailor → apply → log |
job-search run |
Batch scan from a source + tailor per job |
job-search apply |
LinkedIn Easy Apply from generated packages |
job-search apply-and-reach-out |
Apply + resolve company + collect contacts + draft emails |
job-search collect-contacts |
Scrape LinkedIn employee profiles |
job-search message-contacts |
Draft and optionally send outreach emails |
job-search export-auth |
Export Playwright authenticated session |
job-search --version |
Print version |
LinkedIn Automation (Optional)
For LinkedIn auto-apply and contact scraping:
# 1. Install Playwright
python3 -m playwright install
# 2. Export your LinkedIn session
job-search export-auth \
--login-url "https://www.linkedin.com/login" \
--output-path storage_state.json
# 3. Use with autopilot
job-search autopilot \
--query "python" \
--storage-state storage_state.json \
-r resume.txt --name "Jordan Doe" ...
Safety: LinkedIn Easy Apply submissions are auto-confirmed in autopilot mode. Manual apply commands still prompt for confirmation.
Tests
All 32 tests pass with no API key required (Gemini calls are fully mocked):
pip install pytest
pytest tests/ -v
| Test File | Coverage |
|---|---|
test_models.py |
All 11 Pydantic models |
test_scoring.py |
Relevance scorer |
test_bot.py |
Bot loop, dedup, logging, pruning |
test_agents.py |
All 4 agents |
Project Structure
job_search_agent/
├── agents/ # Gemini-powered agents (parser, tailor, portfolio, interview)
├── automation/ # Playwright automation (LinkedIn apply, contacts, email)
├── sources/ # Job board scanners (RemoteOK, Remotive, WeWorkRemotely)
├── bot.py # Autonomous daemon loop
├── scoring.py # Gemini relevance scorer
├── models.py # Pydantic data models
├── orchestrator.py # Multi-agent pipeline coordinator
├── cli.py # CLI entry point
└── terminal_ui.py # Rich terminal rendering
tests/ # Pytest suite (32 tests)
Deployment
Install from GitHub (Any Machine)
pip install git+https://github.com/joey727/Jobberman.git
That's it — job-search is now available globally. No cloning needed.
Install with pipx (Isolated Environment)
pipx install git+https://github.com/joey727/Jobberman.git
With LinkedIn Automation Support
pip install "jobberman[linkedin] @ git+https://github.com/joey727/Jobberman.git"
python3 -m playwright install
Publish to PyPI (Maintainer)
pip install build twine
python3 -m build
twine upload dist/*
Once published, anyone can install with:
pip install jobberman
Limitations
- LinkedIn DOM selectors change frequently — you may need to tweak automation selectors.
- Employee scraping and email extraction are best-effort.
- Screenshots are captured for diagnosing automation failures.
- This is automation scaffolding — always review outputs before sending.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jobberman-0.1.0.tar.gz.
File metadata
- Download URL: jobberman-0.1.0.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73d275cb99922c416a50d46f9e667506ee1f6e5ba20327873561d92843918593
|
|
| MD5 |
bd4466bbf9d6306bafbbed8a7b52b4c3
|
|
| BLAKE2b-256 |
72bc93a619af07181c087f44553777fc2b050826bdfcd68d19096d1185a224bc
|
File details
Details for the file jobberman-0.1.0-py3-none-any.whl.
File metadata
- Download URL: jobberman-0.1.0-py3-none-any.whl
- Upload date:
- Size: 44.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f8dc4d5722d1dbbad2d40455a90735c72bd6b9d7761c15196d74330fc436cdf
|
|
| MD5 |
17c35da892b851543c2eead30f6b24d2
|
|
| BLAKE2b-256 |
ea7388c8734a08f60e1f4640024405891860f2c611aeabb88fc222c0899ed19a
|