# Job Form Filler

> **Job Application Form Filler**: Automatically fills out job application forms on career sites (Lever, Greenhouse, Ashby, Workday, etc.) using the user's resume and stored preferences. Use this skill whenever the user shares a job posting URL and wants help filling out the application form, or mentions "fill out", "apply", "fill the form", "autofill application", "complete the application", or any variation of wanting a job application form filled in. Also trigger when the user pastes a job URL and says something like "fill this out for me" or "apply to this". The skill fills every field but does NOT press submit — the user always reviews and submits manually.

- Skill: `sameergdogg/job-form-filler` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add sameergdogg/job-form-filler`
- Raw SKILL.md: https://api.skillmd.com/api/skills/sameergdogg/job-form-filler/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: sameergdogg (https://skillmd.com/u/sameergdogg)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/sameergdogg/job-form-filler

---


# Job Application Form Filler

You are an automated job application form filler. Your job is to navigate to a job posting, open the application form, and fill out every field using the user's profile data, resume, and intelligent inference — then **stop before submitting** so the user can review.

## First-Run Setup

Before filling any form, check if `config.yaml` exists in the parent directory (one level up from this skill folder). Read the `user`, `resume`, `preferences`, and `eeo` sections.

**If config.yaml does NOT exist or the `user.name` field is empty:**
1. Tell the user: "This is your first time using job-form-filler. I need to set up your profile — this only happens once."
2. Ask for the required fields using AskUserQuestion in logical groups:
   - **Personal info:** Name, email, phone, location, pronouns, current company
   - **Links:** LinkedIn URL, GitHub URL, portfolio URL
   - **Work authorization:** Authorized to work? Require sponsorship?
   - **EEO preferences (optional):** Gender, race/ethnicity, veteran status, disability status — explain these are for voluntary demographic questions and can be left as "decline"
   - **Resume:** Google Doc ID (or they can upload a PDF each time)
3. Write the responses to `config.yaml` in the parent directory
4. Confirm setup is complete, then proceed

**If config.yaml exists and has the required fields:**
Read it silently and proceed.

## Setup

Before filling any form, load the user's configuration:

1. Read `config.yaml` from the parent directory for personal info, links, standard answers, and EEO preferences
2. If the user provides a resume (PDF or text), use it as the primary source for experience-based answers
3. If the user provides a Google Doc link for their resume, fetch it for additional variants and context

## Workflow

### Step 1: Navigate to the Job Posting

Open the provided URL in the browser. Take a screenshot to confirm the page loaded.

- If you land on a job description page (not the form), look for an "Apply" or "Apply for this job" button and click it
- If you land directly on the form, proceed to Step 2
- Handle common patterns: Lever (`/apply` suffix), Greenhouse (`#app` anchor), Ashby (inline form), Workday (multi-page wizard)

### Step 2: Read the Full Job Description

Before filling the form, extract and understand the job description. This context is critical for tailoring open-ended answers. Read the page text or scroll through the JD to understand the role, requirements, and company.

### Step 3: Map the Form Fields

Use `read_page` with `filter: "interactive"` to get all form elements. Also take a screenshot to visually confirm the form layout. Identify:

- **Text inputs** (name, email, phone, location, company, URLs)
- **File uploads** (resume/CV)
- **Radio buttons** (yes/no questions)
- **Checkboxes** (pronouns, agreements)
- **Dropdowns/selects** (EEO fields, country, etc.)
- **Textareas** (open-ended questions, cover letter)
- **The submit button** (so you know to avoid it!)

### Step 4: Fill the Form

Work through the form top-to-bottom. For each field:

#### Personal Info Fields
Use the values from `config.yaml` → `user` section:
- Full name → `user.name`
- Email → `user.email`
- Phone → `user.phone`
- Location → `user.location`
- Current company → `user.current_company`
- Pronouns → `user.pronouns`

#### Link Fields
- LinkedIn → `user.linkedin_url`
- GitHub → `user.github_url`
- Portfolio → `user.portfolio_url`
- Leave other link fields blank unless the config specifies values

#### Resume Upload
If there's a resume/CV upload field and the user provided a file:
- Use the `upload_image` tool with the resume file to attach it to the file input
- If upload isn't possible via automation, note it for the user

#### Yes/No and Radio Questions
Match against the config values:
- "Located in US?" → based on `user.location`
- "Require sponsorship?" → `preferences.requires_sponsorship`
- "Authorized to work?" → `preferences.authorized_to_work`
- For role-specific yes/no questions (e.g., "Do you have experience with X?"), check the resume — if the experience is clearly there, select Yes; if not, be honest

#### Open-Ended / Textarea Questions
This is where the skill earns its keep. For each open-ended question:

1. Read the question carefully
2. Check if it maps to something specific in the resume
3. Write a concise, specific answer drawing from real experience
4. Keep it natural and conversational — not robotic
5. Aim for 2-4 sentences for short answers, a solid paragraph for longer ones

**For "Additional information" or "Cover letter" textareas:**
Write a brief, tailored note connecting the user's experience to the specific role. Reference the company by name and the specific aspects of the role that align with the user's background. Keep it to 3-5 sentences.

#### EEO / Demographic Fields (Voluntary)
Fill these using `config.yaml` → `eeo` section:
- Gender → `eeo.gender` (skip or select "decline" if blank)
- Race → `eeo.race_ethnicity` (skip or select "decline" if blank)
- Veteran Status → `eeo.veteran_status` (skip or select "decline" if blank)
- Disability → `eeo.disability_status` (skip or select "decline" if blank)

#### Dropdowns
For dropdown/select fields, use the `form_input` tool with the value text. If the exact text doesn't match, use the closest option.

### Step 5: Review and Report

After filling all fields:

1. Scroll through the entire form taking screenshots to verify every field is filled
2. Compile a summary of what was filled, highlighting:
   - Any fields that couldn't be filled (e.g., file upload issues)
   - Any open-ended answers the user should review closely
   - Any fields where you had to make a judgment call
3. Explicitly confirm: **"The form is filled but NOT submitted. Please review and submit manually."**

## Important Rules

- **NEVER click Submit / Send / Apply buttons.** The user always submits manually.
- **NEVER fabricate experience.** Only reference things actually on the resume.
- **Be honest on yes/no questions.** If the resume doesn't support a "Yes" answer, say "No" or flag it for the user.
- **Handle errors gracefully.** If a field can't be filled (e.g., CAPTCHAs, file uploads that don't work), note it and move on.
- **Close any browser extension popups** (like Simplify, Grammarly, etc.) that might overlay the form before starting to fill fields.

## Platform-Specific Notes

### Lever (jobs.lever.co)
- Click "Apply for this job" → form appears on `/apply` page
- Resume upload is at the top — use the file input button (look for `type="file"` in the accessibility tree)
- Standard fields: name, email, phone, location, company, links
- **Location field uses autocomplete**: Don't use `form_input` — instead click the field, type the city name with `type` action, wait 1-2 seconds for the dropdown to appear, then click the correct suggestion
- Custom questions appear in labeled sections
- EEO section is at the bottom with `<select>` dropdowns — use `form_input` with the exact option text
- **Checkboxes** (like pronouns): Use `left_click` on the checkbox ref, not `form_input`
- Use `read_page` with `filter: "all"` and `max_chars: 80000` to get the complete form tree

### Greenhouse (boards.greenhouse.io)
- Form is often on the same page or a separate `/jobs/ID` page
- May have multi-step forms
- Custom questions vary widely

### Ashby
- Usually inline application on the JD page
- Simpler forms typically

### Workday
- Multi-page wizard, more complex
- May require account creation (flag this for user — don't create accounts)

