| name | job:apply |
| description | Apply to the next suitable job from your queue. Picks the next pending role from job_search.md, verifies the posting is live, fetches the JD, presents the link and how to apply — then (after user confirms) adapts the CV and generates a PDF. Updates status and source stats after user confirms they applied. |
| argument-hint | [optional: company name or # to apply to a specific role] |
| user-invocable | true |
| disable-model-invocation | false |
Apply Next
Job tracking file
~/.claude/job_search.md
CV skill
job:cv — call after user confirms they want to apply.
Workflow — follow this order exactly
Step 1 — Pick the next role
Read job_search.md:
- Find the first role with
status = pending in the ## Status table, following the queue order in ## Queue.
- If an argument was given (company name or #), use that role instead.
Step 2 — Verify the posting is live
Before doing anything else with the CV:
- Find the apply URL for the role (from the Notes column, or search if not listed:
"<Company>" "<Role>" job site:jobs.ashbyhq.com OR site:lever.co OR site:greenhouse.io OR site:wellfound.com).
- Fetch or search the URL to confirm the job page shows a real posting — NOT "Job not found", "No jobs found", or a 404.
- If closed/removed:
- Update
job_search.md: set status to closed, add reason in Notes, mark [x] in Queue.
- Do not adapt the CV. Announce "Closed — moving to next" and repeat from Step 1 with the next pending role.
- If open: continue to Step 3.
Step 3 — Extract the JD
Fetch the job description:
- Requirements, responsibilities, tech stack, salary range, timezone/location policy.
- Note any "not a fit" criteria that might be a blocker (US-only visa, specific language required, etc.).
- If there's a blocker → close the role and move on (same as Step 2 closed case).
Step 4 — Present to user (STOP here and wait)
Show:
**#N — Company — Role**
💰 Salary: ...
🌍 Location: ...
🛠 Stack: ...
✅ Why it fits: ...
🔗 Apply: <URL>
📋 How to apply: [describe: form / email / LinkedIn / etc.]
Then ask: "Shall we apply?"
Do NOT start adapting the CV until the user confirms. Wait for confirmation ("yes", "go", "let's do it", or similar).
Step 5 — Adapt the CV
After user confirms:
- Invoke
job:cv with the company name and key JD signals as argument.
job:cv handles: archive → edit → generate PDF → open in Preview.
- Show the user the diff summary (what changed in the CV).
Step 6 — Wait for apply confirmation
After CV is ready, ask: "Did you apply?"
When user confirms (says "yes", "sent", "applied", etc.):
- Update
job_search.md Status table:
- Set status to
applied
- Add date to Notes:
YYYY-MM-DD
- Mark
[x] in Queue
- Update
## Sources — Effectiveness Tracker:
- Increment
Applied for the role's source
- Confirm: "Done, marked as applied. Next?"
Step 7 — Offer to continue
Ask if they want to move to the next role or stop.
Status update rules
| Event | What to update |
|---|
| Role closed/removed | status → closed, mark [x] in Queue, add reason to Notes |
| Role skipped (stack mismatch, geo block, etc.) | status → skipped, mark [x] in Queue, add reason to Notes |
| CV adapted, waiting to apply | status stays pending (do NOT mark applied yet) |
| User confirms they applied | status → applied, add date, increment source Applied count |
| Got response (recruiter reached out) | status → response, update Notes, increment source Response count |
| Got interview invite | status → interview, update Notes, increment source Interview count |
CRITICAL: Never mark applied until user explicitly confirms they submitted the application.
Queue order
Follow the order in ## Queue. Top = highest priority. Unchecked [ ] = pending.
Notes on common apply flows
- Ashby form (jobs.ashbyhq.com): fill form on page, attach PDF CV
- Email (e.g. jobs@company.com): send email with CV attached, subject "Senior [Role] — [Your Name]"
- LinkedIn Easy Apply: use LinkedIn, attach PDF
- Greenhouse / Lever: fill form, attach PDF