Applying Platform Thinking to the Job Hunt
Most job applications today are screened by AI-driven applicant tracking systems (ATS) before a human ever sees them. That means formatting consistency, keyword alignment, and clarity aren’t just nice to have — they’re survival traits. Manually tailoring each version is slow and error-prone.
I’ve been building production systems for thirty years, from backend services to release automation. When I saw myself maintaining multiple Word documents for different job contexts, I did what any software engineer would do: I built a system instead.
The problem and solution
Job hunting requires multiple résumé versions for different roles like platform vs backend. It also demands multiple formats like PDF, HTML, and plain text for ATS filters. Additionally, you need to manage the content selectively by hiding old projects, limiting bullets, and emphasizing different skills. Manually maintaining these variations leads to copy-paste errors, outdated information, and hours spent reformatting.
Instead of managing variants manually, I treat my résumé as data flowing through a configurable transformation pipeline. One YAML file adhering to the JSON Resume schema serves as the source of truth. Pandoc with custom Lua filters transforms it based on YAML config files.
The filters hide entries marked x-hidden: true, filter by date ranges, limit bullet points, and format dates consistently. They also adjust section titles automatically. The system outputs PDF (via WeasyPrint), HTML, Markdown, or plain text. Git branches track versions per company/role.
The architecture separates content (YAML), presentation (templates), and transformation logic (Lua filters). Configuration over duplication. Infrastructure as code.

Example: Platform engineering résumé
Here’s how that thinking plays out in practice. For a platform engineering role, I want to:
- Hide CPAN projects older than 10 years (too Perl-focused)
- Limit work highlights to 3 per job (keep it concise)
- Emphasize containerization and automation experience
Example commands
# Adjust configuration
vim share/pandoc/metadata/date_past.yaml # Set project age limit
vim share/pandoc/metadata/highlights_limit.yaml # Set bullet limits
# Generate
./scripts/save_pdf.sh eg/mjgardner_resume.yaml
# Or with Docker
docker compose run --rm resume-remixer \
./scripts/save_pdf.sh eg/mjgardner_resume.yaml
The pipeline automatically:
- Filters out old projects
- Trims bullet points to the first 3 per job
- Updates section titles (“Projects” → “Selected Recent Projects”)
- Generates clean, professional PDF output
No manual editing. No copy-paste. Reproducible every time.
Infrastructure thinking in practice
Platform engineering isn’t just specific tools — it’s an approach. When you see a repetitive manual process, you automate. When data needs multiple representations, you build transformation pipelines. When reproducibility matters, you containerize.
This résumé generator uses the same principles I apply to release pipelines and build automation. One source of truth, configurable transformations, reproducible output. The tools here are Pandoc, Lua, and Docker, but the approach works regardless of stack.
Using JSON Resume schema makes the data portable. Dockerizing the pipeline ensures reproducibility across platforms. Version control enables branching per application. The right abstractions (YAML config files instead of code) make it usable.
The code
Full source, documentation, and examples: codeberg.org/mjgardner/resume-remixer
Licensed open source. If you’re maintaining multiple résumé versions manually, give it a try. Let me know how you adapt it for your own workflow.

