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
Metadata
Release files for jobberman 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jobberman-0.1.0.tar.gz | 40.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jobberman-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.1 kB
Release files / jobberman-0.1.0.tar.gz
| Download URL | jobberman-0.1.0.tar.gz |
|---|---|
| Size | 40.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
73d275cb99922c416a50d46f9e667506ee1f6e5ba20327873561d92843918593
|
|
BLAKE2b-256 checksum How to use checksums |
72bc93a619af07181c087f44553777fc2b050826bdfcd68d19096d1185a224bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.7
|
Release files / jobberman-0.1.0-py3-none-any.whl
| Download URL | jobberman-0.1.0-py3-none-any.whl |
|---|---|
| Size | 44.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0f8dc4d5722d1dbbad2d40455a90735c72bd6b9d7761c15196d74330fc436cdf
|
|
BLAKE2b-256 checksum How to use checksums |
ea7388c8734a08f60e1f4640024405891860f2c611aeabb88fc222c0899ed19a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.7
|