Automates job search on Indeed, analyzes fit, tailors resume, and applies via Greenhouse, Lever, Workday, or Indeed Easy Apply, logging all results.
# 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:
```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 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
don't have the plugin yet? install it then click "run inline in claude" again.