A structured AI workflow system built with Claude that automates the full job application pipeline — from job description analysis through to tailored application documents and phased learning plans.
Built by a senior full-stack developer (.NET · Angular · Azure) as a portfolio project during an active job search.
Every job posting requires a different framing of the same experience. ATS systems filter on exact keywords. Cover letters need a specific angle per company. Gaps vary by role. Doing this manually at scale is slow, inconsistent, and easy to get wrong.
The goal was to engineer a system that handles the repetitive, structured work — accurately — so that effort goes into the decisions, not the document production.
The system is built around four layers:
Canonical context files that every workflow draws from:
- Resume snapshot — master resume in Markdown; the single source all documents are generated from
- Profile facts — cert status, key differentiators, resolved framing gaps, known genuine gaps
- Skills summary — ATS keyword lists by technology area; cert domain coverage tables
- Course files — completed Pluralsight and Microsoft Learn training, used to map gaps to evidence
These files are never edited mid-session. They are loaded at the start of each workflow to ensure consistency across outputs.
Modular prompt templates — called "skills" — each scoped to a specific workflow:
| Skill | Purpose |
|---|---|
gap-analysis |
Compares resume against a job description; produces fit rating, strength/gap breakdown, and application strategy |
cover-letter-and-resume |
Generates ATS-optimized DOCX resume + cover letter tailored to a specific posting |
generate-general-resume |
Generates a general-purpose base resume for job boards and recruiter submissions |
learning-plan |
Converts gap analysis output into a phased learning plan with verified course URLs |
interview-prep |
Generates a role-specific interview guide covering phone screen, technical, system design, and behavioural rounds |
azure-focused-net-developer |
Specialized workflow routing and ATS keyword reference for Azure/.NET roles |
salary-research |
Researches market salary and contract rates; produces a negotiation-ready reference document |
Each skill file specifies: inputs required, step-by-step workflow, output format, file naming conventions, and ATS/formatting rules.
Application documents are generated as formatted files — not markdown — to match recruiter and ATS expectations:
- Resumes and cover letters: Node.js +
docxlibrary; templated JS files with// FILL:sections; ATS-safe formatting (no tables, no columns, no text boxes) - Learning plan PDFs: Python + ReportLab; phased course cards with colour-coded priority levels and clickable URLs
Templates enforce consistent formatting across every document — margins, spacing, section order, bullet style — so outputs don't need manual cleanup.
Each workflow output feeds the next:
Job Description
↓
Gap Analysis ──→ fit rating · ATS keywords · gap list
↓
Learning Plan ──→ phased courses · verified URLs · priority order
↓
Resume + Cover Letter ──→ keywords injected · bullets reordered · cert status current
The system is designed so a new job posting can move through the full pipeline in a single session with no hallucinated experience and no generic filler.
Source-of-truth context management All workflows load the same canonical files rather than relying on session memory. This prevents drift across sessions and ensures cert status, gap classifications, and experience details are always current.
Token efficiency Context files are designed to be lean — titles only in course lists, concise gap descriptions, no verbose explanations. Claude loads multiple files per session; token cost compounds quickly if files are bloated.
ATS compliance as a constraint, not an afterthought Resume templates enforce ATS rules structurally: no tables, no columns, no headers/footers, standard section headings, plain bullet characters, no colour. These are baked into the template — they can't be broken by filling in content.
Verified URLs only The learning plan skill maintains a verified course URL reference. Slugs are confirmed live before inclusion. The system never guesses a course URL — hallucinated links are a silent failure mode that undermines the whole output.
Gap classification discipline The gap analysis skill distinguishes between four states: strong match (production experience), framing gap (skill exists but not surfaced), course-level (coursework only, no production use), and genuine gap (not present). Softening genuine gaps is explicitly prohibited — this keeps the output honest and the application strategy realistic.
Stage-aware interview preparation The interview prep skill scopes content to the interview stage (phone screen / technical / final round). Bringing final-round depth to a phone screen is as much a failure mode as being underprepared.
/
├── README.md
└── examples/
├── profile-facts-template.md — template for the source-of-truth profile facts file
├── skills/
│ ├── gap-analysis-SKILL.md
│ ├── cover-letter-resume-SKILL.md
│ ├── generate-general-resume-SKILL.md
│ ├── learning-plan-SKILL.md
│ ├── interview-prep-SKILL.md
│ ├── azure-focused-net-developer-SKILL.md
│ └── salary-research-SKILL.md
├── templates/
│ ├── resume-template.js — JD-tailored resume scaffold
│ ├── cover-letter-template.js — cover letter scaffold
│ └── general-resume-template.js — base resume scaffold for job boards
└── sample-outputs/
└── gap-analysis-sample.md — anonymized example gap analysis output
All examples are anonymized — personal contact details and employer names have been replaced with placeholders.
| Layer | Technology |
|---|---|
| AI | Claude (Anthropic) |
| Prompt architecture | Structured instruction system / skill library |
| Resume / cover letter generation | Node.js · docx npm package |
| PDF generation | Python · ReportLab |
| Context files | Markdown |
| Version control | Git / GitHub |
Built by Andrea Kaplen — Senior Full-Stack Developer | C# · ASP.NET Core · Angular · Azure
Open to senior full-stack, .NET, and Azure developer roles — remote preferred, Winnipeg-based.