RenderCV Resume Builder

repository·main·Indexed 12 days ago

https://github.com/rendercv/rendercv

A resume and CV builder for academics and engineers that converts YAML content into professionally typeset, ATS-compatible PDFs using Typst. Version 2.8 features a variety of themes, extensive design customization, and a Typst package for programmatic CV construction.

Tokens
30.1K
Snippets
98
Records
133
Agent score
95%

What's inside RenderCV

  1. Understand RenderCV's GitHub Actions Workflows

    main

    RenderCV uses GitHub Actions to automate repetitive CI/CD (Continuous Integration/Continuous Deployment) tasks. All workflows follow a standard initialization pattern: cloning the repository, installing uv, installing just, and then executing specific just commands to ensure the automation environment matches the local development environment.

    There are four primary workflows in the repository:

    1. test.yaml: Runs tests and coverage reports across multiple environments (3 OSs × 3 Python versions: 3.12, 3.13, 3.14).
    2. deploy-docs.yaml: Builds the documentation site using just build-docs and deploys it to GitHub Pages.
    3. create-executables.yaml: Builds standalone executables for Linux (x86_64, ARM64), macOS (ARM64), and Windows (x86_64) using just create-executable.
    4. release.yaml: The master release pipeline that orchestrates testing, package building (via uv build), executable creation, GitHub release asset attachment, PyPI publishing, and Docker image deployment.
  2. Customize locale translations and formatting

    main

    You can fine-tune a locale by overriding specific translation fields or by providing a complete set of custom strings. This allows you to customize month names, date formatting, and other language-specific text.

    Common keys for customization include:

    • month
    • months
    • year
    • years
    • present
    • last_updated
    • month_abbreviations (a list)
    • month_names (a list)
    locale:
      language: german
      present: jetzt  # Override just this field
  3. Configure RenderCV using YAML sections

    main

    A RenderCV input is organized into four primary sections. You can keep these in a single file or split them into separate files for reusability.

    • cv: Contains your personal content (name, contact info, and all experience/education sections).
    • design: Controls visual styling (themes, colors, fonts, margins, spacing, and layouts).
    • locale: Manages language settings (month names, translations, and phrases).
    • settings: Configures behavior (output paths, auto-bolding keywords, and the current date).

    Using Separate Files

    To reuse a design or locale across multiple CVs, you can load them independently via the CLI:

    rendercv render cv.yaml --design design.yaml --locale-catalog locale.yaml --settings settings.yaml

    Note: When using separate files, each file must contain its respective top-level key (e.g., design.yaml must start with design:).

  4. How Typst templates are generated with Jinja2

    main

    To separate layout from data, RenderCV uses the jinja2 templating engine. Typst templates (stored in src/rendercv/renderer/templater/templates/typst/) define the visual structure, while the validated Python objects provide the content.

    Users can potentially customize their CV by overriding these templates. The Python logic uses jinja2_env.get_template() to fetch a template and .render(cv=cv) to inject the data.

    = {{ cv.name }}
    {% if cv.location %}
    {{ cv.location }}
    {% endif %}
    
    {% if cv.email %}
    #link("mailto:{{ cv.email }}")
    {% endif %}
  5. Manage dependencies with `uv.lock`

    main

    The uv.lock file is a dependency lock file that records the exact version of every package used by RenderCV. This ensures reproducibility across different machines and time.

    Important Rules:

    • Never edit uv.lock manually.
    • To update dependencies, use the command: just lock.
    • Always commit uv.lock to git to ensure all developers and environments use identical package versions.
  6. Add arbitrary keys to entries

    main

    You can add arbitrary keys to any entry in your YAML. By default, these keys are ignored during rendering, but they can be referenced in the design.templates field to create custom layouts.

    experience:
      - company: Startup Inc
        position: Founder
        start_date: 2020-01
        end_date: present
        revenue: $5M ARR  # Custom field
        highlights:
          - Built product from zero to profitability
  7. Structure CV Sections and Entries

    main

    The sections field is a dictionary where keys are the section titles (e.g., experience, education) and values are lists of entries.

    Important Constraint: Each section must contain only one type of entry. You cannot mix different entry types (e.g., ExperienceEntry and EducationEntry) within the same section.

    sections:
      summary:
        - Software engineer with 10 years of experience.
    
      experience:
        - company: Acme Corp
          position: Senior Engineer
          start_date: 2020-01
          end_date: present
          highlights:
            - Led migration to microservices
  8. What the RenderCV AI Agent Skill provides

    main

    Once the skill is installed, your AI agent gains specialized knowledge to automate CV workflows. The skill provides:

    • YAML Schema Knowledge: Full understanding of the input structure, including Pydantic model schemas for precise field types and defaults.
    • Themes & Design: Knowledge of all 6 built-in themes and their specific design options.
    • Localization: Complete support for 20 built-in languages and locales.
    • CLI Mastery: Full list of rendercv CLI commands and their available options.
    • Reference Material: A complete sample CV to use as a template for generation.
  9. Use the `design` field to control CV visual aspects

    main

    The design field in your YAML configuration controls the visual appearance of your CV, including colors, fonts, spacing, and layout.

    Using Built-in Themes

    RenderCV provides several built-in themes. To use one, specify it under the design key:

    design:
      theme: classic

    Theme Inheritance and Overriding

    Themes act as sets of default values. You can customize a theme by overriding specific fields.

    • Partial Override: If you only specify a few settings, RenderCV uses the theme's defaults for everything else. This is the recommended way to fine-tune a design.
    • Full Override: If you specify every possible design option in your YAML, changing the theme value will have no effect because your explicit settings will always take precedence.
    • Switching Themes: If you leave settings unspecified, changing the theme will completely change the look of your CV because the new theme will provide different default values.
    design:
      theme: classic
      colors:
        name: rgb(255, 0, 0)
  10. Template syntax and available variables

    main

    RenderCV templates use a combination of Jinja2 syntax and Typst code. Templates are identified by the .j2.typ extension.

    Available Variables

    When writing templates, you have access to the following context variables:

    • cv: The complete CV data object (contains name, sections, etc.).
    • design: The complete design options object.
    • locale: Locale-specific strings (e.g., month names, translations).
    • entry: The current entry data (available specifically within entry templates).

    Example: Iterating through entry lines

    In an entry template (e.g., entries/NormalEntry.j2.typ), you can use Jinja2 to split and iterate over text:

    #regular-entry(
      [
    {% for line in entry.main_column.splitlines() %}
        {{ line }}
    {% endfor %}
      ],
      [
    {% for line in entry.date_and_location_column.splitlines() %}
        {{ line }}
    {% endfor %}
      ],
    )

    Example: Accessing design options

    You can access design configuration within the Preamble.j2.typ to set up the Typst environment:

    #show: rendercv.with(
      page-size: "{{ design.page.size }}",
      colors-body: {{ design.colors.body.as_rgb() }},
      typography-font-family-body: "{{ design.typography.font_family.body }}",
    )
    // Example: entries/NormalEntry.j2.typ
    #regular-entry(
      [
    {% for line in entry.main_column.splitlines() %}
        {{ line }}
    {% endfor %}
      ],
      [
    {% for line in entry.date_and_location_column.splitlines() %}
        {{ line }}
    {% endfor %}
      ],
    )
  11. Markdown to Typst conversion

    main

    RenderCV allows users to write Markdown syntax (like **bold** or [links](url)) within their YAML files. Since the Typst compiler does not natively understand Markdown, RenderCV uses the markdown library to parse the text into an XML tree.

    A custom parser then walks this tree and converts Markdown elements into their Typst equivalents:

    • **text** (strong) becomes #strong[text]
    • *text* (em) becomes #emph[text]
    • [text](url) (a) becomes #link("url")[text]