Automated, CI/CD-driven resume platform built with Python, RenderCV, and Typst.
Welcome to the source code of my professional resumes.
Instead of fighting with word processors or manual formatting, this repository treats my resumes like a software project. It uses RenderCV (a YAML-to-PDF engine) and Typst (a modern typesetting system) to automatically compile a suite of pixel-perfect, ATS-optimized PDFs every time I push an update.
Unlike generic web resume builders or legacy LaTeX engines (like pdfLaTeX) that produce bloated, over-engineered binaries, this pipeline is engineered for extreme efficiency:
- 🪶 Ultra-Lightweight (~50–80 KB): Native font subsetting and modern object formatting shrink the final PDF size down drastically compared to traditional 250KB+ LaTeX outputs.
- 🦀 Rust-Powered Speed: Built on top of Typst's modern compilation core written in Rust, rendering happens in milliseconds rather than sluggish macro expansions.
- 🤖 100% ATS-Friendly: Clean, semantic text streams ensure Applicant Tracking Systems parse your work history, skills, and data fields with zero character corruption or parsing loss.
This project strictly separates content (data) from design (presentation) and supports multiple targeted resume profiles (e.g., Backend, Full-Stack).
- Content: All resume data lives in specific YAML files inside
src/(e.g.,resume.yaml,resume_backend.yaml). - Design Engine: The visual layout is powered by a shared, custom Jinja2/Typst templating engine located in
src/customtheme/. - Automation (CI/CD): A fault-tolerant GitHub Action (
compile.yml) listens for changes to themasterbranch. It dynamically loops through all profiles, compiles them into PDFs, and commits the final artifacts to the rootresumes/directory.
.
├── .github/workflows/
│ └── compile.yml # CI/CD pipeline for automated PDF compilation
├── resumes/ # 🚀 PUBLIC DISTRIBUTION: The final, compiled PDF resumes
├── output/ # RenderCV build artifacts (ignored in version control)
├── src/
│ ├── customtheme/ # Shared Typst / Jinja2 template engine & entry styles
│ ├── resume.yaml # Core data file for main resume (used for all roles)
│ ├── resume_backend.yaml # Core data file for Backend roles (for specific targeting)
│ └── resume_fullstack.yaml # Core data file for Full-Stack roles
├── requirements.txt # Pinned Python package dependencies
├── build.sh # Quick-build shell script for local development
└── run.py # Cross-platform Python execution script for local builds
Updating these resumes takes seconds and requires absolutely no manual formatting.
- Open a target profile in
src/(e.g.,resume_backend.yaml). - Add, edit, or remove jobs, projects, or skills using standard YAML and Markdown syntax.
- Crucial: Ensure the file has an isolated output configuration at the bottom so build files don't clash:
rendercv_settings:
render_command:
output_folder_name: "output/Akash_Gupta_Backend"- Commit and push the changes to GitHub.
The GitHub Action will automatically intercept the push, build all valid resume*.yaml profiles, and extract the fresh PDFs into the resumes/ folder.
Note on Tailored One-Offs: If you need a company-specific resume, duplicate a profile, name it
resume_tailored_<company>.yaml(which is ignored by Git), build it locally, and submit. This keeps the repository completely clean.
This project strictly separates content from presentation. You are not locked into the current visual design and can easily modify it or swap it out entirely.
The current visual layout is a custom theme powered by Typst and Jinja2. To change fonts, spacing, margins, or the arrangement of elements:
- Open the
src/customtheme/folder. - Edit the
.j2(Jinja2) files inside theentries/folder to change how specific sections (like Education or Experience) are structured. - Edit the main style variables in
src/customtheme/__init__.pyor the core Typst files to adjust global styles.
If you want to completely swap out the design without writing any code, RenderCV comes with several beautiful built-in themes (Classic, Sb2nov, EngineeringResumes, etc.).
To use a built-in theme:
- Open your target profile (e.g.,
src/resume_backend.yaml). - Delete or comment out the current custom
design:block. - Replace it with a built-in theme reference:
design: theme: classic # Options: classic, sb2nov, engineeringresumes font: Source Sans 3 font_size: 10pt page_margins: 1.5cm
- Note: If you switch to a built-in theme, you can safely delete the
src/customtheme/folder from this repository.
📚 Helpful Links for Theming:
To match the GitHub Actions runner and test changes locally inside a sandbox, follow these steps (configured for WSL Ubuntu / Zsh):
- Create and activate a virtual environment:
python3 -m venv .venv
source .venv/bin/activate- Install Dependencies:
pip install --upgrade pip
pip install -r requirements.txt- Render the Resumes Locally:
You can compile your changes instantly using the built-in wrapper script (
build.sh) or the python engine (run.py). These scripts will safely build your profiles into the isolatedoutput/directory so you can preview them locally without affecting version control. Standard Build (All Profiles) Builds everyresume*.yamlfile found in thesrc/directory.
./build.shLive-Reload (Watch Mode) 🚀 Automatically recompiles your PDF in milliseconds every time you save the YAML file. If multiple profiles exist, it will open an interactive menu asking which one you want to watch.
./build.sh --watchTarget a Specific Profile You can also bypass the menu and directly build or watch a single, specific tailored resume:
./build.sh src/resume_backend.yaml
./build.sh src/resume_backend.yaml --watchThe updated PDFs will be generated instantly in your local output/ directory. (Note: The root resumes/ directory is strictly managed by CI/CD and will automatically update when you push your changes to GitHub).