Automated job search, JD parsing, resume customization, and application tracking pipeline. Use when: user wants to find jobs, set up automated job searches,...
Automated job search pipeline with JD parsing, resume tailoring, and application tracking.
Create the project structure in the workspace:
job-hunter/
├── config.json # User profile, target roles, API config
├── api_keys.json # API credentials (gitignored)
├── resumes/
│ ├── base_resume.md # User's master resume (text)
│ └── [company]_[role].md # Customized per job
├── jobs/
│ └── tracked_jobs.json # All discovered jobs + status
Ask the user for (store in config.json):
resumes/base_resume.md)See references/apis.md for full API documentation.
Free, no auth required:
Free, API key required (ask user to register):
Store keys in api_keys.json with rate limits:
{
"adzuna": { "app_id": "...", "app_key": "...", "daily_budget": 4 },
"rapidapi": { "key": "...", "daily_budget": 2 }
}
tracked_jobs.json — skip duplicates (match by URL or title+company)tracked_jobs.jsonCritical rule: Never hallucinate or assume JD data. If the JD can't be fetched, mark fields as "not fetched" and note it.
Salary estimates: Only use JSearch estimated-salary API endpoint. Label clearly as "market estimate" vs "posted salary".
Extract from actual job posting text:
- title, company, location
- required_skills[] (from JD)
- experience_years (from JD)
- salary (only if stated)
- tech_stack[] (from JD)
- nice_to_have[] (from JD)
- apply_url
When user says "customize resume for [company]":
resumes/base_resume.mdtracked_jobs.jsonresumes/[company]_[role].mdTrack status in tracked_jobs.json:
new → parsed → customized → applied → screening → interviewing → offer/rejected
Each entry:
{
"id": "unique",
"source": "linkedin|jobicy|remoteok|adzuna|jsearch",
"title": "from API",
"company": "from API",
"location": "from API",
"location_tier": 1,
"match_score": 85,
"salary": "only if posted",
"tech_stack": ["from actual JD"],
"experience_required": "from actual JD",
"apply_url": "url",
"status": "new",
"found_date": "YYYY-MM-DD",
"notes": ""
}
Set up two cron jobs:
Job Finder — Daily at user's preferred time (default 9 AM local):
sessionTarget: "isolated", delivery: "announce"Status Update — Daily at user's preferred time (default 11 AM local):
sessionTarget: "isolated", delivery: "announce"Format updates for mobile readability (40-50 chars per line). Group jobs by:
Per job card:
━━━━━━━━━━━━━━━━━━
🏢 *Company Name*
📋 Role Title
📅 X+ yrs (from JD)
💰 Salary (if posted)
🛠 Tech: from actual JD
📍 Location
🎯 Match: X% — reason
Only show data from actual JD. Mark unfetched JDs with ⚠️.
Users can ask anytime:
ZIP package — ready to use