Skip to main content

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:

  1. Scan RemoteOK + Remotive every 30 minutes
  2. Score each job against your profile (skip below 60/100)
  3. Tailor your resume + cover letter for qualifying jobs
  4. Save consolidated application packages to autopilot_output/
  5. 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)

Source distribution for jobberman 0.1.0
File Size Uploaded
jobberman-0.1.0.tar.gz 40.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jobberman 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page