# Job Apply

> Fill out and submit job applications on supported platforms

- Skill: `diegosouzapw/job-apply` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add diegosouzapw/job-apply`
- Raw SKILL.md: https://api.skillmd.com/api/skills/diegosouzapw/job-apply/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: diegosouzapw (https://skillmd.com/u/diegosouzapw)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/diegosouzapw/job-apply

---


# Job Application Skill

Fill out and submit job applications across LinkedIn, Indeed, Glassdoor, and ZipRecruiter.

## General Approach

For every application:
1. Navigate to the job posting URL
2. Read the full job description
3. Verify the job is still a good match (check requirements vs USER.md)
4. Click the apply button
5. Fill in all form fields using data from USER.md
6. Upload resume from `/home/ubuntu/job-apply/data/resume.pdf`
7. Generate a cover letter if required (follow SOUL.md rules)
8. Review the application before submitting
9. Submit
10. Take a screenshot of the confirmation page
11. Call `log_application` with the result

## Platform-Specific Instructions

### LinkedIn Easy Apply

1. On the job page, click the **"Easy Apply"** button
2. LinkedIn shows a multi-step modal form:
   - **Step 1 - Contact info:** Verify name, email, phone (pre-filled from LinkedIn profile). Correct if needed.
   - **Step 2 - Resume:** Click "Upload resume" and select `/home/ubuntu/job-apply/data/resume.pdf`. Remove any previously attached resume if it's not the current one.
   - **Step 3 - Additional questions:** These vary by job. Common fields:
     - Years of experience: Use value from USER.md
     - Work authorization: Use value from USER.md
     - Sponsorship required: Use value from USER.md
     - Willing to relocate: Based on USER.md location preferences
     - Salary expectations: Use USER.md salary range (pick the midpoint if a single number is required)
     - Start date: "Immediately" or "2 weeks notice" (use USER.md notes)
     - Cover letter: Generate one if the field is present
   - **Step 4 - Review:** Verify all fields, then click **"Submit application"**
3. Wait for confirmation message ("Your application was sent")
4. Take screenshot
5. Log with status "applied", platform "linkedin"

### LinkedIn Standard Apply (External)

1. Click **"Apply"** (non-Easy Apply) — this opens the company's external careers page
2. Wait for the external page to load fully
3. Look for the application form. Common patterns:
   - Greenhouse: `/jobs/[id]` forms
   - Lever: `jobs.lever.co/[company]/[id]`
   - Workday: `[company].wd5.myworkdayjobs.com`
   - Custom ATS or company website
4. Fill in standard fields:
   - First name, Last name
   - Email, Phone
   - Resume upload (find file input, upload PDF)
   - LinkedIn URL
   - Portfolio/GitHub URL
   - Cover letter (generate if required)
   - Work authorization questions
   - Demographic questions (skip or select "Decline to answer" / "Prefer not to say")
5. Submit and screenshot
6. Log result

### Indeed

1. On the job page, click **"Apply now"** or **"Apply on company site"**
2. If "Apply now" (Indeed's application):
   - Indeed shows a multi-step form:
     - Contact info: Verify/fill name, email, phone
     - Resume: Upload PDF or confirm Indeed resume
     - Questions: Answer job-specific questions using USER.md
     - Review & Submit
3. If "Apply on company site":
   - Follow the external site flow (similar to LinkedIn Standard Apply)
4. Screenshot confirmation
5. Log with platform "indeed"

### Glassdoor

1. On the job page, click **"Apply"** or **"Easy Apply"**
2. If Glassdoor Easy Apply:
   - Fill contact info
   - Upload resume
   - Answer additional questions
   - Submit
3. If external redirect:
   - Follow external site flow
4. Screenshot and log with platform "glassdoor"

### ZipRecruiter

1. On the job page, click **"Apply"** or look for **"1-Click Apply"**
2. If 1-Click Apply:
   - Confirm your ZipRecruiter profile details
   - Click submit
3. If standard apply:
   - Fill in the form fields
   - Upload resume
   - Submit
4. Screenshot and log with platform "ziprecruiter"

## Form Field Mapping

Map these common form fields to USER.md values:

| Form Field | USER.md Source |
|---|---|
| First Name / Last Name | Name (split on space) |
| Email | Email |
| Phone | Phone |
| City / Location | Location |
| LinkedIn URL | LinkedIn |
| GitHub / Portfolio | GitHub, Portfolio |
| Years of Experience | Years of Experience |
| Current Job Title | Derive from target roles |
| Desired Salary | Salary Range (midpoint or range) |
| Work Authorization | Work Authorization > Status |
| Sponsorship | Work Authorization > Sponsorship Required |
| Skills | Skills section |
| Education | Education section |

## Handling Dropdowns

- For dropdown menus, click to open, then look for the matching option
- If no exact match, pick the closest option
- For experience level dropdowns: map years to typical labels:
  - 0-2 years → "Entry level" or "Junior"
  - 3-5 years → "Mid-level" or "Associate"
  - 6-9 years → "Senior"
  - 10+ years → "Lead" or "Principal"

## Resume Upload

- The resume file is at `/home/ubuntu/job-apply/data/resume.pdf`
- Look for file input elements (`<input type="file">`)
- If there's a drag-and-drop zone, try clicking it to trigger the file dialog
- If upload fails, try finding alternative upload methods on the page

## Cover Letter Generation

When a cover letter is required:
1. Read the full job description
2. Generate a tailored cover letter following SOUL.md guidelines
3. Paste it into the cover letter field
4. Save the generated text in the `log_application` call (cover_letter field)

## Post-Submission

After each application:
1. Take a screenshot: save to `/home/ubuntu/screenshots/[platform]-[company]-[timestamp].png`
2. Call `log_application` with:
   - `platform`: linkedin | indeed | glassdoor | ziprecruiter
   - `company`: Company name
   - `title`: Job title
   - `url`: Job posting URL
   - `status`: applied | failed | skipped
   - `notes`: Any relevant notes (why it failed/was skipped)
   - `screenshotPath`: Path to the screenshot
3. Wait 30+ seconds before the next application (SOUL.md rate limiting)

## Error Recovery

- **Page won't load:** Wait 30 seconds, try once more, then skip
- **Form validation error:** Read the error message, try to fix, retry once
- **CAPTCHA appears:** Invoke the `captcha-solve` skill
- **"Already applied" message:** Log as "skipped" with note "already applied on platform"
- **Application limit reached:** Stop and notify user via WhatsApp

