install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/job-apply" ~/.claude/skills/diegosouzapw-awesome-omni-skill-job-apply && rm -rf "$T"
manifest:
skills/development/job-apply/SKILL.mdsource content
Job Application Skill
Fill out and submit job applications across LinkedIn, Indeed, Glassdoor, and ZipRecruiter.
General Approach
For every application:
- Navigate to the job posting URL
- Read the full job description
- Verify the job is still a good match (check requirements vs USER.md)
- Click the apply button
- Fill in all form fields using data from USER.md
- Upload resume from
/home/ubuntu/job-apply/data/resume.pdf - Generate a cover letter if required (follow SOUL.md rules)
- Review the application before submitting
- Submit
- Take a screenshot of the confirmation page
- Call
with the resultlog_application
Platform-Specific Instructions
LinkedIn Easy Apply
- On the job page, click the "Easy Apply" button
- 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
. Remove any previously attached resume if it's not the current one./home/ubuntu/job-apply/data/resume.pdf - 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"
- Wait for confirmation message ("Your application was sent")
- Take screenshot
- Log with status "applied", platform "linkedin"
LinkedIn Standard Apply (External)
- Click "Apply" (non-Easy Apply) — this opens the company's external careers page
- Wait for the external page to load fully
- Look for the application form. Common patterns:
- Greenhouse:
forms/jobs/[id] - Lever:
jobs.lever.co/[company]/[id] - Workday:
[company].wd5.myworkdayjobs.com - Custom ATS or company website
- Greenhouse:
- 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")
- Submit and screenshot
- Log result
Indeed
- On the job page, click "Apply now" or "Apply on company site"
- 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
- Indeed shows a multi-step form:
- If "Apply on company site":
- Follow the external site flow (similar to LinkedIn Standard Apply)
- Screenshot confirmation
- Log with platform "indeed"
Glassdoor
- On the job page, click "Apply" or "Easy Apply"
- If Glassdoor Easy Apply:
- Fill contact info
- Upload resume
- Answer additional questions
- Submit
- If external redirect:
- Follow external site flow
- Screenshot and log with platform "glassdoor"
ZipRecruiter
- On the job page, click "Apply" or look for "1-Click Apply"
- If 1-Click Apply:
- Confirm your ZipRecruiter profile details
- Click submit
- If standard apply:
- Fill in the form fields
- Upload resume
- Submit
- 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) |
| Phone | Phone |
| City / Location | Location |
| LinkedIn URL | |
| 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:
- Read the full job description
- Generate a tailored cover letter following SOUL.md guidelines
- Paste it into the cover letter field
- Save the generated text in the
call (cover_letter field)log_application
Post-Submission
After each application:
- Take a screenshot: save to
/home/ubuntu/screenshots/[platform]-[company]-[timestamp].png - Call
with:log_application
: linkedin | indeed | glassdoor | ziprecruiterplatform
: Company namecompany
: Job titletitle
: Job posting URLurl
: applied | failed | skippedstatus
: Any relevant notes (why it failed/was skipped)notes
: Path to the screenshotscreenshotPath
- 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
skillcaptcha-solve - "Already applied" message: Log as "skipped" with note "already applied on platform"
- Application limit reached: Stop and notify user via WhatsApp