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, companies2. Deduplicate
Check each job against tracking/applications.json
Skip already-applied or already-skipped jobs3. 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 highest4. 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 compilation5. 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 interfaceFill 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/* or job-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 bottomLever
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" buttonWorkday
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 fieldsIndeed 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 submitIndeed 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 expiredLinkedIn 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-applicationsLinkedIn 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 expiredImportant 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