Run rendercv render cv.yaml → get a perfectly typeset PDF.
Highlights:
1. Version-controllable: Your CV is just text. Diff it, tag it.
2. LLM-friendly: Paste into ChatGPT, tailor to a job description, paste back, render. Batch-produce variants with terminal AI agents.
3. Perfect typography: Typst under the hood handles pixel-perfect alignment and spacing.
4. Full design control: Margins, fonts, colors, and more; tweak everything in YAML.
5. Comes with JSON Schema: Autocompletion and inline docs in your editor.
Battle-tested for 2+ years, thousands of users, 120k+ total PyPI downloads, 100% test coverage, actively maintained.
GitHub: https://github.com/rendercv/rendercv
Docs: https://docs.rendercv.com
Overview on RenderCV's software design (Pydantic + Jinja2 + Typst): https://docs.rendercv.com/developer_guide/understanding_rend...
I also wrote up the internals as an educational resource on maintaining Python projects (GitHub Actions, packaging, Docker, JSON Schema, deploying docs, etc.): https://docs.rendercv.com/developer_guide/
Does this support custom CSS for the layout or is it bound to the YAML templates?
We wanted to define 9 different entry schemas that could be used under any section title. In our schema, each section, regardless of its title, contains a list composed of one of these nine entry types. This is different from the JSON Resume approach, where specific entry schemas are tied to specific sections (work schema for work section, etc.).
In RenderCV, users can choose any section title they want and use any of the 9 entry types within it. Each entry type is rendered differently in the generated PDF.
I don't know what the solution really is, but as much as I hate it, a verified Linkedin Profile is a huge signal now. Otherwise a real personal site with care and history. I am guilty of being bad with the second so - no easy answers. Maybe even a wacky looking CV would make me notice a candidate more. Powerpoint 90s style.
I have a lot of anxiety about missing opportunities because of shitty OCR.
I have the technical background to write Latex and Typst documents but I honestly didn't want the headache. Plus I'm the type to futz with styling all day long instead of putting down actual content. RenderCV was simple to use and did exactly what I wanted.
https://typst.app/universe/package/basic-resume/
Does anyone have examples of how they’re using the YAML?
Here are a couple of reasons, just a few that come to mind, why using YAML + RenderCV can be more appealing than working directly in Typst:
- Reusing the same content across multiple themes. YAML + RenderCV allows you to experiment with different themes and design options to the exact same content with no changes to the data itself. This is difficult to achieve in pure Typst, where switching templates typically means adapting your content to a different set of Typst commands.
- Centralized control over entry layouts. You can adjust how entire classes of entries are rendered from a single place—for example, changing the layout of all education entries at once, rather than editing each entry individually.
Sadly, it appears the project was heavily sloppified a mere 2 weeks ago: https://github.com/rendercv/rendercv/commit/5cc5fbdf9ec1a742...
I mean, a CV is not really rocket science and there are quite a few great typst templates out there.
(Although admittedly both plain typst and this project are still way less complex than LaTeX.)
https://keenwrite.com/blog/2025/10/15/creating-catchy-cover-...
A handful of prospective managers told me that my cover letter stood out among hundreds of applicants.
Here's the full shell script I used to build cover letters (you'll need to point "theme dir" to the directory where the cover letter theme---aspiros---is found). With this script, creating a cover letter went from about 20 minutes down to 5. If you have any troubles getting it to work, contact me via https://whitemagicsoftware.com/.
#!/usr/bin/env bash
# This script builds a cover letter based on a company's branding. The
# parameters include:
#
# $1 -- The company name as a directory, containing colours and logo.
# $2 -- The company name (normal case).
# $3 -- The company role (job title).
# $4 -- The relative path to the cover letter to typeset.
#
# Example:
#
# ./build.sh corp Corporation 'Job Title' template/cover-letter.md
readonly SCRIPT_SRC="$(dirname "${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}")"
readonly SCRIPT_DIR="$(cd "${SCRIPT_SRC}" >/dev/null 2>&1 && pwd)"
readonly COMPANY_DIR="${1:-template}"
readonly COMPANY_NAME="${2:-Template}"
readonly COMPANY_ROLE="${3:-Job Title}"
readonly PATH_COVER_LETTER="${4:-climate/cover-letter.md}"
readonly EMPLOYEE_NAME="${5:-Your Name}"
readonly EMPLOYEE_ROLE="${6:-Your Role}"
read -r COLOUR_FG COLOUR_BG COLOUR_AC < "$COMPANY_DIR/colours.txt"
readonly COLOUR_FG COLOUR_BG COLOUR_AC
magick \
signature-black.png \
-alpha extract \
-background "#${COLOUR_AC}" \
-alpha shape \
-define png:color-type=6 \
signature.png
rm -f ${HOME}/.local/share/keenwrite/logo_svg_*.pdf
keenwrite.bin \
-i "${PATH_COVER_LETTER}" \
-o cover-letter.pdf \
--set=employer.company.name="${COMPANY_NAME}" \
--set=employer.position.role="${COMPANY_ROLE}" \
--set=employee.name="${EMPLOYEE_NAME}" \
--set=employee.role="${EMPLOYEE_ROLE}" \
--set=employee.contact.phone="555-1212" \
--set=employee.contact.email="email@hostname" \
--set=employee.portfolio.url="gitlab.com/YourName" \
--set=employee.address.line.1="address 1" \
--set=employee.address.line.2="city, province" \
--set=employee.address.line.3="postal code" \
--metadata="foreground=${COLOUR_FG}" \
--metadata="background=${COLOUR_BG}" \
--metadata="accent=${COLOUR_AC}" \
--image-dir="${SCRIPT_DIR}/${COMPANY_DIR}" \
--theme-dir="${HOME}/dev/java/keenwrite/themes/aspiros"
exiftool \
-overwrite_original_in_place \
-Title="${EMPLOYEE_NAME}" \
-Author="${EMPLOYEE_NAME}" \
cover-letter.pdf
This saved me about 19 hours of work; hopefully it will save you time, as well. See also: https://xkcd.com/1205/