Skip to main content

AI-powered end-to-end job application pipeline

Project description

ApplyAgent

Applied to 1,000 jobs in 2 days. Fully autonomous. Open source.

PyPI version Python 3.11+


What It Does

ApplyAgent is a 6-stage autonomous job application pipeline. It discovers jobs across 5+ boards, scores them against your resume with AI, tailors your resume per job, writes cover letters, and submits applications for you. It navigates forms, uploads documents, answers screening questions, all hands-free.

Three commands. That's it.

pip install applyagent
pip install --no-deps python-jobspy && pip install pydantic tls-client requests markdownify regex
applyagent init          # one-time setup: resume, profile, preferences, API keys
applyagent doctor        # verify your setup — shows what's installed and what's missing
applyagent run           # discover > enrich > score > tailor > cover letters
applyagent run -w 4      # same but parallel (4 threads for discovery/enrichment)
applyagent apply         # autonomous browser-driven submission
applyagent apply -w 3    # parallel apply (3 Chrome instances)
applyagent apply --dry-run  # fill forms without submitting

Why two install commands? python-jobspy pins an exact numpy version in its metadata that conflicts with pip's resolver, but works fine at runtime with any modern numpy. The --no-deps flag bypasses the resolver; the second command installs jobspy's actual runtime dependencies. Everything except python-jobspy installs normally.


Three Paths

Full Pipeline — Claude Code (recommended for best results)

Requires: Python 3.11+, Node.js (for npx), Gemini API key (free), Claude Code CLI, Chrome

Runs all 6 stages, from job discovery to autonomous application submission. This is the full power of ApplyAgent.

Full Pipeline — Local Model (completely free)

Requires: Python 3.11+, Chrome, local LLM server (Ollama/llama.cpp)

Same 6 stages, but auto-apply uses a local model instead of Claude Code. No API keys, no subscriptions, no Node.js. Just your hardware.

# Start Ollama with a capable model
ollama serve
ollama pull qwen2.5:32b    # or llama3.1, mistral, etc.

# Configure ApplyAgent for local
# In ~/.applyagent/.env:
#   LLM_URL=http://localhost:11434/v1
#   LLM_MODEL=qwen2.5:32b

applyagent apply --local   # uses local LLM + Python Playwright

You can also split models — use a small/free model for scoring and a larger one for the agent:

# In ~/.applyagent/.env:
GEMINI_API_KEY=xxx                          # free Gemini for scoring/tailoring
APPLY_LLM_URL=http://localhost:11434/v1     # local model for browser agent
APPLY_LLM_MODEL=qwen2.5:32b                # bigger model handles form-filling

Discovery + Tailoring Only

Requires: Python 3.11+, Gemini API key (free)

Runs stages 1-5: discovers jobs, scores them, tailors your resume, generates cover letters. You submit applications manually with the AI-prepared materials.


The Pipeline

Stage What Happens
1. Discover Scrapes 5 job boards (Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs) + 48 Workday employer portals + 30 direct career sites
2. Enrich Fetches full job descriptions via JSON-LD, CSS selectors, or AI-powered extraction
3. Score AI rates every job 1-10 based on your resume and preferences. Only high-fit jobs proceed
4. Tailor AI rewrites your resume per job: reorganizes, emphasizes relevant experience, adds keywords. Never fabricates
5. Cover Letter AI generates a targeted cover letter per job
6. Auto-Apply Claude Code navigates application forms, fills fields, uploads documents, answers questions, and submits

Each stage is independent. Run them all or pick what you need.


ApplyAgent vs The Alternatives

Feature ApplyAgent AIHawk Manual
Job discovery 5 boards + Workday + direct sites LinkedIn only One board at a time
AI scoring 1-10 fit score per job Basic filtering Your gut feeling
Resume tailoring Per-job AI rewrite Template-based Hours per application
Auto-apply Full form navigation + submission LinkedIn Easy Apply only Click, type, repeat
Supported sites Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs, 46 Workday portals, 28 direct sites LinkedIn Whatever you open
License AGPL-3.0 MIT N/A

Requirements

Component Required For Details
Python 3.11+ Everything Core runtime
Node.js 18+ Auto-apply (Claude Code mode) Needed for npx to run Playwright MCP server
Gemini API key Scoring, tailoring, cover letters Free tier (15 RPM / 1M tokens/day) is enough
Chrome/Chromium Auto-apply Auto-detected on most systems
Claude Code CLI Auto-apply (Claude Code mode) Install from claude.ai/code
Local LLM server Auto-apply (local mode) Ollama, llama.cpp, vLLM, or any OpenAI-compatible server

Gemini API key is free. Get one at aistudio.google.com. OpenAI and local models (Ollama/llama.cpp) are also supported.

Local auto-apply is completely free. Use applyagent apply --local with any local model. No API keys needed for auto-apply — just Chrome + a local LLM server.

Optional

Component What It Does
CapSolver API key Solves CAPTCHAs during auto-apply (hCaptcha, reCAPTCHA, Turnstile, FunCaptcha). Without it, CAPTCHA-blocked applications just fail gracefully

Note: python-jobspy is installed separately with --no-deps because it pins an exact numpy version in its metadata that conflicts with pip's resolver. It works fine with modern numpy at runtime.


Configuration

All generated by applyagent init:

profile.json

Your personal data in one structured file: contact info, work authorization, compensation, experience, skills, resume facts (preserved during tailoring), and EEO defaults. Powers scoring, tailoring, and form auto-fill.

searches.yaml

Job search queries, target titles, locations, boards. Run multiple searches with different parameters.

.env

API keys and runtime config: GEMINI_API_KEY, LLM_MODEL, CAPSOLVER_API_KEY (optional). For local auto-apply, APPLY_LLM_URL and APPLY_LLM_MODEL let you use a different model for the browser agent than for scoring.

Package configs (shipped with ApplyAgent)

  • config/employers.yaml - Workday employer registry (48 preconfigured)
  • config/sites.yaml - Direct career sites (30+), blocked sites, base URLs, manual ATS domains
  • config/searches.example.yaml - Example search configuration

How Stages Work

Discover

Queries Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs via JobSpy. Scrapes 48 Workday employer portals (configurable in employers.yaml). Hits 30 direct career sites with custom extractors. Deduplicates by URL.

Enrich

Visits each job URL and extracts the full description. 3-tier cascade: JSON-LD structured data, then CSS selector patterns, then AI-powered extraction for unknown layouts.

Score

AI scores every job 1-10 against your profile. 9-10 = strong match, 7-8 = good, 5-6 = moderate, 1-4 = skip. Only jobs above your threshold proceed to tailoring.

Tailor

Generates a custom resume per job: reorders experience, emphasizes relevant skills, incorporates keywords from the job description. Your resume_facts (companies, projects, metrics) are preserved exactly. The AI reorganizes but never fabricates.

Cover Letter

Writes a targeted cover letter per job referencing the specific company, role, and how your experience maps to their requirements.

Auto-Apply

An AI agent launches a Chrome instance, navigates to each application page, detects the form type, fills personal information and work history, uploads the tailored resume and cover letter, answers screening questions with AI, and submits. A live dashboard shows progress in real-time.

Two agent backends are available:

  • Claude Code (default): spawns the claude CLI with Playwright MCP. Best results but requires an Anthropic subscription + Node.js.
  • Local model (--local): uses your local LLM (Ollama/llama.cpp) + Python Playwright directly. Completely free, no external dependencies beyond Chrome.
applyagent apply                       # Claude Code mode (default)
applyagent apply --local               # Local model mode (free)
applyagent apply --local --dry-run     # Local mode, fill forms without submitting
applyagent apply --local -w 2          # Local mode, 2 parallel workers

# Utility modes (no Chrome/agent needed)
applyagent apply --mark-applied URL    # manually mark a job as applied
applyagent apply --mark-failed URL     # manually mark a job as failed
applyagent apply --reset-failed        # reset all failed jobs for retry
applyagent apply --gen --url URL       # generate prompt file for manual debugging

CLI Reference

applyagent init                         # First-time setup wizard
applyagent doctor                       # Verify setup, diagnose missing requirements
applyagent run [stages...]              # Run pipeline stages (or 'all')
applyagent run --workers 4              # Parallel discovery/enrichment
applyagent run --stream                 # Concurrent stages (streaming mode)
applyagent run --min-score 8            # Override score threshold
applyagent run --dry-run                # Preview without executing
applyagent run --validation lenient     # Relax validation (recommended for Gemini free tier)
applyagent run --validation strict      # Strictest validation (retries on any banned word)
applyagent apply                        # Launch auto-apply (Claude Code)
applyagent apply --local                # Launch auto-apply (local LLM, free)
applyagent apply --workers 3            # Parallel browser workers
applyagent apply --dry-run              # Fill forms without submitting
applyagent apply --continuous           # Run forever, polling for new jobs
applyagent apply --headless             # Headless browser mode
applyagent apply --url URL              # Apply to a specific job
applyagent status                       # Pipeline statistics
applyagent dashboard                    # Open HTML results dashboard

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

applyagent-0.3.3.tar.gz (132.4 kB view details)

Uploaded Source

Built Distribution

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

applyagent-0.3.3-py3-none-any.whl (150.1 kB view details)

Uploaded Python 3

File details

Details for the file applyagent-0.3.3.tar.gz.

File metadata

  • Download URL: applyagent-0.3.3.tar.gz
  • Upload date:
  • Size: 132.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for applyagent-0.3.3.tar.gz
Algorithm Hash digest
SHA256 5d68c3f90e2b1a4c50b898d820e1fcc54b73b68caa933cdeafc65bdf39229bbf
MD5 13e580a81f281c2d9f7731d1080f049e
BLAKE2b-256 8d023b2134ba5dc373b7ab3e59739afbe5ec846a0a92428670d4e19d6e7c59a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for applyagent-0.3.3.tar.gz:

Publisher: publish.yml on forrestcai35/ApplyAgent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file applyagent-0.3.3-py3-none-any.whl.

File metadata

  • Download URL: applyagent-0.3.3-py3-none-any.whl
  • Upload date:
  • Size: 150.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for applyagent-0.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 2d5e33263bbd5d33b3093133e32ed348ba36da0b9a480e7156c2364b30973498
MD5 75900d3d56c1c5fba88f8da6ea95d8f0
BLAKE2b-256 3edc28914fc9c1bbee98c15b74382bfc8f61fe2e96df42abeba957b085ff1dd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for applyagent-0.3.3-py3-none-any.whl:

Publisher: publish.yml on forrestcai35/ApplyAgent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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