Hi! If you're a prospective employer who followed the link from my resume, welcome.
This is the workflow I built to assist with applications during my job search.
This repo is an AI-assisted job application pipeline built on top of Claude Code. Instead of sending the same generic resume everywhere, it tailors my resume to each specific role by analyzing the job requirements against my base resume and a self-assessed skills inventory. The case for doing this is clear: according to Huntr's Q2 2025 Job Search Trends Report, tailored resumes convert at 5.75% from application to interview versus 2.68% for generic ones — a 115% improvement.
Phase I — Foundation
A canonical base-resume.md and skills.yaml serve as the source of truth. skills.yaml is a keyword-level self-assessment (0–10) across every technology and discipline I've worked in — it's what drives honest gap analysis rather than keyword stuffing.
Phase II — Per-Role Pipeline
For each job posting:
- Catalog — The req is saved and tracked in a Notion database with status, salary range, and application link.
- Skills match — Keywords are extracted from the posting and cross-referenced against
skills.yaml. Gaps are surfaced explicitly rather than papered over. - Tailored resume — A role-specific resume is generated from
base-resume.md, emphasizing the strongest fit for that particular role. It's exported to PDF (via Typst) and DOCX, then uploaded to Google Drive and linked back into the Notion tracker.
base-resume.md # Canonical source resume
skills.yaml # Self-assessed skill ratings (0–10)
generate-resume.sh # Converts .md → .pdf (pandoc + typst) and .docx
upload-resume.sh # Uploads pdf/docx to Google Drive, returns shareable URLs
jobs/
[company-name]/
[job-title].txt # Original job posting
matthew-j-martin-resume-for-[job-title]-[company-name].md
matthew-j-martin-resume-for-[job-title]-[company-name].pdf
matthew-j-martin-resume-for-[job-title]-[company-name].docx
A natural next step would be to chunk base-resume.md into atomic units — one embedding per bullet, per role, per skills cluster — store them in a vector database, and retrieve only the most semantically relevant experience for each job req rather than passing the full resume as context. That's a legitimate architecture and would scale well if the source corpus grew to include GitHub projects, blog posts, or years of accumulated roles.
It's not needed here because the entire base resume fits comfortably within the model's context window. RAG trades retrieval precision for the simplicity of full-context inclusion; at this corpus size, full inclusion wins. If the source material ever outgrows the context window, or if retrieval needs to span richer sources, adding a pgvector or sqlite-vec layer would be the natural next step.
Applying thoughtfully at scale is a solved problem if you treat it like an engineering problem. This workflow keeps me honest about fit, saves time on formatting, and ensures every resume I send is genuinely tailored — not just a find-and-replace on a template.
Matthew J. Martin · LinkedIn · GitHub · me@matmar10.com