Skip to content

Configuration Reference — profile_<name>/metadata.toml

Each profile_<name>/metadata.toml is a complete, self-contained configuration for that CV variant. There is no shared root or merge mechanism — looking at one file shows the full effective config for that profile.

Switch profiles at compile time:

typst compile cv.typ --input profile=fr

To add a new profile, copy profile_en/ to profile_<new>/ and edit the fields that differ.

How to read this page

The reference below is the canonical template/profile_en/metadata.toml included verbatim — comments in the TOML are the field documentation. The web documentation pulls from it via a live snippet, so the field descriptions stay aligned with the starter project.

Every other shipped profile (profile_fr, profile_de, profile_it, profile_zh) follows the same schema; differences are in field values, not field names.

Annotated reference

#:schema ../metadata.toml.schema.json

# Profile: English. Each profile_<name>/metadata.toml is a complete, self-
# contained CV configuration. Switch profiles at compile time:
#     typst compile cv.typ --input profile=fr
# To add a new profile, copy this directory to profile_<name>/ and edit
# the fields that differ.

# Italic tagline displayed below your name and contact info
header_quote = "Experienced Data Analyst looking for a full time job starting from now"

# Text shown in the left side of the footer on CV pages
cv_footer = "Curriculum vitae"

# Text shown in the left side of the footer on cover letter pages
letter_footer = "Cover letter"

[layout]
    # Accent color used for section titles, icons, and highlights in the rendered PDF
    # Preset: skyblue, red, nephritis, concrete, darknight — or any hex like "#1E90FF"
    awesome_color = "skyblue"

    # Controls vertical spacing; increase to spread out sections/entries, decrease to compact
    before_section_skip = "1pt"
    # Vertical space before each entry within a section
    before_entry_skip = "1pt"
    # Vertical space before entry description text
    before_entry_description_skip = "1pt"

    # Page dimensions and margins applied to the PDF output. Possible values: a4 (default), us-letter
    paper_size = "a4"

    # Width of the right-side date column in entries. Tune per locale (zh
    # benefits from ~4.7cm, fr from ~3.4cm, it from ~3.9cm).
    date_width = "3.6cm"

    # Overrides base font size for body text; affects overall density of content
    #font_size = "9pt"

    [layout.fonts]
        # Body and entry text. List multiple fonts to mix scripts — typst's
        # codepoint-level fallback picks per character (e.g. add "Heiti SC"
        # after "Source Sans 3" for a Latin+CJK profile).
        regular_fonts = ["Source Sans 3"]
        # Font used for the name and section headings in the header
        header_font = "Roboto"

    [layout.header]
        # Aligns the entire header block (name, info, quote). Possible values: left, center, right
        header_align = "left"

        # false hides the photo and gives full width to name/info
        display_profile_photo = true
        # "50%" = circle, "0%" = square, "10%" = rounded corners
        profile_photo_radius = "50%"
        # Font size for the contact-info line (email, phone, links) in the header
        info_font_size = "10pt"

    [layout.entry]
        # true = company name bold on top, role below; false = role bold on top
        # Must be true to use cv-entry-start / cv-entry-continued pattern
        display_entry_society_first = true

        # false hides all company/organisation logos in entries
        display_logo = true

    [layout.section]
        # How the section title is highlighted:
        #   "first-letters" (default) - first N grapheme clusters in accent color, rest in black (Latin convention)
        #   "full"                    - the whole title in accent color (CJK / non-Latin convention)
        #   "none"                    - the whole title in black, no accent
        title_highlight = "first-letters"

        # Number of leading grapheme clusters to render in accent color when
        # title_highlight = "first-letters". Ignored for the other modes.
        title_highlight_letters = 3

    [layout.footer]
        # true shows "1/2" style page numbers in the footer
        display_page_counter = false

        # false removes the footer entirely (no page text, no counter)
        display_footer = true


[inject]
    # OPT-IN: hidden keyword text (2pt, white) placed in the PDF so automated
    # screening systems (ATS) that match keywords can pick it up. Disabled by
    # default — uncomment to enable, and weigh the trade-offs first:
    #   - Some ATS vendors and recruiters actively detect hidden text and may
    #     treat it as manipulation, up to rejecting the application outright.
    #   - The text stays extractable: copy/paste or "select all" reveals it.
    #     (It is marked as a PDF artifact, so screen readers skip it.)
    #   - Keep any keywords truthful to skills you actually have.
    # injected_keywords_list = ["Data Analyst", "GCP", "Python", "SQL", "Tableau"]

    # Optional free-form hidden prompt aimed at LLM-based screeners. Same
    # detection risks as above, and modern models largely ignore injected
    # instructions — treat as experimental.
    # custom_ai_prompt_text = "Custom prompt text here..."

# Put metadata used only by your own content modules under this open namespace.
# Package-owned sections remain strict, so typos there are caught by the schema.
# [custom]
#     portfolio_url = "https://johndoe.dev/work"

[personal]
    # Your first name, displayed in the header
    first_name = "John"
    # Your last name, displayed in the header
    last_name = "Doe"
    # (Optional) display_name overrides the Latin "first (light) + last (bold)"
    # split with a single styled string. Use this for CJK profiles or any
    # profile where the split treatment feels wrong:
    # display_name = "王道尔"
    # Your mailing address, used as default sender-address in the cover letter
    # address = "123 Main St, San Francisco, CA 94102"

    # The order of entries below controls the display order of icons/links in the header.
    # Custom entries use a `custom-<descriptive-name>` key (e.g. custom-degree,
    # custom-cert). Descriptive names keep `custom-icons:` mapping in cv.typ readable.
    [personal.info]
        # Shown as clickable icon in header; auto-links to github.com/<value>
        github = "yunanwg"
        # Shown as phone icon in header; displayed as-is with a tel: link
        phone = "+33 6 12 34 56 78"
        # Shown as envelope icon in header; auto-links to mailto:<value>
        email = "john.doe@me.org"
        # Shown as clickable icon in header; auto-links to linkedin.com/in/<value>
        linkedin = "johndoe"
        # Shown as clickable icon in header; auto-links to gitlab.com/<value>
        gitlab = "yunanwg"
        # Shown as clickable globe icon in header; auto-links to https://<value>
        homepage = "johndoe.dev"
        # Shown as ORCID icon in header; auto-links to orcid.org/<value>
        orcid = "0000-0000-0000-0000"
        # researchgate = "John-Doe"  # Shown as a clickable ResearchGate icon in header
        # Shown as map-marker icon in header; displayed as plain text (no link)
        location = "San Francisco, CA"
        # extraInfo = "Available for remote work"  # Shown as extra text with an info icon in header
        # Insert a line break in the header info, splitting icons across two lines
        #linebreak = ""

        # Custom info with awesome icon
        [personal.info.custom-degree]
            awesomeIcon = "graduation-cap" # See https://typst.app/universe/package/fontawesome/
            # Display text shown next to the icon in the header
            text = "PhD in Data Science"
            # URL the icon/text links to; omit for non-clickable entries
            link = "https://www.example.com"

        # Custom info with image icon
        # To use a custom image icon, pass it via custom-icons in cv.typ:
        #   custom-icons: ("custom-cert": image("assets/my-icon.png"))
        [personal.info.custom-cert]
            awesomeIcon = "certificate"
            text = "AWS Certified"
            link = "https://aws.amazon.com/certification/"

Schema

A strict JSON Schema is included in every initialized starter at template/metadata.toml.schema.json. Each profile uses a local #:schema ../metadata.toml.schema.json directive, so supported editors (Helix, Neovim with Taplo, or VS Code with Even Better TOML) provide validation and autocomplete without depending on the repository's main branch or network access.

Core package-owned namespaces are closed: unknown keys and invalid value types are reported by the editor. Put data used only by your own modules under the open top-level [custom] namespace. At compile time, cv() and letter() additionally guard v3-removed fields with migration errors (see the Migration Guide); Typst itself does not apply JSON Schema while compiling.