This is my resume written in LaTeX based on a template created by Jason Blevins. The original template can be found on Jason's website. Also the license provided in the original template is given both below and in the source code of my resume.
By default, the build runs inside Docker, so the only requirement is a working
Docker installation. The first run will build a
local image (resume-builder:local) from the included Dockerfile; subsequent
runs reuse it unless Dockerfile or requirements.txt change.
To build without Docker, set USE_DOCKER=no. This requires the following to be
installed locally:
- A full TeX Live distribution (including
latexmk,xelatex,chktex, andlatexindent) - Python 3
- Python dependencies:
pip install -r requirements.txt
make all # Generate .tex files from YAML data, then compile to PDF
make generate # Generate .tex files only
make compile # Compile existing .tex files to PDF
make check # Run chktex on generated .tex files
make lint # Run latexindent on generated .tex files
make list # List available resume variants
make clean # Remove the build directory
make clean-docker # Remove the local Docker image
make clean-all # Remove build directory and Docker image
To skip Docker for any target, append USE_DOCKER=no:
make all USE_DOCKER=no
Resume data lives in data/resume.yaml. Variant configurations in the
variants/ directory control which sections and content are included in each
output. Running make generate invokes scripts/build.py to produce a .tex
file per variant in build/, and make compile then compiles each to PDF.
The LinkedIn profile (build/linkedin.md) is also generated from resume.yaml.
Bullet selection for LinkedIn is controlled by the linkedin.work section in the
YAML, following the same pattern as variant configs.
These guidelines are based on widely accepted best practices for resumes and
LinkedIn profiles. Follow them when adding or editing content in resume.yaml
and variant configs.
Each variant must fit within two pages when compiled to PDF. To stay within this limit:
- Keep 3–4 bullets per position (5 max for a current/primary role).
- Write concise bullets: lead with an action verb, state what you did and the result, and aim for 1–2 lines of text each.
- The position description field should be a single sentence summarizing the role; detailed accomplishments belong in bullets.
- Prefer concrete outcomes (metrics, adoption, standards established) over listing responsibilities.
- If a new bullet pushes a variant past two pages, cut the weakest existing bullet rather than trimming font size or margins.
- About section: One short paragraph (3–4 sentences). Conversational tone, first person.
- Experience bullets: 3–4 per position, same as the resume.
- Bullet selection: The
linkedin.worksection inresume.yamlcontrols which bullets appear on LinkedIn. Choose the most impactful and broadly understandable accomplishments. Save niche technical details for the resume variants. - Avoid duplicating the position description in a bullet. The description provides context; bullets should add specific accomplishments on top of it.
A release is automatically created via a GitHub Actions workflow whenever a PR
with a release label is merged into the default branch.
See LICENSE