An agentic AI system that scrapes job boards, scores your fit using Claude, writes tailored cover letters, and submits applications โ all autonomously.
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ Autonomous Job Application Agent โ
โ Mode: DRY RUN | Min Score: 70 | Max Apps: 10 โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Scraping 'Python Developer' in 'Remote' from indeed, linkedin...
โ Found 23 jobs.
Analyzing job matches...
Senior Python Engineer @ TechCorp: โ 91/100 โ strong_apply
ML Engineer @ AI Startup Labs: โ 84/100 โ apply
Java Developer @ Enterprise LLC: โ 42/100 โ skipped
2 jobs passed the 70+ threshold.
Tailoring applications and submitting...
Senior Python Engineer @ TechCorp (score: 91)
Writing application for Senior Python Engineer @ TechCorp...
โ [DRY RUN] Materials saved โ data/applications/mock001/
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Session Summary โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโฌโโโโโโโโโโโโโโโค
โ Job Title โ Company โ Score โ Status โ
โโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโผโโโโโโโโโโโโโโโค
โ Senior Python Eng. โ TechCorp โ 91 โ applied โ
โ ML Engineer โ AI Startup โ 84 โ applied โ
โโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโดโโโโโโโโโโโโโโโ
โ Done! Applied to 2/2 jobs this session.
This agent follows a multi-step agentic loop:
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ 1. SCRAPE โโโโโถโ 2. ANALYZE โโโโโถโ 3. FILTER โ
โ โ โ โ โ โ
โ Indeed โ โ Claude readsโ โ Score โฅ 70? โ
โ LinkedIn โ โ your resume โ โ Yes โ proceed โ
โ Glassdoor โ โ vs JD โ โ No โ skip โ
โ (free) โ โ Score 0-100 โ โ โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ 6. TRACK โโโโโโ 5. SUBMIT โโโโโโ 4. TAILOR โ
โ โ โ โ โ โ
โ Notion DB โ โ Selenium โ โ Claude writes โ
โ Local JSON โ โ form fill โ โ cover letter โ
โ (free) โ โ (or dry run)โ โ + resume summaryโ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
- Match Score < 70 โ skipped automatically (no wasted API calls on tailoring)
- Score 70โ85 โ applies with standard tailoring
- Score 85+ โ
strong_applyflag, gets extra emphasis in cover letter - Already seen job IDs โ deduplicated across runs via
data/seen_ids.json
| Feature | Details |
|---|---|
| ๐ Multi-board scraping | Indeed, LinkedIn, Glassdoor, ZipRecruiter โ no API keys needed |
| ๐ง AI match scoring | Claude analyzes resume vs JD, returns 0-100 score with reasoning |
| โ๏ธ Tailored cover letters | Per-job cover letters that mirror keywords and company tone |
| ๐ Resume summary rewrite | Tailored 4-sentence summary for each role |
| ๐ค Auto-submit | Selenium handles LinkedIn Easy Apply forms |
| ๐ Notion tracker | Auto-syncs application status to a Notion database |
| ๐พ Full local logs | Every application saved to data/applications/ |
| ๐ Deduplication | Never applies to the same job twice |
| ๐งช Dry-run mode | Generate all materials without submitting โ safe to test |
job-agent/
โโโ main.py # CLI entry point
โโโ config.py # Config, env vars, Pydantic models
โโโ requirements.txt
โโโ .env.example
โ
โโโ agent/
โ โโโ brain.py # Claude: job matching + cover letter writing
โ โโโ orchestrator.py # Main agentic loop (coordinates all tools)
โ
โโโ tools/
โ โโโ scraper.py # Free job scraping via JobSpy
โ โโโ submitter.py # Selenium form submission + dry-run
โ โโโ notion_tracker.py # Optional Notion database sync
โ
โโโ data/
โโโ resumes/
โ โโโ resume.txt # Your resume in plain text
โโโ jobs/ # Raw scraped job JSON (auto-generated)
โโโ applications/ # Per-job cover letters + summaries
โโโ seen_ids.json # Dedup tracker (auto-generated)
git clone https://github.com/yourusername/autonomous-job-agent.git
cd autonomous-job-agent
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
pip install python-jobspy # free job scrapingcp .env.example .envEdit .env and fill in:
ANTHROPIC_API_KEYโ get at console.anthropic.comCANDIDATE_NAME,CANDIDATE_EMAIL,CANDIDATE_PHONE,CANDIDATE_LOCATION
Copy your resume as plain text to:
data/resumes/resume.txt
See data/resumes/resume_template.txt for the expected format.
python main.py --dry-runGenerated cover letters and resume summaries appear in:
data/applications/<job_id>/
โโโ cover_letter.txt
โโโ resume_summary.txt
โโโ talking_points.json
# Set DRY_RUN=false in .env, then:
python main.py --livepython main.py [OPTIONS]
Options:
--title TEXT Job title to search for (default: uses config queries)
--location TEXT Location / "Remote" (default: Remote)
--results INT Results per job board (default: 20)
--resume PATH Path to resume .txt (default: data/resumes/resume.txt)
--max INT Max applications this run (default: 10)
--min-score INT Minimum match score 0-100 (default: 70)
--dry-run Generate materials but don't submit
--live Actually submit applications
Examples:
python main.py --title "ML Engineer" --location "Remote" --dry-run
python main.py --title "Backend Engineer" --min-score 80 --max 5
python main.py --resume ~/Desktop/resume.txt --live
- Go to notion.so/my-integrations โ New Integration
- Create a database with these columns:
| Column | Type |
|---|---|
| Title | Title |
| Company | Text |
| Status | Select (Applied, Pending, Failed, Skipped) |
| Score | Number |
| URL | URL |
| Applied At | Text |
| Notes | Text |
- Share the database with your integration, copy the Database ID from the URL
- Add to
.env:
NOTION_TOKEN=secret_...
NOTION_DATABASE_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
| Service | Used For | Cost |
|---|---|---|
| Anthropic Claude | Job matching + cover letter writing | ~$0.01โ0.05 per job analyzed |
| JobSpy (no key) | Scraping Indeed/LinkedIn/Glassdoor | Free |
| Notion API | Application tracking dashboard | Free |
| Selenium (local) | Form auto-submission | Free |
Estimated cost per run (10 jobs): ~$0.20โ0.50
Edit config.py:
DEFAULT_SEARCH_QUERIES = [
{"title": "Data Scientist", "location": "New York", "results": 30},
{"title": "ML Engineer", "location": "Remote", "results": 25},
]In agent/brain.py, swap claude-opus-4-5 for claude-haiku-4-5-20251001 to reduce cost (slightly less quality).
tools/scraper.py uses JobSpy which supports: indeed, linkedin, glassdoor, zip_recruiter.
- Always review generated cover letters before going fully autonomous
- Respect job board terms of service โ use reasonable rate limits
- Use
DRY_RUN=truefirst and review outputs - Don't apply to jobs you're genuinely not interested in โ it wastes recruiters' time
PRs welcome! Ideas for improvement:
- Email application support (for jobs that require emailing a resume)
- GPT-4o Vision to read job post screenshots
- Greenhouse / Lever / Workday form handlers
- Daily scheduler (cron / GitHub Actions)
- Slack/Discord notification on successful applications
- Interview prep generator per job
MIT โ see LICENSE
Built by Your Name
โญ Star this repo if it helped you land a job!