Local job-search agent for Workday career sites: finds matching postings, tailors your resume with rules (no AI), side-by-side review dashboard, assisted auto-apply.
Python
0
2 commits
updated Oct 1, 2026
Disclaimer: use at your own risk. A master resume / CV contains personally identifiable information (name, contact details, employment history), so this tool has not been dry-run with a real resume. It was tested only with made-up sample resumes. Results with your own resume may differ, so check the parsed
master_resume/resume_data.yamland every tailored resume before you use or submit it.The tailored resume is a starting point for further editing, not a finished document. Review it, edit it (on the dashboard or in the downloaded
.docx), and make sure everything in it is accurate before you apply.
Runs on your PC every day at 11:00 AM Eastern. Everything is plain code: no AI service, no API key, and nothing per-resume to pay for. It:
companies.yaml) for your keywords, using Workday's own
public job-search API, and skips your current employer..docx (single column, standard headings, real bullets). It never adds anything that isn't in
your resume.auto_submit: true to have it submit for you.applications/<Company>/<date>_<Job title>_<Req ID>/: the tailored resume
that was sent, the job description (.html + .txt), and application.json (salary, type, scores, link).search.keywords decides what to search Workday for (job titles). These two lists decide which of the postings
found you see. They're checked against each posting's title and full description:
Must have (mandatory_keywords) | The posting must mention every keyword, or it goes to Filtered out with the reason (e.g. "missing mandatory keyword: Snowflake") and is never tailored. |
Nice to have (optional_keywords) | Can be left empty. Postings that mention more of them are listed first, and the Keywords column shows how many (e.g. 2/3). Set at least N to also require some of them. |
AWS finds "Amazon Web Services",
PostgreSQL finds "Postgres", and Java does not match "JavaScript".| inside one keyword for either-or: AWS | Azure | GCP is satisfied by any one of them.You can also set starting values in config.yaml → filters:.
The Location row on the dashboard:
United States only (us_only, on by default) | Drops postings outside the US. |
States (states) | Pick states from the list (they show as chips, × removes one). Empty = every state. A posting with several locations passes if any of them is in one of your states. |
Always include remote jobs (include_remote, on by default) | Keeps remote US postings even when they aren't in your states. |
States are read from Workday's location text, whatever the company's format: US, CA, Santa Clara,
CHARLOTTE, NC; ISELIN, NJ, California - San Francisco, Newark, New Jersey, USA-Texas-Austin.
Washington, DC counts as DC, and Kansas City, MO as Missouri. Postings that fail show the reason under
Filtered out, e.g. "state: NC, TX" or "outside the US (India)". Like the other filters, changes apply to the
list instantly; Save for daily runs keeps them for the 11 AM run.
jobagent/resume_parser.py reads .docx/.pdf/.txt/.md: it finds the section headings,
then bullets, job titles, companies, dates, locations, degrees and skills. The result is saved to
master_resume/resume_data.yaml. Check that file once and fix anything that landed in the wrong place.
Every tailored resume is built only from it.jobagent/keywords.py finds the skills and tools the posting mentions. It uses a
built-in list of about 580 skills with their other spellings (jobagent/skills.yaml, e.g.
AWS = Amazon Web Services, K8s = Kubernetes, Postgres = PostgreSQL), plus every skill on your resume. Keywords
are weighted by where they appear: job title > Required / Minimum qualifications > Preferred / Nice to have.
The company blurb, benefits, EEO and salary text are ignored.jobagent/tailor.py):
Senior Data Engineer | PostgreSQL · Python · Kubernetes). It never uses a title you haven't held.summary_variants, ending with "Skilled in …" listing your matching skills.AWS and
the posting says "Amazon Web Services", your resume shows Amazon Web Services (AWS); that's what simple
ATS keyword scans look for. Matching skills that only appear in your bullets are listed under Additional
Skills.resume_data.yaml only if they're true.To get better matches, keep resume_data.yaml complete (extra bullets are fine; tailoring picks the best ones).
Add alternative summaries under summary_variants:, and add tools the built-in list doesn't know to
config.yaml → tailoring.extra_skills / tailoring.synonyms.
apply.browser_channel: chromium and run .\.venv\Scripts\python.exe -m playwright install chromium.git clone <this repository's URL> workday-job-agent
cd workday-job-agent
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
copy .env.example .env # then edit .env
copy config.example.yaml config.yaml # then edit config.yaml
.env, config.yaml, your resume, data\ and applications\ are in .gitignore, so your personal details are
never committed.
.docx, .pdf, .txt or .md) in master_resume\..env: set WORKDAY_EMAIL and WORKDAY_PASSWORD. Workday has a separate account per company, so use a
password you don't use elsewhere.config.yaml: set current_employer, search.keywords, your profile (name, phone, address), and fill in
the answers: for screening questions (work authorization, sponsorship, …). Unanswered questions are left for
you in the browser..\.venv\Scripts\python.exe -m jobagent init
It prints what it found (roles, dates, bullet counts, education). Open master_resume\resume_data.yaml and fix
anything that's off. If you later replace your resume file, run init --reparse..\.venv\Scripts\python.exe -m jobagent run
powershell -ExecutionPolicy Bypass -File scripts\install_schedule.ps1
At 11:00 the task searches, tailors, then opens http://127.0.0.1:5055. You can also open it any time with
start_dashboard.bat.
| Command | What it does |
|---|---|
python -m jobagent init [--reparse] | Read the master resume into resume_data.yaml, check config |
python -m jobagent run [--no-tailor] | Search + filter + tailor now |
python -m jobagent serve [--open] | Start the dashboard |
python -m jobagent daily | What the scheduled task runs |
python -m jobagent apply-approved | Apply to approved jobs (the dashboard starts this for you) |
python -m jobagent validate-companies | Check every Workday URL still answers |
python -m jobagent add-company <url> --name "<Company>" | Add a Workday site (also possible from the dashboard) |
(Use .venv\Scripts\python.exe in place of python.)
https://<company>.wd<N>.myworkdayjobs.com/<Site>) into the dashboard's Add company box. Companies that use
other systems (Greenhouse, Lever, iCIMS, Taleo, their own site) aren't covered.resume_data.yaml once.auto_submit: false until you've watched a few applications go through.data\, master_resume\ and
applications\. The dashboard only listens on 127.0.0.1. Nothing is sent anywhere except Workday itself.data\logs\ (jobagent.log, daily.log, apply.log, server.log).Unregister-ScheduledTask -TaskName JobAgentDaily -Confirm:$falseMIT, provided as is, without warranty of any kind (see the disclaimer at the top).
jobagent/ workday.py (Workday API) · classify.py (type/remote/salary) · geo.py (US states) · keywords.py + skills.yaml
(posting keywords) · resume_parser.py (read your resume) · tailor.py (tailoring rules)
resume.py (data model, checks, .docx) · scoring.py · pipeline.py (daily run, archive)
applier.py (browser automation) · server.py + templates/ + static/ (dashboard) · __main__.py (CLI)
companies.yaml Workday sites to search config.yaml your settings
master_resume/ your resume + resume_data.yaml data/ database, tailored drafts, logs, browser profile
applications/ one folder per submitted application
Python
77.1%
JavaScript
12.7%
CSS
5.3%
HTML
3.7%
PowerShell
1.0%
Local job-search agent for Workday career sites: finds matching postings, tailors your resume with rules (no AI), side-by-side review dashboard, assisted auto-apply.
Python
0
2 commits
updated Oct 1, 2026
Disclaimer: use at your own risk. A master resume / CV contains personally identifiable information (name, contact details, employment history), so this tool has not been dry-run with a real resume. It was tested only with made-up sample resumes. Results with your own resume may differ, so check the parsed
master_resume/resume_data.yamland every tailored resume before you use or submit it.The tailored resume is a starting point for further editing, not a finished document. Review it, edit it (on the dashboard or in the downloaded
.docx), and make sure everything in it is accurate before you apply.
Runs on your PC every day at 11:00 AM Eastern. Everything is plain code: no AI service, no API key, and nothing per-resume to pay for. It:
companies.yaml) for your keywords, using Workday's own
public job-search API, and skips your current employer..docx (single column, standard headings, real bullets). It never adds anything that isn't in
your resume.auto_submit: true to have it submit for you.applications/<Company>/<date>_<Job title>_<Req ID>/: the tailored resume
that was sent, the job description (.html + .txt), and application.json (salary, type, scores, link).search.keywords decides what to search Workday for (job titles). These two lists decide which of the postings
found you see. They're checked against each posting's title and full description:
Must have (mandatory_keywords) | The posting must mention every keyword, or it goes to Filtered out with the reason (e.g. "missing mandatory keyword: Snowflake") and is never tailored. |
Nice to have (optional_keywords) | Can be left empty. Postings that mention more of them are listed first, and the Keywords column shows how many (e.g. 2/3). Set at least N to also require some of them. |
AWS finds "Amazon Web Services",
PostgreSQL finds "Postgres", and Java does not match "JavaScript".| inside one keyword for either-or: AWS | Azure | GCP is satisfied by any one of them.You can also set starting values in config.yaml → filters:.
The Location row on the dashboard:
United States only (us_only, on by default) | Drops postings outside the US. |
States (states) | Pick states from the list (they show as chips, × removes one). Empty = every state. A posting with several locations passes if any of them is in one of your states. |
Always include remote jobs (include_remote, on by default) | Keeps remote US postings even when they aren't in your states. |
States are read from Workday's location text, whatever the company's format: US, CA, Santa Clara,
CHARLOTTE, NC; ISELIN, NJ, California - San Francisco, Newark, New Jersey, USA-Texas-Austin.
Washington, DC counts as DC, and Kansas City, MO as Missouri. Postings that fail show the reason under
Filtered out, e.g. "state: NC, TX" or "outside the US (India)". Like the other filters, changes apply to the
list instantly; Save for daily runs keeps them for the 11 AM run.
jobagent/resume_parser.py reads .docx/.pdf/.txt/.md: it finds the section headings,
then bullets, job titles, companies, dates, locations, degrees and skills. The result is saved to
master_resume/resume_data.yaml. Check that file once and fix anything that landed in the wrong place.
Every tailored resume is built only from it.jobagent/keywords.py finds the skills and tools the posting mentions. It uses a
built-in list of about 580 skills with their other spellings (jobagent/skills.yaml, e.g.
AWS = Amazon Web Services, K8s = Kubernetes, Postgres = PostgreSQL), plus every skill on your resume. Keywords
are weighted by where they appear: job title > Required / Minimum qualifications > Preferred / Nice to have.
The company blurb, benefits, EEO and salary text are ignored.jobagent/tailor.py):
Senior Data Engineer | PostgreSQL · Python · Kubernetes). It never uses a title you haven't held.summary_variants, ending with "Skilled in …" listing your matching skills.AWS and
the posting says "Amazon Web Services", your resume shows Amazon Web Services (AWS); that's what simple
ATS keyword scans look for. Matching skills that only appear in your bullets are listed under Additional
Skills.resume_data.yaml only if they're true.To get better matches, keep resume_data.yaml complete (extra bullets are fine; tailoring picks the best ones).
Add alternative summaries under summary_variants:, and add tools the built-in list doesn't know to
config.yaml → tailoring.extra_skills / tailoring.synonyms.
apply.browser_channel: chromium and run .\.venv\Scripts\python.exe -m playwright install chromium.git clone <this repository's URL> workday-job-agent
cd workday-job-agent
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
copy .env.example .env # then edit .env
copy config.example.yaml config.yaml # then edit config.yaml
.env, config.yaml, your resume, data\ and applications\ are in .gitignore, so your personal details are
never committed.
.docx, .pdf, .txt or .md) in master_resume\..env: set WORKDAY_EMAIL and WORKDAY_PASSWORD. Workday has a separate account per company, so use a
password you don't use elsewhere.config.yaml: set current_employer, search.keywords, your profile (name, phone, address), and fill in
the answers: for screening questions (work authorization, sponsorship, …). Unanswered questions are left for
you in the browser..\.venv\Scripts\python.exe -m jobagent init
It prints what it found (roles, dates, bullet counts, education). Open master_resume\resume_data.yaml and fix
anything that's off. If you later replace your resume file, run init --reparse..\.venv\Scripts\python.exe -m jobagent run
powershell -ExecutionPolicy Bypass -File scripts\install_schedule.ps1
At 11:00 the task searches, tailors, then opens http://127.0.0.1:5055. You can also open it any time with
start_dashboard.bat.
| Command | What it does |
|---|---|
python -m jobagent init [--reparse] | Read the master resume into resume_data.yaml, check config |
python -m jobagent run [--no-tailor] | Search + filter + tailor now |
python -m jobagent serve [--open] | Start the dashboard |
python -m jobagent daily | What the scheduled task runs |
python -m jobagent apply-approved | Apply to approved jobs (the dashboard starts this for you) |
python -m jobagent validate-companies | Check every Workday URL still answers |
python -m jobagent add-company <url> --name "<Company>" | Add a Workday site (also possible from the dashboard) |
(Use .venv\Scripts\python.exe in place of python.)
https://<company>.wd<N>.myworkdayjobs.com/<Site>) into the dashboard's Add company box. Companies that use
other systems (Greenhouse, Lever, iCIMS, Taleo, their own site) aren't covered.resume_data.yaml once.auto_submit: false until you've watched a few applications go through.data\, master_resume\ and
applications\. The dashboard only listens on 127.0.0.1. Nothing is sent anywhere except Workday itself.data\logs\ (jobagent.log, daily.log, apply.log, server.log).Unregister-ScheduledTask -TaskName JobAgentDaily -Confirm:$falseMIT, provided as is, without warranty of any kind (see the disclaimer at the top).
jobagent/ workday.py (Workday API) · classify.py (type/remote/salary) · geo.py (US states) · keywords.py + skills.yaml
(posting keywords) · resume_parser.py (read your resume) · tailor.py (tailoring rules)
resume.py (data model, checks, .docx) · scoring.py · pipeline.py (daily run, archive)
applier.py (browser automation) · server.py + templates/ + static/ (dashboard) · __main__.py (CLI)
companies.yaml Workday sites to search config.yaml your settings
master_resume/ your resume + resume_data.yaml data/ database, tailored drafts, logs, browser profile
applications/ one folder per submitted application
Python
77.1%
JavaScript
12.7%
CSS
5.3%
HTML
3.7%
PowerShell
1.0%