agentleFS
Sign inSign up

autopilot-jobhunt

tarunlnmiit/autopilot-jobhunt/CLAUDE.md

AI job agent: scans 130+ company careers pages nightly, scores every role against your resume with an LLM (0–100), sends top matches via Telegram, and drafts tailored cover letters + resume bullets on demand. See SETUP.md §7 for the full setup. Quick reference:

CLAUDE.md208 starsChanged 3 months ago
  • Reads credentials
# autopilot-jobhunt

AI job agent: scans 130+ company careers pages nightly, scores every role against your resume with an LLM (0–100), sends top matches via Telegram, and drafts tailored cover letters + resume bullets on demand.

## Key commands

```bash
autopilot scan              # discover jobs, score with LLM, send Telegram notification
autopilot draft 1           # draft cover letter + resume for job #1 from last scan
autopilot draft https://... # draft for a specific job URL
autopilot export            # export last scan to CSV
autopilot export --min 70   # export only jobs with score >= 70
autopilot export --days 7   # export jobs from the past 7 days

python -m job_hunt.mcp_server  # start the MCP server (Claude Code / Claude Desktop)
```

## Config files

| File | Controls | Gitignored? |
|---|---|---|
| `config.json` | Candidate profile, LLM settings, Telegram | Yes — copy from `config.example.json` |
| `.env` | API keys (TinyFish, OpenRouter, Telegram) | Yes — copy from `.env.example` |
| `companies.json` | List of companies to scan | No — committed, edit freely |
| `resume/YOUR_RESUME.md` | Your resume text (Markdown) | Yes — template committed |

## Package structure

```
job_hunt/
  scanner.py    — TinyFish API job discovery + LLM scoring pipeline
  drafter.py    — cover letter + tailored resume bullet generation
  notifier.py   — Telegram notification sender (optional, graceful if unconfigured)
  llm_utils.py  — LLM dispatch: OpenRouter (default), Anthropic API, or Claude Code CLI
  tools.py      — protocol-agnostic tool layer (wraps scanner/drafter/exporter)
  mcp_server.py — FastMCP server exposing scan_jobs, draft_application, export_jobs
  main.py       — CLI entry point (autopilot command)
```

## Rate limits (free tier)

### TinyFish (job discovery)

- **Search:** 5 requests/min — scanner auto-paces, sleeps between batches
- **URL fetch:** 25 requests/min — auto-paced, no action needed
- **Free tier:** completely free, no credit card, no daily cap
- **Scan duration:** 30–90 min for 130+ companies is normal — deliberate pacing, not a bug
- **"No new jobs found":** TinyFish found no postings matching the query for that company today — not an error

### OpenRouter (LLM scoring + drafting)

- **Free tier:** no credit card needed, but each model has a **daily quota** (resets midnight UTC)
- **Fallback chain** (tried in order, auto-skips on quota exhaustion):
  1. `meta-llama/llama-3.3-70b-instruct:free` — primary
  2. `nvidia/nemotron-3-super-120b-a12b:free` — fallback 1
  3. `google/gemma-4-31b-it:free` — fallback 2
  4. `qwen/qwen3-coder:free` — fallback 3
- **Calls per scan:** ~5–15 LLM calls (jobs scored in batches of 10) — one nightly scan stays within all four models' free limits
- **"All LLM models failed":** all 4 models hit their daily quota — wait for midnight UTC reset, or add a small OpenRouter credit ($1–5) to remove the cap
- **Multiple scans/day:** risks exhausting free-tier quota — run once nightly via cron
- Check live per-model limits: [openrouter.ai/models](https://openrouter.ai/models)

### Claude Code CLI (LLM backend — no API key needed)

- **Cost:** uses your Claude subscription (Pro/Team/Enterprise)
- **Setup:** `claude auth login` — no API key required
- **Activate:** set `"llm_provider": "claude_cli"` in `config.json` or `LLM_PROVIDER=claude_cli` in `.env`
- **Model:** set `"claude_cli_model": "sonnet"` (or `"opus"`, `"haiku"`) — empty = Claude's default
- **Rate limits:** governed by your subscription tier, not a daily free quota
- **Cron / MCP note:** subprocess inherits user session auth — verify with `claude --print "hi"` in the same shell context before scheduling

## MCP registration (Claude Code)

See [SETUP.md §7](SETUP.md#step-7--register-with-claude-code-mcp) for the full setup.

Quick reference:
```bash
claude mcp add autopilot-jobhunt \
  --env TINYFISH_API_KEY=your_key \
  --env OPENROUTER_API_KEY=your_key \
  -- python -m job_hunt.mcp_server
# Then add "cwd": "/path/to/autopilot-jobhunt" in ~/.claude.json
```

MCP tools exposed: `scan_jobs`, `draft_application(job_ref)`, `export_jobs(min_score, days)`

## State files (gitignored)

- `state/last_scan.json` — job results from the most recent scan
- `output/` — drafted cover letters and resume files
- `scan.log` — scan activity log (when using cron)

Discussion

Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.

Posts are public.Sign in to post

No one has posted yet. Be the first.