From jobpilot
Applies to multiple jobs from a file of URLs: visits each page, extracts details, scores against resume, presents ranked batch for approval, then submits autonomously.
npx claudepluginhub suxrobgm/jobpilotThis skill uses the workspace's default tool permissions.
You apply to multiple jobs from a user-provided file of URLs. You visit each job page, extract details, score against the user's resume, present a ranked batch for approval, then apply to every approved job autonomously.
Automates filling job applications on Greenhouse, Lever, and Workday via browser automation with resume, cover letter, and personal data. Handles job URLs, recent jobs, or current tab.
Automates job searches and applications on LinkedIn, Indeed, Glassdoor, ZipRecruiter, Wellfound. Generates cover letters, fills forms, tracks status. Use for 'find and apply to jobs'.
Scans company career pages for job openings matching your profile using site-scoped web searches on ATS platforms like Greenhouse, Lever, Ashby, SmartRecruiters. Invoke for 'scan for jobs' or 'find openings at'.
Share bugs, ideas, or general feedback.
You apply to multiple jobs from a user-provided file of URLs. You visit each job page, extract details, score against the user's resume, present a ranked batch for approval, then apply to every approved job autonomously.
Read and follow the instructions in ${CLAUDE_PLUGIN_ROOT}/skills/_shared/setup.md to load the profile, resume, and credentials.
Read the autopilot section from profile.json for shared settings. Apply these defaults for any missing fields:
| Setting | Default | Description |
|---|---|---|
minMatchScore | 6 | Minimum score (1-10) to include in batch |
maxApplicationsPerRun | 10 | Max jobs to apply to |
confirmMode | "batch" | "batch" = review before applying. "auto" = skip confirmation when ALL jobs score >= minMatchScore. |
salaryExpectation | "" | Auto-fill salary expectation fields |
defaultStartDate | "2 weeks notice" | Default answer for start date fields |
# (comments)Create a run file at ${CLAUDE_PLUGIN_ROOT}/runs/<run-id>.json where <run-id> is YYYY-MM-DDTHH-MM-SS_batch-apply.
Initialize with:
{
"runId": "<run-id>",
"query": "batch-apply from <filename>",
"config": {
"minMatchScore": <resolved value>,
"maxApplications": <resolved value>,
"source": "apply-batch"
},
"status": "in_progress",
"startedAt": "<ISO timestamp>",
"updatedAt": "<ISO timestamp>",
"completedAt": null,
"jobs": [],
"summary": {
"totalFound": 0,
"qualified": 0,
"applied": 0,
"failed": 0,
"skipped": 0,
"remaining": 0
}
}
For each URL:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/check-applied.sh "<job-url>"
If already-applied, add to the run file as status: "skipped" with skipReason: "Already applied (found in applied-jobs database)". Move to the next URL.
browser_navigate to open the URL.browser_snapshot with a targeted ref to read the job listing content.${CLAUDE_PLUGIN_ROOT}/skills/_shared/auth.md to authenticate first, then re-read.Assign a match score (1-10) based on:
Add the job to the run file with status: "pending", the score, and matchReason.
Filter out jobs below minMatchScore -> set status: "skipped", skipReason: "Below minimum match score (X < Y)".
confirmMode: "auto")If confirmMode is "auto" AND every qualified job has a match score >= minMatchScore:
status: "approved" automatically.confirmMode: "batch", or auto mode fallback)Present all qualified jobs in a ranked table:
## Batch Apply: <filename>
Visited <total> jobs. <qualified> qualify (score >= <minMatchScore>/10).
| # | Score | Title | Company | Location | Source |
|---|-------|-------|---------|----------|--------|
| 1 | 9/10 | Senior Full Stack Dev | Acme Corp | Remote | Greenhouse |
| 2 | 8/10 | Full Stack Engineer | StartupCo | Portland, ME | Lever |
Applying to up to <maxApplications> jobs.
**Commands:**
- "go" -- apply to all qualified jobs
- "go 1,3,5" -- apply only to specific jobs
- "remove 3" -- exclude specific jobs
- "details 2" -- show full job description and URL before deciding
- "stop" -- cancel the run
Process the user's response:
status: "approved"approved, rest as skipped with skipReason: "Not selected by user"skipped with skipReason: "Removed by user", re-present tablestatus: "paused", save, and stopFor each job with status: "approved", in order of match score (highest first):
"applying" via the update script.browser_navigate to open the job URL.browser_snapshot to assess the page.Determine the page type:
After clicking Apply, use browser_wait_for for page load, then browser_snapshot to reassess.
Read and follow the instructions in ${CLAUDE_PLUGIN_ROOT}/skills/_shared/auth.md.
Read and follow the instructions in ${CLAUDE_PLUGIN_ROOT}/skills/_shared/form-filling.md.
Batch-specific overrides:
autopilot.salaryExpectation from config if set. Otherwise ask on first encounter and remember for the rest.autopilot.defaultStartDate from config.Submit without per-job confirmation. The user already approved the batch in Phase 3.
browser_wait_for to confirm submission.On success:
"applied" and set appliedAt.bash ${CLAUDE_PLUGIN_ROOT}/scripts/log-applied.sh "<job-url>" "<title>" "<company>" "apply-batch" "<run-id>"
On failure:
failReason with a clear description.retryNotes with actionable context for future retry.If summary.applied >= config.maxApplications, mark remaining approved jobs as skipped with skipReason: "Max applications limit reached". End the loop.
Use the update script for all status changes:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/update-run.sh <run-file> job <job-id> status applied
bash ${CLAUDE_PLUGIN_ROOT}/scripts/update-run.sh <run-file> summary
Do NOT read the full progress file to update it.
status: "completed" and completedAt.## Batch Apply Complete: <filename>
| Metric | Count |
|--------|-------|
| Jobs in file | <total> |
| Qualified | <qualified> |
| Applied | <applied> |
| Failed | <failed> |
| Skipped | <skipped> |
### Successfully Applied
- #1 Senior Full Stack Dev at Acme Corp (9/10)
### Failed (can retry)
- #2 Backend Dev at BigCo -- CAPTCHA required
### Skipped
- #3 Junior Dev at SmallCo -- Below minimum match score (4 < 6)
Progress saved to: runs/<run-id>.json
failed with failReason: "Payment required".auth.md).Read and follow ${CLAUDE_PLUGIN_ROOT}/skills/_shared/browser-tips.md for handling large pages, popups, and general browser best practices.