Skip to main content

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:

  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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jobberman-0.1.0.tar.gz (40.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jobberman-0.1.0-py3-none-any.whl (44.7 kB view details)

Uploaded Python 3

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

Hashes for jobberman-0.1.0.tar.gz
Algorithm Hash digest
SHA256 73d275cb99922c416a50d46f9e667506ee1f6e5ba20327873561d92843918593
MD5 bd4466bbf9d6306bafbbed8a7b52b4c3
BLAKE2b-256 72bc93a619af07181c087f44553777fc2b050826bdfcd68d19096d1185a224bc

See more details on using hashes here.

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

Hashes for jobberman-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0f8dc4d5722d1dbbad2d40455a90735c72bd6b9d7761c15196d74330fc436cdf
MD5 17c35da892b851543c2eead30f6b24d2
BLAKE2b-256 ea7388c8734a08f60e1f4640024405891860f2c611aeabb88fc222c0899ed19a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page