An end-to-end automation tool that takes a Workday job URL and handles everything: scraping the job posting, generating a tailored cover letter with Claude AI, and filling out the Workday application form using Playwright.
- Scrapes the Workday job posting — extracts the job title, description, and saves a PDF snapshot of the page
- Classifies the role (investment / accounting / finance) and selects the matching resume and cover letter template
- Generates a personalised cover letter — uses Claude AI to fill template blanks with job-specific language, then converts it to PDF
- Fills the Workday application form automatically — logs in, then fills personal info, work history, education, skills, file uploads, screening questions, disclosures, and runs a final AI sense-check before submission
workday-application-copilot/
├── apply.py # Entry point — chains scrape → generate → fill in one run
├── a_scraper.py # Opens the Workday job page in a browser, extracts the job
│ # title and description, and saves a PDF snapshot
├── b_generator.py # Classifies the job, picks the right resume/cover letter
│ # template, uses Claude to fill cover letter blanks, and
│ # converts the .docx to PDF ready for upload
├── c_filler.py # Playwright automation that fills the entire Workday form —
│ # login, every form section, file uploads, and submission.
│ # Generic engine — contains no personal data, do not edit
├── d_config.py # YOUR personal settings: email, location, file paths,
│ # languages, visa info, supplementary uploads ← edit this
├── e_applicant.json # YOUR candidate profile: name, address, work experience,
│ # education, skills, certifications ← edit this
├── requirements.txt # Python package dependencies
├── PROJECT_MEMORY.md # Claude onboarding doc — paste into chat for debugging sessions
└── .env # Your Anthropic API key (create this file, never commit it)
- Windows (required —
docx2pdfuses Microsoft Word COM for PDF conversion) - Python 3.10+
- Microsoft Word (for
.docx→.pdfconversion) - Anthropic API key — get one at console.anthropic.com
git clone https://github.com/rifattahmid/workday-job-application-copilot.git
cd workday-job-application-copilotNo virtual environment required — install directly:
pip install -r requirements.txtIf you prefer to isolate dependencies, you can optionally use a venv:
python -m venv venv venv\Scripts\activate pip install -r requirements.txt
playwright install msedgeCreate a .env file in the project root:
ANTHROPIC_API_KEY=your_api_key_here
There are three files to set up before running: e_applicant.json, d_config.py, and optionally b_generator.py.
This file holds the personal information used to fill every Workday form field — name, address, work experience, education, skills, and more.
The easiest way is to ask your AI assistant to generate it from your CV:
"Create an e_applicant.json for the Workday Application Copilot based on my CV: [paste CV text]."
{
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"phone": "0400000000",
"phone_country_code": "+61",
"address": {
"street": "123 Example St",
"suburb": "Melbourne",
"city": "Melbourne",
"state": "Victoria",
"state_abbr": "VIC",
"postcode": "3000",
"country": "Australia"
},
"linkedin": "https://www.linkedin.com/in/yourprofile/",
"website": "https://github.com/yourusername",
"visa": {
"type": "Australian Citizen",
"expiry": null,
"authorized_to_work": true,
"requires_future_sponsorship": false,
"note": ""
},
"referral_source": "LinkedIn",
"work_experience": [
{
"title": "Financial Analyst",
"company": "Example Corp",
"start": "01/2023",
"end": "Present",
"description": "Brief description of your role and achievements."
}
],
"education": [
{
"institution": "University of Melbourne",
"degree": "Bachelor of Commerce",
"field": "Accounting & Finance",
"start": "02/2019",
"end": "12/2022",
"gpa": "3.5/4.0"
}
],
"certifications": ["CFA Level 1"],
"skills": ["Financial Modelling", "Excel", "Python", "Power BI", "SQL"]
}Open d_config.py and update every value marked with ← UPDATE THIS:
| Setting | What it is |
|---|---|
WORKDAY_EMAIL |
The email you use (or will create) on Workday job portals |
SALUTATION |
Your title prefix — e.g. "Mr.", "Ms.", "Dr." |
REFERRAL_SOURCE |
How you heard about the role — e.g. "LinkedIn", "Job Board" |
YEARS_EXPERIENCE |
Years of relevant experience — e.g. "4" |
SALARY_EXPECTATION |
Expected salary range — e.g. "100,000 – 110,000" |
SALARY_EXPECTATION_SINGLE |
Expected salary as a single figure — e.g. "100,000" |
LEAVING_REASON |
Your reason for leaving current role |
INDIGENOUS_STATUS |
Indigenous identity answer — typically "Neither" for Australian forms |
DEFAULT_LOCATION |
Your city/state used to fill Location fields on forms |
VISA_INFO |
Your visa or work-rights status — Claude uses this to answer screening questions |
WORK_RIGHTS_ANSWER |
Exact option text for "right to work" dropdowns — e.g. "Yes - I am a Temporary Resident with Full Working Rights" |
LANG_PROFICIENCY |
Languages you speak and your proficiency level in each |
OUTPUT_BASE |
Folder where generated resume/cover letter folders are saved |
TEMPLATE_BASE |
Folder containing your resume/cover letter Word template subfolders |
SUPPLEMENTARY_FILES |
Extra PDFs uploaded alongside your resume (transcripts, references, etc.) |
Tip — use your AI assistant: Paste
d_config.pyinto your AI chat and ask: "Fill in this config file based on my details: [paste your info]." The AI will update every field for you in one go.
b_generator.py maps job titles and descriptions to your resume/cover letter template subfolders. The default categories are:
| Category | Matched keywords |
|---|---|
investment |
investment, portfolio, asset management, fund, equity, credit, infrastructure, capital markets |
accounting |
account, audit, tax, bookkeeping, controller, CPA, chartered accountant |
finance |
finance, financial, FP&A, treasury, budget, forecast, analyst |
If your roles don't fit these categories, open b_generator.py and edit the keywords dict inside classify_job():
- To add a new category (e.g.
"data"), create a matching template subfolder and add an entry:"data": ["data analyst", "sql", "power bi", "tableau", "data science"],
- To extend an existing category, add keywords to its list.
- Title matches are weighted 3× higher than description matches, so put your most specific terms there.
The tool selects from categorised resume/cover letter templates stored on your machine. Set OUTPUT_BASE and TEMPLATE_BASE in d_config.py, then create a subfolder per job category (e.g. Templates\finance\, Templates\accounting\).
Each subfolder must contain:
| File | Purpose |
|---|---|
Resume.pdf |
The resume file uploaded to Workday |
Cover Letter.docx |
Word template with _ blanks that Claude fills in |
Resume.txt |
Plain-text version of your resume used as AI context |
Cover letter blanks are underscore characters (_). Claude replaces each blank with job-specific language based on the job description. Bold formatting on the job title is preserved automatically.
Runs scrape → cover letter generation → form filling in one sequence:
python apply.pyYou will be prompted for:
- The Workday job URL
- The company name
The form-filler starts automatically once the cover letter is generated — no extra prompt.
If you already have your documents and just want to fill the form:
python c_filler.pyYou will be prompted for:
- The Workday job URL
- The job title
- Path to your resume PDF
The filler opens a visible browser window, navigates to the Workday application page, and handles each section automatically:
| Section | What it does |
|---|---|
| Login | Detects whether a Workday account exists — registers a new one if not, or signs in automatically using your saved credentials |
| File uploads | Uploads your resume, cover letter, and any supplementary PDFs |
| Personal info | Fills name, email, phone, and address from e_applicant.json |
| Work experience | Adds each job entry — title, company, location, dates, and role description |
| Education | Fills institution, degree type, field of study, dates, and GPA |
| Languages | Adds each language with proficiency levels from d_config.py |
| Skills | Uses Claude to pick the most relevant skills for the job, then selects them from Workday's skill search |
| Websites | Fills LinkedIn and personal website links |
| Screening questions | Answers yes/no and dropdown questions using Claude based on your profile |
| Disclosures / T&Cs | Automatically ticks all agreement checkboxes |
| Review & submit | Runs a Claude sense-check on the full application, prints a summary, then waits for you to press Enter before submitting |
The browser runs in visible mode so you can watch and intervene at any point. Press Ctrl+C in the terminal to stop at any time.
docx2pdf conversion fails
Make sure Microsoft Word is installed and the cover letter .docx is not open in Word when you run the tool.
Playwright can't find elements
Workday's UI varies by company. If the filler stalls, the browser window stays open — you can continue filling manually. Press Ctrl+C in the terminal to stop the script.
API key not found
Ensure .env exists in the project root and contains ANTHROPIC_API_KEY=your_key. Do not wrap the key in quotes.
Skills section fails Workday's skill search uses a virtual scroll list. If a skill isn't found, it is skipped automatically and the next skill is tried.
- Designed for Australian Workday job applications but works on any Workday instance
- The Claude sense-check before submission is advisory — you always have final approval before anything is submitted
.env,__pycache__/, and output folders are excluded from git via.gitignore