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
log_application with the result
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
/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"
- 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:
/jobs/[id] forms
- Lever:
jobs.lever.co/[company]/[id]
- Workday:
[company].wd5.myworkdayjobs.com
- Custom ATS or company website
- 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
- 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) |
| 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:
- 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
log_application call (cover_letter field)
Post-Submission
After each application:
- Take a screenshot: save to
/home/ubuntu/screenshots/[platform]-[company]-[timestamp].png
- 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
- 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
1---2name: job-apply3description: Fill out and submit job applications on supported platforms4---56# Job Application Skill78Fill out and submit job applications across LinkedIn, Indeed, Glassdoor, and ZipRecruiter.910## General Approach1112For every application:131. Navigate to the job posting URL142. Read the full job description153. Verify the job is still a good match (check requirements vs USER.md)164. Click the apply button175. Fill in all form fields using data from USER.md186. Upload resume from `/home/ubuntu/job-apply/data/resume.pdf`197. Generate a cover letter if required (follow SOUL.md rules)208. Review the application before submitting219. Submit2210. Take a screenshot of the confirmation page2311. Call `log_application` with the result2425## Platform-Specific Instructions2627### LinkedIn Easy Apply28291. On the job page, click the **"Easy Apply"** button302. LinkedIn shows a multi-step modal form:31 - **Step 1 - Contact info:** Verify name, email, phone (pre-filled from LinkedIn profile). Correct if needed.32 - **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.33 - **Step 3 - Additional questions:** These vary by job. Common fields:34 - Years of experience: Use value from USER.md35 - Work authorization: Use value from USER.md36 - Sponsorship required: Use value from USER.md37 - Willing to relocate: Based on USER.md location preferences38 - Salary expectations: Use USER.md salary range (pick the midpoint if a single number is required)39 - Start date: "Immediately" or "2 weeks notice" (use USER.md notes)40 - Cover letter: Generate one if the field is present41 - **Step 4 - Review:** Verify all fields, then click **"Submit application"**423. Wait for confirmation message ("Your application was sent")434. Take screenshot445. Log with status "applied", platform "linkedin"4546### LinkedIn Standard Apply (External)47481. Click **"Apply"** (non-Easy Apply) — this opens the company's external careers page492. Wait for the external page to load fully503. Look for the application form. Common patterns:51 - Greenhouse: `/jobs/[id]` forms52 - Lever: `jobs.lever.co/[company]/[id]`53 - Workday: `[company].wd5.myworkdayjobs.com`54 - Custom ATS or company website554. Fill in standard fields:56 - First name, Last name57 - Email, Phone58 - Resume upload (find file input, upload PDF)59 - LinkedIn URL60 - Portfolio/GitHub URL61 - Cover letter (generate if required)62 - Work authorization questions63 - Demographic questions (skip or select "Decline to answer" / "Prefer not to say")645. Submit and screenshot656. Log result6667### Indeed68691. On the job page, click **"Apply now"** or **"Apply on company site"**702. If "Apply now" (Indeed's application):71 - Indeed shows a multi-step form:72 - Contact info: Verify/fill name, email, phone73 - Resume: Upload PDF or confirm Indeed resume74 - Questions: Answer job-specific questions using USER.md75 - Review & Submit763. If "Apply on company site":77 - Follow the external site flow (similar to LinkedIn Standard Apply)784. Screenshot confirmation795. Log with platform "indeed"8081### Glassdoor82831. On the job page, click **"Apply"** or **"Easy Apply"**842. If Glassdoor Easy Apply:85 - Fill contact info86 - Upload resume87 - Answer additional questions88 - Submit893. If external redirect:90 - Follow external site flow914. Screenshot and log with platform "glassdoor"9293### ZipRecruiter94951. On the job page, click **"Apply"** or look for **"1-Click Apply"**962. If 1-Click Apply:97 - Confirm your ZipRecruiter profile details98 - Click submit993. If standard apply:100 - Fill in the form fields101 - Upload resume102 - Submit1034. Screenshot and log with platform "ziprecruiter"104105## Form Field Mapping106107Map these common form fields to USER.md values:108109| Form Field | USER.md Source |110|---|---|111| First Name / Last Name | Name (split on space) |112| Email | Email |113| Phone | Phone |114| City / Location | Location |115| LinkedIn URL | LinkedIn |116| GitHub / Portfolio | GitHub, Portfolio |117| Years of Experience | Years of Experience |118| Current Job Title | Derive from target roles |119| Desired Salary | Salary Range (midpoint or range) |120| Work Authorization | Work Authorization > Status |121| Sponsorship | Work Authorization > Sponsorship Required |122| Skills | Skills section |123| Education | Education section |124125## Handling Dropdowns126127- For dropdown menus, click to open, then look for the matching option128- If no exact match, pick the closest option129- For experience level dropdowns: map years to typical labels:130 - 0-2 years → "Entry level" or "Junior"131 - 3-5 years → "Mid-level" or "Associate"132 - 6-9 years → "Senior"133 - 10+ years → "Lead" or "Principal"134135## Resume Upload136137- The resume file is at `/home/ubuntu/job-apply/data/resume.pdf`138- Look for file input elements (`<input type="file">`)139- If there's a drag-and-drop zone, try clicking it to trigger the file dialog140- If upload fails, try finding alternative upload methods on the page141142## Cover Letter Generation143144When a cover letter is required:1451. Read the full job description1462. Generate a tailored cover letter following SOUL.md guidelines1473. Paste it into the cover letter field1484. Save the generated text in the `log_application` call (cover_letter field)149150## Post-Submission151152After each application:1531. Take a screenshot: save to `/home/ubuntu/screenshots/[platform]-[company]-[timestamp].png`1542. Call `log_application` with:155 - `platform`: linkedin | indeed | glassdoor | ziprecruiter156 - `company`: Company name157 - `title`: Job title158 - `url`: Job posting URL159 - `status`: applied | failed | skipped160 - `notes`: Any relevant notes (why it failed/was skipped)161 - `screenshotPath`: Path to the screenshot1623. Wait 30+ seconds before the next application (SOUL.md rate limiting)163164## Error Recovery165166- **Page won't load:** Wait 30 seconds, try once more, then skip167- **Form validation error:** Read the error message, try to fix, retry once168- **CAPTCHA appears:** Invoke the `captcha-solve` skill169- **"Already applied" message:** Log as "skipped" with note "already applied on platform"170- **Application limit reached:** Stop and notify user via WhatsApp