AI-powered end-to-end job application pipeline
Project description
ApplyAgent
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-jobspypins an exact numpy version in its metadata that conflicts with pip's resolver, but works fine at runtime with any modern numpy. The--no-depsflag bypasses the resolver; the second command installs jobspy's actual runtime dependencies. Everything exceptpython-jobspyinstalls 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.
Discovery, Scoring, and Tailoring — Local Model (completely free)
Requires: Python 3.11+, Chrome, local LLM server (Ollama/llama.cpp)
Runs stages 1-5 without any API keys or subscriptions. Uses your local LLM to score jobs, tailor your resume, and write cover letters.
# 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 run # uses local LLM for scoring and tailoring
To run auto-apply (stage 6), you will still need to use Claude Code.
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.
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 |
Gemini API key is free. Get one at aistudio.google.com. OpenAI and local models (Ollama/llama.cpp) are also supported.
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-depsbecause 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 model scoring and tailoring, specify LLM_URL and LLM_MODEL.
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 domainsconfig/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.
It spawns the claude CLI with Playwright MCP. Best results but requires an Anthropic subscription + Node.js.
applyagent apply # Claude Code mode (default)
applyagent apply --dry-run # Fill forms without submitting
applyagent apply -w 2 # 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 --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 dashboard # Open HTML results dashboard
License
This project is licensed under the GNU Affero General Public License v3.0. See the LICENSE file for details.
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
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 applyagent-0.3.7.tar.gz.
File metadata
- Download URL: applyagent-0.3.7.tar.gz
- Upload date:
- Size: 133.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47bc74e3f152ee6af98832842500731266976a706e25e6d6a2e060ff2ea87219
|
|
| MD5 |
2a5699c9d338e7e5d01d775e50c19182
|
|
| BLAKE2b-256 |
7d0d91ebac7309dc1a73e34746e91de0e093db9c9edb8853afce00af173495ff
|
Provenance
The following attestation bundles were made for applyagent-0.3.7.tar.gz:
Publisher:
publish.yml on forrestcai35/ApplyAgent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
applyagent-0.3.7.tar.gz -
Subject digest:
47bc74e3f152ee6af98832842500731266976a706e25e6d6a2e060ff2ea87219 - Sigstore transparency entry: 1119436418
- Sigstore integration time:
-
Permalink:
forrestcai35/ApplyAgent@bce1d5d869f91a13fb60fd88a770e9a9e4f2742c -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/forrestcai35
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bce1d5d869f91a13fb60fd88a770e9a9e4f2742c -
Trigger Event:
push
-
Statement type:
File details
Details for the file applyagent-0.3.7-py3-none-any.whl.
File metadata
- Download URL: applyagent-0.3.7-py3-none-any.whl
- Upload date:
- Size: 149.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a7f14e560239f50375414a82a787e4186ab5ed679cfe33788189b4a77a16470
|
|
| MD5 |
30a6b4171640acebf508c6568651f249
|
|
| BLAKE2b-256 |
2a140b2771a586b925cf46957c81dd60cd4c4ac60b4fb268007c62c1ebebfa8f
|
Provenance
The following attestation bundles were made for applyagent-0.3.7-py3-none-any.whl:
Publisher:
publish.yml on forrestcai35/ApplyAgent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
applyagent-0.3.7-py3-none-any.whl -
Subject digest:
9a7f14e560239f50375414a82a787e4186ab5ed679cfe33788189b4a77a16470 - Sigstore transparency entry: 1119436446
- Sigstore integration time:
-
Permalink:
forrestcai35/ApplyAgent@bce1d5d869f91a13fb60fd88a770e9a9e4f2742c -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/forrestcai35
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bce1d5d869f91a13fb60fd88a770e9a9e4f2742c -
Trigger Event:
push
-
Statement type: