Top
Best
New

Posted by sinaatalay 12/21/2025

Show HN: RenderCV – Open-source CV/resume generator, YAML to PDF(github.com)
I built RenderCV because Word kept breaking my layout and LaTeX was overkill. I wanted my CV as a single YAML file (content, design, margins, everything) that I could render with one command.

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/

100 points | 41 commentspage 2
michidk 12/21/2025|
Why invent a new file format when there is https://jsonresume.org/? Its also quite easy to customize and add more things as it does not prohibit extra values
sinaatalay 12/21/2025|
The JSON Resume schema did not support what we needed, so we deliberately created our own.

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.

fheysen 12/23/2025||
Used this for a recent resume update, super practical. Love the YAML + Typst combo and the version-controlled workflow. Thanks for building and sharing—this is genuinely useful!
NewsaHackO 12/21/2025||
Wish I had seen this before making my resume in latex. One question, though to add publications, is it possible to use bibtex, or do you have to manually convert each publication to YAML?
sinaatalay 12/21/2025|
Yes, unfortunately, you will need to convert them to YAML. I think an LLM can easily do that for you, though. This has been requested before, but we haven’t implemented it in order to keep our schema robust and simple. Maybe we should add it.
NewsaHackO 12/21/2025||
OK, thanks. I don't have a lot of publications or anything, so for me it wouldn't be too much of an issue, but in certain fields I thought a CV was mostly publications/citations.
catapart 12/21/2025||
Oh awesome! This is a great solution to resumes. The only thing I'd like more is a web app to run it in.
sinaatalay 12/21/2025|
We do have that, but it’s a bit outdated. We’ll update it at some point: https://app.rendercv.com
dfajgljsldkjag 12/21/2025||
This is clearly a real project that was built over several years with human effort (not vibe coded). Which makes it all the more depressing that the author decided to take a massive dump over the entire README.md with AI slop.

Sadly, it appears the project was heavily sloppified a mere 2 weeks ago: https://github.com/rendercv/rendercv/commit/5cc5fbdf9ec1a742...

sinaatalay 12/21/2025|
You're absolutely right!
opengrass 12/21/2025||
Yaml itself can be a resume.
brcmthrowaway 12/22/2025||
How does this differ to TeX?
uniqueuid 12/21/2025||
I get the motivation, but it honestly feels a bit weird to use tens of thousands of lines of python code to do something that you can just directly do in typst.

I mean, a CV is not really rocket science and there are quite a few great typst templates out there.

browningstreet 12/21/2025|
As someone who's done a lot of hiring over the years and read/scanned thousands of resumes, I can attest: CVs are indeed rocket science.
uniqueuid 12/21/2025||
Point taken, but I'd prefer 200 lines of rocket science that I understand and control over 60k lines of (cleanly written and documented) rocket science.

(Although admittedly both plain typst and this project are still way less complex than LaTeX.)

thangalin 12/21/2025|
In tough job markets, submitting 100 résumés before getting hired is not uncommon. Of possible interest is my Creating Catchy Cover Letters blog post, which uses my Markdown editor, KeenWrite (https://keenwrite.com), to create PDF files styled to match a company's branding:

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/