Dynamic CV

Typst toolbox for dynamically generating CVs based on YAML files.

Usage

First clone this repository in the directory where you want to create your CVs. To get started create at least one YAML file containing your personal information with the following structure:

# Full name of the individual
name: John Doe

# Birth information (optional)
birth:
  # Date of birth
  date: "01.01.1980"
  # Place of birth, can be multiline
  place: |-
    New York City
    USA

# Citizenship (optional)
citizenship: United States

# Gender (optional)
gender: Male

# Address (optional), can be multiline
address: |-
  123 Main St
  Springfield
  IL 62704

# Phone number (optional)
phone: "+1 555 1234 567"

# Email address (optional)
email: "johndoe@example.com"

# Profile picture (optional)
picture: "path/to/profile/picture.png"

Other information like education, work or skills can be written using one of two schemas.

Timeline Schema

# List of the item
- title: "Bachelor of Science (BSc)"
  # Importance Level (optional), should be a number between 1 and 3 (defaults to 3)
  importance: 3
  # Description (optional), can be multiline
  description: "Computer Science, University of Example"
  # Attendance dates
  date:
    # Start date
    start: "09/2015"
    # End date (optional)
    end: "07/2019"

- title: "Professional Certification in Data Analysis"
  # Custom date label
  date: "Custom date label"

Category Schema

# First category
- category: "Language Skills"

  # Importance Level (optional), should be a number between 1 and 3 (defaults to 3)
  importance: 3

  # List of items in that category
  items:
    # Name of the skill
    - name: English
      # Importance Level (optional), should be a number between 1 and 3 (defaults to 3)
      importance: 3
      # Description or details, can be multiline
      description: Native speaker

# Second category
- category: "Computer Skills"

  # Items in this category as one string
  items: |-
    Proficient in LaTeX, Typst.
    Familiar with LibreOffice and OpenOffice.

Naturally all YAML schemas can be extended with custom keys and values if needed.

Start your Typst document with the cv template. Provide the paths to your YAML files in the paths argument. personal is required further paths with arbitrary names can be added depending on your need.

#import "lib.typ": *

#show: cv.with(
  // Paths to your YAML files
  paths: (
    personal: "personal.yaml",
    education: "education.yaml",
    work: "work.yaml",
    skills: "skills.yaml",
  ),

  // CV Configuration
  cfg: config_translations.en

  // Default column ratios for tables
  columns: (1fr, 3fr),
)

Afterward you have access to the config and information state variables to build your document.

#context config.get()
#context information.get()

The information from your YAML files can then be displayed in a structured way using the personal_table, timeline_table or category_table function.

#context {
  let cfg = config.get()
  let info = information.get().personal

  personal_table(cfg, info, profile)
}

NOTE: If the personal config contains a profile picture path, the profile function is used to place the picture. Use profile.with(...) with custom parameters to change the position of the picture.

Utility Functions

This repo provides further utility functions to make parsing of the YAML files and building a CV easier.

  • get_date: Convert date from YAML file into corresponding string.
  • signature: Draw a signature field with place and date.

Importance

The importance key is a way to adjust the size and complexity of your CV according to your need. The importance of you CV is provided with the configuration:

#let cfg = config_trasnlations.en
#cfg.insert("importance", 2)

Given this value functions like personal_table and timeline_table will only display items with an importance greater than or equal to this value.

Styling

The output generated by the different *_table functions uses table to structure the information. It can therefore be styled by changing the appearance of a table.

#show table: ...
#set table(...)

The emphasized text can be styled by changing the appearance of a strong element.

#show strong: set text(red)

Last page update: Friday, July 4th 2025, 04:34:12 UTC

Many of the articles on this website are automatically generated from the markdown files in the corresponding repositories. This might lead to some unexpected results, so please let me know if you find any errors!

Some articles are still in German, but I am working on translating them. If you are interested in a specific article, don't hesitate to contact me!

If you want to get in touch, you can send me an email at lukas.schuettler@tum.de.