Job Application Automation Skill
Overview
Automated job search and application system for Abed Mir. Searches Indeed for matching jobs, analyzes fit, tailors resume, and applies via ATS platforms (Greenhouse, Lever, Workday, Indeed Easy Apply).
Directory Structure
job-applications/
├── config.json # Search criteria, filters, settings
├── resume-source/
│ ├── resume.json # Structured resume data (source of truth)
│ └── resume.tex # LaTeX template
├── scripts/
│ └── tailor_resume.py # Resume tailoring + LaTeX generation
├── tailored-resumes/ # Generated PDFs per application
├── tracking/
│ └── applications.json # Application log
└── logs/ # Run logs
Workflow (Per Run)
1. Search Jobs
- Open Indeed in browser (pinned tab)
- Search each target title from config.json
- Filter: Remote or DFW hybrid, posted in last 24h
- Collect job URLs, titles, companies
2. Deduplicate
- Check each job against tracking/applications.json
- Skip already-applied or already-skipped jobs
3. Analyze Fit
For each new job:
- Navigate to the job posting, read full description
- Check against avoid_industries and avoid_keywords
- Score fit based on skills match, experience alignment
- Prioritize AI/agent roles highest
4. Tailor Resume
For jobs that pass fit check:
- Use resume.json as base
- Reorder bullet points to lead with most relevant experience
- Emphasize matching skills/technologies
- DO NOT fabricate experience or skills
- Generate PDF via LaTeX compilation
5. Apply
Detect ATS platform from the application URL:
- Greenhouse (boards.greenhouse.io): Single page form — name, email, phone, resume upload, optional fields
- Lever (jobs.lever.co): Single page — similar to Greenhouse
- Workday (myworkday*.com): Multi-step wizard — create account or sign in, then fill each step
- Indeed Easy Apply: Quick apply through Indeed's interface
Fill all required fields from config.json candidate data. Upload tailored PDF.
6. Log
Record in applications.json:
{
"id": "uuid",
"date": "ISO timestamp",
"company": "Company Name",
"title": "Job Title",
"url": "application URL",
"platform": "greenhouse|lever|workday|indeed",
"status": "applied|skipped|failed",
"skip_reason": null,
"resume_version": "tailored-resumes/company-title.pdf",
"notes": ""
}
Cron Schedule
Runs 3x daily:
- 8:00 AM CT — Morning sweep (catch overnight postings)
- 12:00 PM CT — Midday sweep
- 5:00 PM CT — Evening sweep (catch same-day postings)
ATS Form Filling Reference
Greenhouse
- URL pattern:
boards.greenhouse.io/*orjob-boards.greenhouse.io/* - Fields: First Name, Last Name, Email, Phone, Resume (file upload), Location, LinkedIn (optional), Website (optional)
- Sometimes has custom questions (dropdown, text, checkbox)
- Submit button usually at bottom
Lever
- URL pattern:
jobs.lever.co/* - Fields: Full Name, Email, Phone, Resume (file upload), LinkedIn (optional), Website (optional), Current Company (optional)
- May have additional questions
- "Submit application" button
Workday
- URL pattern:
*.myworkdayjobs.com/*or*.wd5.myworkdayjobs.com/* - Multi-page: Sign in/Create account → My Information → My Experience → Application Questions → Review → Submit
- Requires parsing each page and filling iteratively
- Most complex — may need human intervention for unusual fields
Indeed Easy Apply
- Indeed session is logged in on the openclaw browser (abedmir31@gmail.com)
- If session expires, navigate to https://secure.indeed.com/auth, enter abedmir31@gmail.com, and ask Abed for the email code in #job-applications Discord channel
- Fields pre-filled from Indeed profile
- May ask additional screening questions
- Click "Apply now" → fills in the Indeed Easy Apply modal
- Quick submit
Indeed Session Notes
- Login uses email verification code (no password)
- Session persists in the openclaw browser context
- If you see "Sign in" in the nav instead of "Welcome, Abed", the session expired
LinkedIn Easy Apply
- LinkedIn session is logged in on the openclaw browser (Abed Mir profile)
- Navigate to https://www.linkedin.com/jobs/search/ to search for jobs
- Filter by Easy Apply, Remote, Date Posted
- Click "Easy Apply" button on a job listing
- LinkedIn Easy Apply modal pre-fills most info from profile
- Upload resume, answer any additional questions, submit
- If session expires, navigate to https://www.linkedin.com/login and ask Abed for credentials in #job-applications
LinkedIn Session Notes
- Login uses email + password (stored in browser session)
- Session persists in the openclaw browser context
- If you see the login page instead of the feed, the session expired
Important Rules
- NEVER lie on applications — only reorder/emphasize existing experience
- Skip haram industries (banking, mortgage, lending, alcohol, gambling, etc.)
- Log EVERY job encountered (applied or skipped with reason)
- If an application fails mid-form, log as "failed" and move on
- Report summary to #job-applications Discord channel after each run
- ALWAYS close browser tabs after completing an application — use
browser(action="close")or navigate away to prevent memory buildup and tab clutter