agentleFS
AkbarDevopAkbarDevop/ai-job-agent/CLAUDE.md

ai-job-agent

CLAUDE.md61 starsChanged 6 months agoMITView on GitHub

This is a job application automation toolkit. It automates filling and submitting applications on LinkedIn Easy Apply, Greenhouse, Lever, Jobvite, and Ashby, plus email triage and Google Sheets tracking. Two ways to drive it: Installed by bash skills/install.sh (symlinks them into ~/.claude/skills/). Each skill's prompt lives at skills/<name>/SKILL.md — read it to see exactly what the agent does. First-run flow (gstack-style): open Claude Code anywhere and paste this one message: Install ai-job-agent: run git clone --single-branch --depth 1 https://github.com/AkbarDevop/ai-job-agent ~/.claude/skills/ai-job-agent…

  • Installs packages

We split this CLAUDE.md into the rules it gives an agent

13 rules. About 0 are common, 9 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    All personal details are in the config/ directory:

    line 75
  2. Distinctive:

    Legacy (raw scripts): Search → Apply → Track → Triage.

    line 86
  3. Very specific:

    Use /job-search or python-jobspy to find matching roles.

    line 90
  4. Distinctive:

    After each successful submission:

    line 121
  5. Distinctive:

    Use the Outlook scripts to search for confirmation and rejection emails:

    line 129
  6. Distinctive:

    When you receive rejections, interviews, or other updates:

    line 144
  7. Distinctive:

    Truthfulness first: Prefer truthful, submittable applications over aggressive volume.

    line 152
  8. Distinctive:

    Resume selection: Use the appropriate resume variant for each role type (see candidate-profile.md for the mapping).

    line 154
  9. Distinctive:

    Captcha honesty: If a form stalls behind CAPTCHA, log it as "blocked" -- never inflate submitted counts.

    line 155
  10. Distinctive:

    Headless default: Use headless browser by default.

    line 156
  11. Distinctive:

    All application scripts use consistent exit codes:

    line 179
  12. Very specific:

    Web browsing: use /browse for all web browsing.

    line 218
  13. Very specific:

    If gstack isn't installed, those skills are optional — this repo's 13 bundled skills (/job-coach, /job-setup, /job-evaluate, /job-apply, …

    line 225

≈ “Common” is an estimate: at least 1 in 5 of the 25,680 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
CLAUDE.md

AI Job Application Agent - Claude Code Instructions

Overview

This is a job application automation toolkit. It automates filling and submitting applications on LinkedIn Easy Apply, Greenhouse, Lever, Jobvite, and Ashby, plus email triage and Google Sheets tracking.

Two ways to drive it:

  1. Bundled skills (recommended) — type /job-coach, /job-apply, /job-evaluate, /job-cv, /job-track, /job-triage, /job-status, /job-outreach, /job-followup, /job-dashboard, /job-interview, /job-patterns, or /job-setup in any Claude Code session. Each skill wraps the scripts below and renders results as a markdown table. Install once with bash skills/install.sh.
  2. Raw scripts — call the Node.js / Python scripts in scripts/ directly from your terminal (documented below).

Bundled Skills

Installed by bash skills/install.sh (symlinks them into ~/.claude/skills/). Each skill's prompt lives at skills/<name>/SKILL.md — read it to see exactly what the agent does.

SkillWrapsOutput
/job-coachthe persona — intake, research, slate, dispatchtarget-role slate + next-move suggestions; persists to config/search-plan.md
/job-setupwizard.sh equivalent — but in chatconversational onboarding, auto-reads user files, writes configs, registers skills
/job-apply <url> [--submit]5 ATS fillers (auto-routed by URL host)result table: platform, outcome, exit code
/job-track [sync]local CSV + google-sheet-sync.pycounts-by-status table + recent activity
/job-triage [query]outlook-triage.jsclassified-email counts + preview table, step-through extract/mark-read
/job-status <updates.json>tracker-status-update.pybefore/after diff, confirmation prompt, result summary
/job-outreach <target>send-cold-email.js + Claude (the agent drafts)research → draft preview → dry-run → send → log to outreach-log.csv
/job-followup [send]outreach-log.csv + send-cold-email.jsurgency table (overdue/due/soon/waiting) + optional step-through send
/job-dashboard [live]job-dashboard.mjs (zero deps)ANSI tables: applications + outreach + follow-ups. Snapshot in chat or npm run dashboard for live TUI
/job-evaluate <url>WebFetch + 7-block A-G rubric + /job-cv chain + tracker appendstructured eval report at reports/<date>-<company>-<role>.md + tailored PDF + tracker row
/job-cv <jd>scripts/generate-tailored-cv.mjs (Playwright Chromium → PDF)Claude rewrites base CV (no invention) → ATS-friendly PDF at output/cv-<company>-<date>.pdf
/job-interview <company>application-tracker.csv + WebSearch + WebFetchcompany snapshot + 10-15 likely Qs + 5-8 STAR stories from real projects + 5 smart asks + 3 red flags
/job-patternsapplication-tracker.csv + outreach-log.csvrejection diagnostics (by ATS / time-to-rej / geography / role-type / day-of-week) + 3 actionable fixes

First-run flow (gstack-style): open Claude Code anywhere and paste this one message:

Install ai-job-agent: run git clone --single-branch --depth 1 https://github.com/AkbarDevop/ai-job-agent ~/.claude/skills/ai-job-agent && cd ~/.claude/skills/ai-job-agent && bash skills/install.sh then add an "ai-job-agent" section to my CLAUDE.md telling you to treat me like a career-coaching client — open-ended job-search talk → /job-coach (intake + research + slate), job URL alone → /job-apply, "evaluate this URL" → /job-evaluate (rubric + report + tailored CV), "tailor my CV" → /job-cv, "prep me for X interview" → /job-interview, "what's working / why am I getting rejected" → /job-patterns, reaching out to a person → /job-outreach, follow-ups → /job-followup, "how am I doing" → /job-dashboard, tracker → /job-track, status updates → /job-status, Outlook → /job-triage, first-time setup → /job-setup. Never answer job-search questions conversationally — always dispatch. Tell me when done, then run /job-setup and chain into /job-coach intake.

Claude clones into ~/.claude/skills/ai-job-agent/, registers all 13 skills as symlinks under ~/.claude/skills/, writes the coach-first routing block into CLAUDE.md, runs /job-setup (identity + resume + optional msmtp), and chains into /job-coach intake (target roles + companies + timeline → live market research → ranked slate of next moves). After that, the user talks naturally — "I want to apply to this url", "email the VP at X", "evaluate this posting", "tailor my CV for this JD", "prep me for my interview at Y", "what's working" → diagnostics, "how am I doing" — and Claude dispatches to the right skill. No cd required ever; skills work from any directory in any session. bash wizard.sh and bash setup.sh still exist for non-Claude-Code users.

Skills find this repo via $AI_JOB_AGENT_ROOT → ~/.claude/skills/ai-job-agent/REPO_PATH → ~/ai-job-agent. Set the env var or rerun install.sh from a non-default clone location.

Unified mode — npm run agent

Daily driver. Opens Claude Code chat (top pane) + live TUI dashboard (bottom pane) in one terminal window via tmux. They auto-sync via fs.watch — anything Claude does in chat that touches application-tracker.csv or outreach-log.csv re-renders the dashboard within ~200ms.

Launcher: bin/job-agent.sh. If tmux isn't installed it offers to brew install tmux (macOS) or apt install tmux (Linux) with a one-key confirmation. On decline, falls back to opening two Terminal/iTerm tabs (macOS) or printing manual instructions (Linux).

NPM scripts

CommandPurpose
npm run agentUnified mode — Claude Code + live TUI dashboard, split-pane via tmux
npm run dashboardInteractive 5-tab TUI dashboard (Applications · Outreach · Follow-ups · Pipeline · Reports)
npm run dashboard:snapshotOne-shot ANSI snapshot to stdout (used by /job-dashboard skill)
npm run mirrorGenerate data/applications.md + data/outreach.md from CSVs (markdown twin)
npm run mirror:watchSame, but rerun on every CSV change via fs.watch
npm run smokeFresh-install smoke test in a sandboxed $HOME (CI-safe)
npm run doctorHealth check on the real environment (toolchain, configs, msmtp, gcloud, skill files)
npm run linkedin / greenhouse / lever / jobvite / ashbyDirect ATS form-fillers (legacy CLI surface, wrapped by /job-apply)
npm run triage / sendOutlook search + send via CDP (legacy CLI surface, wrapped by /job-triage)

Output locations (all gitignored)

PathOwnerContents
application-tracker.csvsource of truthevery applied / evaluated / interview / offer / rejected row
outreach-log.csvsource of truthevery cold email sent + replies + follow-up cadence
data/applications.mdnpm run mirrormarkdown twin of application-tracker.csv
data/outreach.mdnpm run mirrormarkdown twin of outreach-log.csv
reports/<date>-<co>-<role>.md/job-evaluateper-JD rubric report (A-G blocks + sources + recommended move)
output/cv-<co>-<date>.pdf/job-cvtailored ATS-friendly PDF resume
interview-prep/<date>-<co>-<role>.md/job-interviewSTAR prep doc + smart Qs + red flags
config/search-plan.md/job-coachthe live job-search plan (intake outputs, target tiers, log)

Configuration

All personal details are in the config/ directory:

  • config/candidate-profile.md -- Full candidate profile, application rules, session state, and agent handoff context. Read this first in every session.
  • config/answer-bank.md -- Pre-written answers for common application questions.
  • config/linkedin-config.json -- LinkedIn Easy Apply config with identity, resume path, and Chrome cookie path.
  • config/example-config.json -- Reference example showing all available fields.

Workflow

Recommended (skill-driven): /job-coach (intake + slate) → for each row: /job-evaluate <url> (deep-dive + rubric) → if fit ≥ 4.0, automatically chains into /job-cv (tailored PDF) and offers /job-apply → after applying, run /job-followup weekly → /job-triage to log replies → /job-status to flip rows → /job-patterns once a month for diagnostics → /job-interview whenever an interview shows up.

Legacy (raw scripts): Search → Apply → Track → Triage.

1. Search for jobs

Use /job-search or python-jobspy to find matching roles. Filter by:

  • Role fit (match resume variants to role types)
  • Work authorization eligibility
  • Location preferences
  • Recency (prefer jobs posted in the last 72 hours)

2. Apply to jobs

Choose the right script based on the ATS platform:

# LinkedIn Easy Apply
node scripts/linkedin-easy-apply.js <jobUrl> config/linkedin-config.json

# Lever
node scripts/lever-apply.js <jobUrl> <configPath>

# Greenhouse
node scripts/greenhouse-apply.js <jobUrl> <configPath>

# Jobvite
node scripts/jobvite-apply.js <jobUrl> <configPath>

# Ashby
node scripts/ashby-apply.js <jobUrl> <configPath>

For Lever, Greenhouse, Jobvite, and Ashby, you need to inspect the form first to build the config with the correct field IDs and values.

3. Track applications

After each successful submission:

  1. Append a row to the local application-tracker.csv
  2. Append an entry to the daily log submitted-applications-YYYY-MM-DD.md
  3. Sync to Google Sheets: python3 scripts/google-sheet-sync.py application-tracker.csv

4. Triage emails

Use the Outlook scripts to search for confirmation and rejection emails:

# Search for job-related emails
node scripts/outlook-triage.js search "application confirmation"

# Read a specific email
node scripts/outlook-triage.js extract 0

# Mark as read after processing
node scripts/outlook-triage.js mark-read 0

5. Update statuses

When you receive rejections, interviews, or other updates:

python3 scripts/tracker-status-update.py updates.json

Application Rules

  1. Truthfulness first: Prefer truthful, submittable applications over aggressive volume.
  2. Work authorization: Skip hard citizen/green-card gated roles unless the form provides a truthful path for the candidate's actual status.
  3. Resume selection: Use the appropriate resume variant for each role type (see candidate-profile.md for the mapping).
  4. Captcha honesty: If a form stalls behind CAPTCHA, log it as "blocked" -- never inflate submitted counts.
  5. Headless default: Use headless browser by default. Only open visible windows when manual intervention (e.g., CAPTCHA solving) is required.
  6. Email triage: Mark confirmation emails as read after logging. Leave interviews, assessments, and recruiter outreach unread.

Available Scripts

ScriptPurposeInput
scripts/linkedin-easy-apply.jsLinkedIn Easy ApplyJob URL + LinkedIn config JSON
scripts/lever-apply.jsLever ATSJob URL + form config JSON
scripts/greenhouse-apply.jsGreenhouse ATSJob URL + form config JSON
scripts/jobvite-apply.jsJobvite ATSJob URL + form config JSON
scripts/ashby-apply.jsAshby ATSJob URL + form config JSON
scripts/outlook-triage.jsEmail search/read/markCommand + query/index
scripts/outlook-send.jsSend email (Outlook Web via CDP)To + subject + body file
scripts/send-cold-email.jsSend cold email (Gmail via msmtp)JSON payload on stdin or path
scripts/job-dashboard.mjsTerminal dashboard (5-tab TUI + snapshot)Reads CSVs; --snapshot for one-shot
scripts/generate-tailored-cv.mjsRender approved markdown CV → ATS-friendly PDF (headless Chromium)JSON payload on stdin (cv, outputPath, title, format)
scripts/mirror-tracker.mjsCSV → markdown mirror (data/applications.md, data/outreach.md)Reads CSVs; --watch for fs.watch live mirror
scripts/google-sheet-sync.pyAppend to Google SheetCSV file path
scripts/tracker-status-update.pyBatch status updateJSON file path

Exit Codes

All application scripts use consistent exit codes:

  • 0 -- Success (submitted or ready in dry-run mode)
  • 1 -- Crash or unexpected error
  • 2 -- Blocked on unknown required field
  • 3 -- Captcha or submission timeout
  • 4 -- Step limit exceeded (LinkedIn only)

Environment Variables

VariableDefaultPurpose
CDP_URL(none)Connect to existing Chrome via CDP
HEADLESS1Set to 0 for visible browser
PW_CHANNEL(none)Playwright browser channel (e.g., chrome)
KEEP_OPEN_ON_BLOCK0Set to 1 to keep browser open when blocked
CHROME_COOKIE_PATH(none)Path to Chrome Cookies file
SPREADSHEET_ID(none)Google Sheet ID for tracking
SHEET_NAMEJob TrackerGoogle Sheet tab name
LOCAL_TRACKERapplication-tracker.csvPath to local CSV tracker
OUTLOOK_PORT9224Chrome debug port for Outlook

Recommended Companion Skills

The skills below are community-built and complement the 13 bundled skills above:

  • /job-search -- Multi-board job search
  • /tailor-resume -- Resume customization per posting
  • /apply -- AI-assisted ATS form filling (different from bundled /job-apply, which wraps this repo's scripts directly)
  • /interview-prep-generator -- STAR stories and practice questions
  • /resume-ats-optimizer -- ATS keyword optimization
  • /salary-negotiation-prep -- Market rate research

See skills/README.md for the full list and install commands.

gstack

This repo pairs well with gstack — a general-purpose Claude Code skill pack for shipping code. Install gstack once (git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup) and these gstack skills become useful in this repo's workflow:

  • Web browsing: use /browse for all web browsing. Never use mcp__claude-in-chrome__* tools. /connect-chrome + /setup-browser-cookies for authenticated pages (useful for LinkedIn / Outlook flows).
  • Shipping code: /ship to sync main + run tests + push + open PR (this repo pushes direct to main by convention, but /ship still handles the rest). /review for pre-landing paranoid review. /codex for a second-opinion code review.
  • Testing: /qa / /qa-only for systematic QA + fix loops. /browse for one-off dogfooding.
  • Debugging: /investigate for root-cause debugging. /careful / /freeze / /guard / /unfreeze for safety during destructive ops on the trackers / config files.
  • Dev-experience: /devex-review after shipping a new skill — it actually runs the install + first-skill-invocation and scores the onboarding. /plan-devex-review before adding new skills.
  • Post-ship: /document-release to sync README.md / CLAUDE.md / skills/README.md after a skill lands. /retro for the weekly "what did we ship" log.

If gstack isn't installed, those skills are optional — this repo's 13 bundled skills (/job-coach, /job-setup, /job-evaluate, /job-apply, /job-track, /job-triage, /job-status, /job-outreach, /job-followup, /job-dashboard, /job-cv, /job-interview, /job-patterns) work standalone.

File Locations

  • Config templates: config/*.template.*
  • Active configs: config/linkedin-config.json, config/candidate-profile.md, config/answer-bank.md
  • Scripts: scripts/
  • Templates: templates/
  • Documentation: docs/
  • Local tracker: application-tracker.csv (created by setup.sh)
  • Daily logs: submitted-applications-YYYY-MM-DD.md (created per session)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.