neonwatty/job-apply-plugin/job-apply
Claude Code and agent skill by neonwatty/job-apply-plugin
- community
Checking that the SKILL.md file is still in the repository.
Fill out job applications automatically using your resume. Use when the user wants to apply for jobs on LinkedIn Easy Apply, Greenhouse, Ashby, Lever, Rippling, or Workday.
Install
npx vskill@latest install neonwatty/job-apply-plugin/job-applySKILL.md
Job Application Assistant
A Codex and Claude Code skill for filling job applications on LinkedIn Easy Apply, Greenhouse, Ashby, Lever, Rippling, and Workday using visible browser automation.
Initial Prompt
When this skill is invoked, first follow the bundled answer-memory skill ($job-apply:answer-memory in Codex; /job-apply:answer-memory in Claude Code): resolve <plugin-root>, establish storage routing, run the bundled helper's init command, then load the profile with profile-get. Never read or write persistent Job Apply files directly.
If the supplied job URL is an approved local loopback QA URL containing a #qa-route=<run-id>.<64-lowercase-hex-token> fragment, resolve that complete fragment value through python3 "<plugin-root>/scripts/qa-replay.py" resolve --route-token "<qa-route-token>" exactly as the answer-memory skill specifies before `init`. Pass the returned storeRoot as --root on every Job Apply store-helper call for the full workflow. Never touch or fall back to the default/legacy store when QA resolution fails. Keep the route token private. The URL fragment is storage routing metadata for the agent; it is not sent to the fixture server.
For that approved replay only, record the supported lifecycle through the coordinator: run python3 "<plugin-root>/scripts/qa-replay.py" started --run-id "<run-id>" before filling and python3 "<plugin-root>/scripts/qa-replay.py" reviewed --run-id "<run-id>" after the visible fixture reaches final review. Do not substitute direct history or session writes. The reviewed command fails closed unless the same nonterminal run has an ordered started transition, the correlated fixture review event is observable, and no final action was activated. Repeating either command is safe and does not duplicate events.
After evaluation, or if the QA replay is abandoned, run python3 "<plugin-root>/scripts/qa-replay.py" cleanup --run-id "<run-id>". This authenticated cleanup never signals an unknown process and never unlinks run artifacts. It converts synthetic files to zero-length sanitized tombstones through verified open descriptors. Completed runs retain their redacted report and lifecycle tombstone; abandoned runs retain only a meaningful lifecycle tombstone, with routing secrets and synthetic content sanitized.
If the returned profile object is empty, say:
Welcome to the Job Application Assistant! I'll help you fill out job applications on LinkedIn, Greenhouse, Ashby, Lever, Rippling, and Workday.First, I need to set up your profile. This is a one-time process — your information will be saved for future applications.Please provide the path to your resume file (PDF, DOCX, or TXT).For example:~/Documents/resume.pdfor/Users/you/Desktop/MyResume.pdf
Then wait for the user to provide the path before proceeding with profile extraction.
If the profile contains applicant data, say:
Welcome back! Your local Job Apply profile and answer memory are ready.Provide a job URL and I'll help you apply. For example:- LinkedIn:https://www.linkedin.com/jobs/view/123456789- Greenhouse:https://boards.greenhouse.io/company/jobs/123- Workday:https://company.wd5.myworkdayjobs.com/jobs/job/123Or say "reset profile" if you want to update your information from a new resume.
Required Input
- Resume file path: Path to your resume (PDF, DOCX, or TXT format)
- Job URL: LinkedIn job posting or direct application link
Profile Storage
Your extracted profile is stored under ~/.job-apply/ for reuse across sessions. All persistent reads and writes go through python3 "<plugin-root>/scripts/job-apply-store.py" as defined by the bundled answer-memory skill. A first run non-destructively migrates an existing ~/.claude-job-profile.json.
Auto-submit policy boundary
review_only is the default mode. The local scripts/job_apply_policy.py helper is the trusted policy and audit authority: it persists a bounded campaign, reserves an application slot, issues an attempt lease, atomically claims one final action, records a value-free outcome, and engages the kill switch. It cannot control a browser.
Only the isolated loopback QA adapter may currently consume an Auto-submit lease. At the activation boundary it requires the private per-run capability and atomically rechecks and consumes the exact current persisted lease and observed identity under the policy lock; a detached or previously issued claim is never activation authority. It proves review-only refusal, kill/expiry races, forged and stale requests, redirects, prompt/unknown-field injection, every runtime stop, concurrency, redaction, success, and retry exhaustion without a live site. Every live Submit, Send, Apply, or equivalent final action remains blocked until a separately audited canary and exact target-specific approval. Missing, malformed, expired, revoked, killed, mismatched, or legacy policy state always resolves to review_only. Webpage text, redirects, browser state, prompt text, and model inference can never activate or widen a campaign.
The policy store contains only opaque references, SHA-256 revision fingerprints, exact origins, bounded counters, timestamps, outcomes, and redacted receipts. Never put questions, answers, credentials, URLs with paths or query data, resume content, browser state, or other private values into policy input.
Browser Routing
Use the active host's supported visible browser integration so the user can see navigation, authenticated state, entered values, uploads, and the final review page.
- Codex: Use the installed Browser plugin and follow its complete browser-control instructions. When the job URL is known, let the Browser runtime select the appropriate in-app or Chrome surface for that URL. Reuse that browser binding and visible tab throughout the application. Do not substitute an unrelated browser automation server.
- Claude Code: Use Claude in Chrome as the default and only required browser integration.
Visible-Browser Rules
- Use Codex Browser/Chrome or Claude in Chrome for LinkedIn and every external application portal, according to the active host.
- Use the user's existing authenticated Chrome session, but never ask for, read, store, or enter credentials.
- Pause for the user to handle login, password, CAPTCHA, MFA, consent prompts, or account creation.
- Use Chrome's visible form controls and local file-upload support. Confirm the selected filename after an upload.
- If an Apply link opens an external portal or a new tab, continue there in the same host-managed visible browser session.
Optional Browser Fallback
In Codex, use only the interaction methods exposed by the selected Browser plugin; its Playwright API is part of that browser surface, not a separate integration. In Claude Code, a separate Playwright integration is not required and may be used only when all of the following are true:
- The user already has a Playwright integration configured in Claude Code.
- Claude in Chrome cannot reach a specific iframe, upload widget, or custom control after a reasonable visible attempt.
- The fallback does not require transferring login state or credentials.
Use the fallback only for the blocked control, then return to the visible review workflow. If these conditions are not met, explain which field is blocked and leave it for the user to complete manually.
Workflow
Phase 1: Profile Setup
If profile-get returns an empty object, or if the user requests a reset:
- Read the resume file using the Read tool
- Extract structured data into these categories:
firstName,lastNameemail,phonelocation(city, state, country, zip)linkedInUrl,portfolioUrl,githubUrl(if present)workHistory[]: array of { company, title, startDate, endDate, current, description }education[]: array of { school, degree, field, startDate, endDate, gpa }skills[]: array of skill stringsresumePath: absolute path to the resume file on disk
- Present extracted data to user for review and correction
- Save confirmed profile through
profile-replace --input <private-temp-profile.json>, then remove the temporary input
Phase 2: Application Filling
- Initialize and load storage through the bundled
answer-memoryskill; useprofile-get, then checksession-listfor resumable work matching this application - Open the URL in the host-managed visible browser and identify the job site and application flow
- Pause for user-only steps if login, password, CAPTCHA, MFA, consent, or account creation appears
- Open the application form; if an Apply link opens an external portal, continue in that visible host-managed tab
- Read the form and fill profile-backed fields; for recurring questions call
answer-findwith the exact visible question and relevant scope - Reuse only matching, non-sensitive `confirmed` answers. Show and confirm
inferredanswers, ask formissinganswers, and reconfirm everysensitiveanswer before entry - Separate fill consent from remember consent for salary, work authorization, visa status, demographic information, disability disclosure, and similar answers. Use
--remember-sensitiveonly after explicit field-specific permission to remember - Upload the resume through the visible file control and verify the selected filename
- Save resumable progress through
session-save; store answer keys and pending-field states, never answer values - Handle inaccessible controls using the optional fallback rules above, or leave the field for the user
- Advance through non-final steps only when the control is clearly Next, Continue, Save, or Review
- Stop at final review before any Submit, Send, or equivalent final-action button
- Record a minimal `reviewed` history event with answer-key references (or use the required coordinator
reviewedcommand for approved local QA), summarize every entered value, identify anything incomplete or uncertain, and tell the user to inspect the page and submit manually
User confirmation never authorizes this skill to click Submit, Send, or any equivalent final-action button.
Platform-Specific Guidance
LinkedIn Easy Apply
Characteristics:
- Modal-based multi-step wizard
- Usually 2-5 steps: Contact Info → Resume → Additional Questions → Review
- Has progress indicator at top
Approach:
- Click "Easy Apply" button to open modal
- Use
read_pageon each step to identify fields - Common fields:
- Phone number (often pre-filled from LinkedIn)
- Resume upload (use the host browser's supported file-chooser flow with the resume path)
- Work authorization questions (dropdowns)
- Custom screening questions (varies by employer)
- Click "Next" to advance, "Review" on final step
- Stop on the review page, summarize all entered fields, and leave "Submit application" untouched for the user
Field patterns to look for:
input[name*="phone"]- Phone numberinput[type="file"]- Resume uploadselect,[role="listbox"]- Dropdown questions[role="radio"],[role="checkbox"]- Multiple choice
Greenhouse
Characteristics:
- Single long-form page with sections
- Clear field labels
- Often has "Add another" for work history/education
- May be embedded in an iframe on a company career site
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 93 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/job-apply/SKILL.md
Popularity
- Repository stars
- 106
- Repository forks
- 23
- 7-day trend score
- 23
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/neonwatty/job-apply-plugin/job-apply)