/apply
Fill out a job application on Greenhouse, Lever, or Workday
$ npx -y skills add proficientlyjobs/proficiently-claude-skills --skill apply --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/apply
Context preview
The summary Claude sees to decide when to auto-load this skill.
Fill out a job application on Greenhouse, Lever, or Workday
SKILL.md
apply.SKILL.mdname: apply
description: Fill out a job application on Greenhouse, Lever, or Workday
argument-hint: "job URL, 'last' to use most recent job, or 'current' to fill the active browser tab"
Apply Skill
> **Priority hierarchy**: See `shared/references/priority-hierarchy.md` for conflict resolution.
Fill out job application forms on Greenhouse, Lever, and Workday using browser automation.
Quick Start
- `/proficiently:apply` - Start the flow (will ask for a job URL or use the most recent job)
- `/proficiently:apply https://...` - Apply to a specific job posting
- `/proficiently:apply last` - Apply using the most recent job folder
- `/proficiently:apply current` - Fill the application form already open in the active browser tab
File Structure
scripts/
fill-page.md # Form-filling subagent prompt
Data Directory
Resolve the data directory using `shared/references/data-directory.md`.
---
Workflow
Step 0: Check Prerequisites
Resolve the data directory, then check prerequisites per `shared/references/prerequisites.md`. Resume file is required. Load `DATA_DIR/application-data.md` if it exists (created in Step 2 if not).
Step 1: Determine Target Job
Parse `$ARGUMENTS`:
**If a URL:**
- Check if a matching job folder exists in `DATA_DIR/jobs/` (match by company slug in folder name or by URL). If found, load `posting.md`, `resume.md`, `cover-letter.md` from that folder.
- If no match, set up browser per `shared/references/browser-setup.md`, fetch the posting, save it to a new folder at `DATA_DIR/jobs/[company-slug]-[date]/posting.md`.
**If "last" or empty:**
- Find the most recently modified job folder in `DATA_DIR/jobs/`
- Load its `posting.md`, `resume.md`, `cover-letter.md`
- Confirm with the user which job this is for
**If "current":**
- Skip navigation — will use the current browser tab as-is
- Match the tab's URL against saved job folders to load context if possible
Report what's loaded:
Applying to [Role] at [Company].
Step 2: Build/Load Application Data
If `DATA_DIR/application-data.md` exists, read it and load the values.
If it does NOT exist: 1. Extract what you can from the resume: name, email, phone, LinkedIn, location 2. Present extracted data to the user. Ask them to confirm and fill in gaps: work authorization, visa sponsorship, EEO preferences (default all EEO to "Decline to self-identify") 3. Save to `DATA_DIR/application-data.md` using this format:
# Application Data
## Personal Information
- First Name: ...
- Last Name: ...
- Email: ...
- Phone: ...
- City: ...
- Country: United States
## Online Profiles
- LinkedIn: ...
- GitHub: ...
- Portfolio: ...
## Standard Answers
- How did you hear about us: Job Board
- Previously worked at this company: No
- Authorized to work in the US: Yes
- Requires visa sponsorship: No
## EEO / Voluntary Disclosures
- Gender: Decline to self-identify
- Race/Ethnicity: Decline to self-identify
- Veteran status: I am not a veteran
- Disability: I don't wish to answer
Step 3: Navigate to Application Form and Scout Requirements
Set up browser per `shared/references/browser-setup.md` (`tabs_context` → `tabs_create` → `navigate`).
**If `$ARGUMENTS` is "current"**: Skip navigation. Call `tabs_context_mcp` to get the active tab.
**Otherwise**, detect ATS type from URL patterns (see `shared/references/ats-patterns.md`) and navigate accordingly:
**Lever** (`jobs.lever.co/...`):
- Navigate to the posting URL with `/apply` appended, or navigate to the posting and click "APPLY FOR THIS JOB"
**Greenhouse** (`boards.greenhouse.io/...` or page with `grnhse_iframe`):
- Navigate to the posting URL
- Extract iframe tokens via `javascript_tool`:
const iframe = document.getElementById('grnhse_iframe');
const url = new URL(iframe.src);
JSON.stringify({
boardToken: url.searchParams.get('for'),
jobToken: url.searchParams.get('token')
});- Navigate to direct form URL: `https://job-boards.greenhouse.io/embed/job_app?for={boardToken}&token={jobToken}`
**Workday** (`*.myworkdayjobs.com/...`):
- Navigate to the posting. Click "Apply Now".
- If a landing page appears with Autofill/Manual options, click "Apply Manually".
- If an auth gate appears, **tell the user to sign in, then say "continue" when ready**. Account creation is a prohibited action — the user must handle authentication themselves.
**Unknown ATS**:
- Navigate to the URL, take a screenshot
- Attempt to identify the form. If unrecognizable, tell the user and ask for guidance.
**Scout the form.** Once on the application form, do a quick scan (`read_page(filter="interactive")` or scroll through for Workday) to determine:
- Does the form have a **resume/CV upload** field?
- Does the form have a **cover letter** upload or text field?
- Are there any **unusual required fields** that need special attention?
Record these requirements — they determine what materials to generate in Step 4.
Step 4: Generate Missing Materials
The goal is to have everything ready before filling, so the user does minimal work.
**Always tailor the resume.** Check if `DATA_DIR/jobs/[job-folder]/resume.md` exists for this job:
- If YES: the resume is already tailored for this role. Skip.
- If NO: Run the tailor-resume skill inline. Follow the workflow in `skills/tailor-resume/SKILL.md` — use the job posting (already loaded), the original resume, and the work history profile to generate a tailored resume. Save to the job folder. Present it to the user for quick review before continuing.
**Generate a cover letter only if the form requires one.** If the scout in Step 3 found a cover letter field:
- Check if `DATA_DIR/jobs/[job-folder]/cover-letter.md` exists
- If YES: already done. Skip.
- If NO: Run the cover-letter skill inline. Follow the workflow in `skills/cover-letter/SKILL.md` — use the posting, tailored resume, and profile. Save to the job folder. Present it for quick review.
**If the f
Read more
name: apply description: Fill out a job application on Greenhouse, Lever, or Workday argument-hint: "job URL, 'last' to use most recent job, or 'current' to fill the active browser tab"
Apply Skill
> **Priority hierarchy**: See `shared/references/priority-hierarchy.md` for conflict resolution.
Fill out job application forms on Greenhouse, Lever, and Workday using browser automation.
Quick Start
- `/proficiently:apply` - Start the flow (will ask for a job URL or use the most recent job)
- `/proficiently:apply https://...` - Apply to a specific job posting
- `/proficiently:apply last` - Apply using the most recent job folder
- `/proficiently:apply current` - Fill the application form already open in the active browser tab
File Structure
scripts/ fill-page.md # Form-filling subagent prompt
Data Directory
Resolve the data directory using `shared/references/data-directory.md`.
---
Workflow
Step 0: Check Prerequisites
Resolve the data directory, then check prerequisites per `shared/references/prerequisites.md`. Resume file is required. Load `DATA_DIR/application-data.md` if it exists (created in Step 2 if not).
Step 1: Determine Target Job
Parse `$ARGUMENTS`:
**If a URL:**
- Check if a matching job folder exists in `DATA_DIR/jobs/` (match by company slug in folder name or by URL). If found, load `posting.md`, `resume.md`, `cover-letter.md` from that folder.
- If no match, set up browser per `shared/references/browser-setup.md`, fetch the posting, save it to a new folder at `DATA_DIR/jobs/[company-slug]-[date]/posting.md`.
**If "last" or empty:**
- Find the most recently modified job folder in `DATA_DIR/jobs/`
- Load its `posting.md`, `resume.md`, `cover-letter.md`
- Confirm with the user which job this is for
**If "current":**
- Skip navigation — will use the current browser tab as-is
- Match the tab's URL against saved job folders to load context if possible
Report what's loaded:
Applying to [Role] at [Company].
Step 2: Build/Load Application Data
If `DATA_DIR/application-data.md` exists, read it and load the values.
If it does NOT exist: 1. Extract what you can from the resume: name, email, phone, LinkedIn, location 2. Present extracted data to the user. Ask them to confirm and fill in gaps: work authorization, visa sponsorship, EEO preferences (default all EEO to "Decline to self-identify") 3. Save to `DATA_DIR/application-data.md` using this format:
# Application Data ## Personal Information - First Name: ... - Last Name: ... - Email: ... - Phone: ... - City: ... - Country: United States ## Online Profiles - LinkedIn: ... - GitHub: ... - Portfolio: ... ## Standard Answers - How did you hear about us: Job Board - Previously worked at this company: No - Authorized to work in the US: Yes - Requires visa sponsorship: No ## EEO / Voluntary Disclosures - Gender: Decline to self-identify - Race/Ethnicity: Decline to self-identify - Veteran status: I am not a veteran - Disability: I don't wish to answer
Step 3: Navigate to Application Form and Scout Requirements
Set up browser per `shared/references/browser-setup.md` (`tabs_context` → `tabs_create` → `navigate`).
**If `$ARGUMENTS` is "current"**: Skip navigation. Call `tabs_context_mcp` to get the active tab.
**Otherwise**, detect ATS type from URL patterns (see `shared/references/ats-patterns.md`) and navigate accordingly:
**Lever** (`jobs.lever.co/...`):
- Navigate to the posting URL with `/apply` appended, or navigate to the posting and click "APPLY FOR THIS JOB"
**Greenhouse** (`boards.greenhouse.io/...` or page with `grnhse_iframe`):
- Navigate to the posting URL
- Extract iframe tokens via `javascript_tool`:
const iframe = document.getElementById('grnhse_iframe');
const url = new URL(iframe.src);
JSON.stringify({
boardToken: url.searchParams.get('for'),
jobToken: url.searchParams.get('token')
});- Navigate to direct form URL: `https://job-boards.greenhouse.io/embed/job_app?for={boardToken}&token={jobToken}`
**Workday** (`*.myworkdayjobs.com/...`):
- Navigate to the posting. Click "Apply Now".
- If a landing page appears with Autofill/Manual options, click "Apply Manually".
- If an auth gate appears, **tell the user to sign in, then say "continue" when ready**. Account creation is a prohibited action — the user must handle authentication themselves.
**Unknown ATS**:
- Navigate to the URL, take a screenshot
- Attempt to identify the form. If unrecognizable, tell the user and ask for guidance.
**Scout the form.** Once on the application form, do a quick scan (`read_page(filter="interactive")` or scroll through for Workday) to determine:
- Does the form have a **resume/CV upload** field?
- Does the form have a **cover letter** upload or text field?
- Are there any **unusual required fields** that need special attention?
Record these requirements — they determine what materials to generate in Step 4.
Step 4: Generate Missing Materials
The goal is to have everything ready before filling, so the user does minimal work.
**Always tailor the resume.** Check if `DATA_DIR/jobs/[job-folder]/resume.md` exists for this job:
- If YES: the resume is already tailored for this role. Skip.
- If NO: Run the tailor-resume skill inline. Follow the workflow in `skills/tailor-resume/SKILL.md` — use the job posting (already loaded), the original resume, and the work history profile to generate a tailored resume. Save to the job folder. Present it to the user for quick review before continuing.
**Generate a cover letter only if the form requires one.** If the scout in Step 3 found a cover letter field:
- Check if `DATA_DIR/jobs/[job-folder]/cover-letter.md` exists
- If YES: already done. Skip.
- If NO: Run the cover-letter skill inline. Follow the workflow in `skills/cover-letter/SKILL.md` — use the posting, tailored resume, and profile. Save to the job folder. Present it for quick review.
**If the f
A Claude Code plugin for AI-powered job searching, resume tailoring, and cover letter writing. Built by Proficiently. Want someone to handle your entire job search?
Other skills on proficiently.
- /cover-letter
Write a tailored cover letter for a specific job posting
Open skill - /job-search
Search for jobs matching my resume and preferences
Open skill - /jobsearch-telegram
Poll Telegram for job search messages — apply to jobs, search for roles, check status, all via chat
Open skill - /network-scan
Scan your LinkedIn contacts' companies for matching job openings
Open skill - /setup
One-time onboarding - upload resume, set preferences, and do a work history interview
Open skill - /tailor-resume
Tailor your resume for a specific job posting
Open skill

