rendercv

>-

INSTALLATION
npx skills add https://github.com/rendercv/rendercv-skill --skill rendercv
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$28

Watch mode: auto-re-render whenever the YAML file changes

rendercv render John_Doe_CV.yaml --watch

Render only PNG (useful for previewing or checking page count)

rendercv render John_Doe_CV.yaml --dont-generate-pdf --dont-generate-html --dont-generate-markdown

Override fields from the CLI without editing the YAML

rendercv render cv.yaml --cv.name "Jane Doe" --design.theme "moderncv"

## YAML Structure

A RenderCV input has four sections. Only `cv` is required — the others have sensible defaults.

cv: # Your content: name, contact info, and all sections

design: # Visual styling: theme, colors, fonts, margins, spacing, layouts

locale: # Language: month names, phrases, translations

settings: # Behavior: output paths, bold keywords, current date


**Single file vs. separate files:** All four sections can live in one YAML file, or each can be a separate file. Separate files are useful for reusing the same design/locale across multiple CVs:

Single self-contained file (all sections in one file)

rendercv render John_Doe_CV.yaml

Separate files: CV content + design + locale loaded independently

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


When using separate files, each file contains only its section (e.g., `design.yaml` has `design:` as the top-level key). CLI-loaded files override values in the main YAML file.

The YAML maps directly to Pydantic models. The complete type-safe schema is provided below so you can understand every field, its type, and its default value.

## Pydantic Schema

The YAML input is validated against these Pydantic models.

### Top-Level Model

class RenderCVModel(BaseModelWithoutExtraKeys):

cv: Cv = pydantic.Field(default_factory=Cv, title='CV', description='The content of the CV.')

design: Design = pydantic.Field(default_factory=ClassicTheme, title='Design')

locale: Locale = pydantic.Field(default_factory=EnglishLocale, title='Locale Catalog')

settings: Settings = pydantic.Field(default_factory=Settings, title='RenderCV Settings', description='The settings of the RenderCV.')


### CV Content ( cv )

The `cv.sections` field is a dictionary where keys are section titles (any string you want) and values are lists of entries. Each section contains entries of the same type.

class Cv(BaseModelWithoutExtraKeys):

name: str | None = pydantic.Field(default=None, examples=['John Doe', 'Jane Smith'])

headline: str | None = pydantic.Field(default=None, examples=['Software Engineer', 'Data Scientist', 'Product Manager'])

location: str | None = pydantic.Field(default=None, examples=['New York, NY', 'London, UK', 'Istanbul, Türkiye'])

email: pydantic.EmailStr | list[pydantic.EmailStr] | None = pydantic.Field(default=None, examples=['john.doe@example.com', ['john.doe.1@example.com', 'john.doe.2@example.com']])

photo: ExistingPathRelativeToInput | pydantic.HttpUrl | None = pydantic.Field(default=None, union_mode='left_to_right', examples=['photo.jpg', 'images/profile.png', 'https://example.com/photo.jpg'])

phone: pydantic_phone_numbers.PhoneNumber | list[pydantic_phone_numbers.PhoneNumber] | None = pydantic.Field(default=None, examples=['+1-234-567-8900', ['+1-234-567-8900', '+44 20 1234 5678']])

website: pydantic.HttpUrl | list[pydantic.HttpUrl] | None = pydantic.Field(default=None, examples=['https://johndoe.com', ['https://johndoe.com', 'https://www.janesmith.dev']])

social_networks: list[SocialNetwork] | None = pydantic.Field(default=None)

custom_connections: list[CustomConnection] | None = pydantic.Field(default=None, examples=[[{'placeholder': 'Book a call', 'url': 'https://cal.com/johndoe', 'fontawesome_icon': 'calendar-days'}]])

sections: dict[str, Section] | None = pydantic.Field(default=None, examples=[{'Experience': '...', 'Education': '...', 'Projects': '...', 'Skills': '...'}])

type SocialNetworkName = Literal['LinkedIn', 'GitHub', 'GitLab', 'IMDB', 'Instagram', 'ORCID', 'Mastodon', 'StackOverflow', 'ResearchGate', 'YouTube', 'Google Scholar', 'Telegram', 'WhatsApp', 'Leetcode', 'X', 'Bluesky', 'Reddit']

available_social_networks = get_args(SocialNetworkName.__value__)

class SocialNetwork(BaseModelWithoutExtraKeys):

network: SocialNetworkName = pydantic.Field()

username: str = pydantic.Field(examples=['john_doe', '@johndoe@mastodon.social', '12345/john-doe'])

class CustomConnection(BaseModelWithoutExtraKeys):

fontawesome_icon: str

placeholder: str

url: pydantic.HttpUrl | None


### Entry Types

`cv.sections` is a dictionary: keys are section titles (any string), values are lists of entries. Each section must use a **single** entry type — you cannot mix different entry types within the same section. The entry type is auto-detected from the fields present in each entry.

**Shared fields** — these are available on entry types that support dates and complex fields (ExperienceEntry, EducationEntry, NormalEntry, PublicationEntry):

Field
Type
Default
Notes

`date`
`str | int | null`
`null`
Free-form: `"2020-09"`, `"Fall 2023"`, etc. Mutually exclusive with `start_date`/`end_date`.

`start_date`
`str | int | null`
`null`
Strict format: YYYY-MM-DD, YYYY-MM, or YYYY.

`end_date`
`str | int | "present" | null`
`null`
Same formats as `start_date`, or `"present"`. Omitting defaults to `"present"` when `start_date` is set.

`location`
`str | null`
`null`

`summary`
`str | null`
`null`

`highlights`
`list[str] | null`
`null`
Bullet points.

**9 entry types:**

Entry Type
Required Fields
Optional Fields
Typical Use

**ExperienceEntry**
`company`, `position`
all shared fields
Jobs, positions

**EducationEntry**
`institution`, `area`
`degree` + all shared fields
Degrees, schools

**PublicationEntry**
`title`, `authors`
`doi`, `url`, `journal`, `summary`, `date`
Papers, articles

**NormalEntry**
`name`
all shared fields
Projects, awards

**OneLineEntry**
`label`, `details`
—
Skills, languages

**BulletEntry**
`bullet`
—
Simple bullet points

**NumberedEntry**
`number`
—
Numbered list items

**ReversedNumberedEntry**
`reversed_number`
—
Reverse-numbered items (5, 4, 3...)

**TextEntry**
(plain string)
—
Free-form paragraphs

Example:

cv:

sections:

experience: # list of ExperienceEntry (detected by company + position)

- company: Google

position: Engineer

start_date: 2020-01

highlights:

- Did something impactful

skills: # list of OneLineEntry (detected by label + details)

- label: Languages

details: Python, C++

about_me: # list of TextEntry (plain strings)

- This is a free-form paragraph about me.


Entries also accept arbitrary extra keys (silently ignored during rendering). A typo in a field name will NOT cause an error.

### Design ( design )

All built-in themes share the same structure — they only differ in default values. See the sample designs below for every available field and its default. Set `design.theme` to pick a theme, then override any field.

### Locale ( locale )

Built-in locales: `english`, `arabic`, `danish`, `dutch`, `french`, `german`, `hebrew`, `hindi`, `hungarian`, `indonesian`, `italian`, `japanese`, `korean`, `mandarin_chinese`, `norwegian_bokmål`, `norwegian_nynorsk`, `persian`, `portuguese`, `russian`, `spanish`, `turkish`, `vietnamese`

Set `locale.language` to a built-in locale name to use it. Override any field to customize translations. Set `language` to any string and provide all translations for a fully custom locale.

### Settings ( settings )

Key fields: `bold_keywords` (list of strings to auto-bold), `current_date` (override today's date), `render_command.*` (output paths, generation flags).

## Important Patterns

### YAML quoting

**ALWAYS quote string values that contain a colon (`:`).** This is the most common cause of invalid YAML. Highlights, titles, summaries, and any free-form text often contain colons:

WRONG — colon breaks YAML parsing:

  • title: Catalytic Mechanisms: A New Approach

highlights:

- Relevant coursework: Distributed Systems, ML

RIGHT — wrap in double quotes:

  • title: "Catalytic Mechanisms: A New Approach"

highlights:

- "Relevant coursework: Distributed Systems, ML"


Rule: if a string value contains `:`, it MUST be quoted. When in doubt, quote it.

### Bullet characters

The `design.highlights.bullet` field only accepts these exact characters: `●`, `•`, `◦`, `-`, `◆`, `★`, `■`, `—`, `○`. Do not use en-dash (`–`), `>`, `*`, or any other character. When in doubt, omit `bullet` to use the theme default.

### Phone numbers

Phone numbers MUST be in international format with country code (E.164). Never invent a phone number — only include one if the user provides it.

WRONG:

phone: "(555) 123-4567"

phone: "555-123-4567"

RIGHT:

phone: "+15551234567"


If the user provides a local number without country code, ask which country, or omit the phone field.

### Text formatting

All text fields support inline Markdown: `**bold**`, `*italic*`, `[link text](url)`. Block-level Markdown (headers, lists, blockquotes, code blocks) is not supported. Raw Typst commands and math (`$$f(x)$$`) also pass through.

### Date handling

- `date` and `start_date`/`end_date` are mutually exclusive. If `date` is provided, `start_date` and `end_date` are ignored.

- If only `start_date` is given, `end_date` defaults to `"present"`.

- `start_date`/`end_date` require strict formats: YYYY-MM-DD, YYYY-MM, or YYYY.

- `date` is flexible: accepts any string ("Fall 2023") in addition to date formats.

### Section titles

- `snake_case` keys auto-capitalize: `work_experience` → "Work Experience"

- Keys with spaces or uppercase are used as-is.

### Publication authors

Use `*Name*` (single asterisks, italic) to highlight the CV owner in author lists.

### Nested highlights (sub-bullets)

highlights:

- Main bullet point

- Sub-bullet 1

- Sub-bullet 2


## CLI Reference

### rendercv new "Full Name"

Generate a starter YAML file.

Option
Short
What it does

`--theme THEME`

Theme to use (default: `classic`)

`--locale LOCALE`

Locale to use (default: `english`)

`--create-typst-templates`

Also create editable Typst template files for full design control

### rendercv render

Generate PDF, Typst, Markdown, HTML, and PNG from a YAML file.

Option
Short
What it does

`--watch`
`-w`
Re-render automatically when the YAML file changes

`--quiet`
`-q`
Suppress all output messages

`--design FILE`
`-d`
Load design section from a separate YAML file

`--locale-catalog FILE`
`-lc`
Load locale section from a separate YAML file

`--settings FILE`
`-s`
Load settings section from a separate YAML file

`--output-folder DIR`
`-o`
Custom output directory

Per-format controls: `--{format}-path PATH` sets custom output path, `--dont-generate-{format}` skips generation. Formats: `pdf`, `typst`, `markdown`, `html`, `png`.

**Override any YAML field from the CLI** using dot notation (overrides without editing the file):

rendercv render CV.yaml --cv.name "Jane Doe" --design.theme "moderncv"

rendercv render CV.yaml --cv.sections.education.0.institution "MIT"


### rendercv create-theme "theme-name"

Scaffold a custom theme directory with editable Typst templates for complete design control.

## JSON Schema

For YAML editor autocompletion and validation:

yaml-language-server: $schema=https://raw.githubusercontent.com/rendercv/rendercv/refs/tags/v2.8/schema.json


## Complete Example

### Sample CV

cv:

name: John Doe

headline:

location: San Francisco, CA

email: john.doe@email.com

photo:

phone:

website: https://rendercv.com/

social_networks:

- network: LinkedIn

username: rendercv

- network: GitHub

username: rendercv

custom_connections:

sections:

Welcome to RenderCV:

- RenderCV reads a CV written in a YAML file, and generates a PDF with

professional typography.

- Each section title is arbitrary.

education:

- institution: Princeton University

area: Computer Science

degree: PhD

date:

start_date: 2018-09

end_date: 2023-05

location: Princeton, NJ

summary:

highlights:

- 'Thesis: Efficient Neural Architecture Search for Resource-Constrained Deployment'

- 'Advisor: Prof. Sanjeev Arora'

- NSF Graduate Research Fellowship, Siebel Scholar (Class of 2022)

- institution: Boğaziçi University

area: Computer Engineering

degree: BS

date:

start_date: 2014-09

end_date: 2018-06

location: Istanbul, Türkiye

summary:

highlights:

- 'GPA: 3.97/4.00, Valedictorian'

- Fulbright Scholarship recipient for Graduate Studies

experience:

- company: Nexus AI

position: Co-Founder & CTO

date:

start_date: 2023-06

end_date: present

location: San Francisco, CA

summary:

highlights:

- Built foundation model infrastructure serving 2M+ monthly API requests

with 99.97% uptime

- Raised $18M Series A led by Sequoia Capital, with participation from

a16z and Founders Fund

- Scaled engineering team from 3 to 28 across ML research, platform, and

applied AI divisions

- Developed proprietary inference optimization reducing latency by 73%

compared to baseline

- company: NVIDIA Research

position: Research Intern

date:

start_date: 2022-05

end_date: 2022-08

location: Santa Clara, CA

summary:

highlights:

- Designed sparse attention mechanism reducing transformer memory

footprint by 4.2x

- Co-authored paper accepted at NeurIPS 2022 (spotlight presentation, top

5% of submissions)

projects:

- name: 'FlashInfer'

date:

start_date: 2023-01

end_date: present

location:

summary: Open-source library for high-performance LLM inference kernels

highlights:

- Achieved 2.8x speedup over baseline attention implementations on A100

GPUs

- Adopted by 3 major AI labs, 8,500+ GitHub stars, 200+ contributors

- name: 'NeuralPrune'

date: '2021'

start_date:

end_date:

location:

summary: Automated neural network pruning toolkit with differentiable

masks

highlights:

- Reduced model size by 90% with less than 1% accuracy degradation on

ImageNet

- Featured in PyTorch ecosystem tools, 4,200+ GitHub stars

publications:

- title: 'Sparse Mixture-of-Experts at Scale: Efficient Routing for Trillion-Parameter

Models'

authors:

- 'John Doe'

- Sarah Williams

- David Park

summary:

doi: 10.1234/neurips.2023.1234

url:

journal: NeurIPS 2023

date: 2023-07

- title: Neural Architecture Search via Differentiable Pruning

authors:

- James Liu

- 'John Doe'

summary:

doi: 10.1234/neurips.2022.5678

url:

journal: NeurIPS 2022, Spotlight

date: 2022-12

selected_honors:

- bullet: MIT Technology Review 35 Under 35 Innovators (2024)

- bullet: Forbes 30 Under 30 in Enterprise Technology (2024)

skills:

- label: Languages

details: Python, C++, CUDA, Rust, Julia

- label: ML Frameworks

details: PyTorch, JAX, TensorFlow, Triton, ONNX

patents:

- number: Adaptive Quantization for Neural Network Inference on Edge Devices

(US Patent 11,234,567)

- number: Dynamic Sparsity Patterns for Efficient Transformer Attention (US

Patent 11,345,678)

invited_talks:

- reversed_number: Scaling Laws for Efficient Inference — Stanford HAI

Symposium (2024)

- reversed_number: Building AI Infrastructure for the Next Decade —

TechCrunch Disrupt (2024)


### Sample Design (classic — complete reference)

This shows every available design field with its default value. All themes share the same structure.

design:

theme: classic

page:

size: us-letter

top_margin: 0.7in

bottom_margin: 0.7in

left_margin: 0.7in

right_margin: 0.7in

show_footer: true

show_top_note: true

colors:

body: rgb(0, 0, 0)

name: rgb(0, 79, 144)

headline: rgb(0, 79, 144)

connections: rgb(0, 79, 144)

section_titles: rgb(0, 79, 144)

links: rgb(0, 79, 144)

footer: rgb(128, 128, 128)

top_note: rgb(128, 128, 128)

typography:

line_spacing: 0.6em

alignment: justified

date_and_location_column_alignment: right

font_family:

body: Source Sans 3

name: Source Sans 3

headline: Source Sans 3

connections: Source Sans 3

section_titles: Source Sans 3

font_size:

body: 10pt

name: 30pt

headline: 10pt

connections: 10pt

section_titles: 1.4em

small_caps:

name: false

headline: false

connections: false

section_titles: false

bold:

name: true

headline: false

connections: false

section_titles: true

links:

underline: false

show_external_link_icon: false

header:

alignment: center

photo_width: 3.5cm

photo_position: left

photo_space_left: 0.4cm

photo_space_right: 0.4cm

space_below_name: 0.7cm

space_below_headline: 0.7cm

space_below_connections: 0.7cm

connections:

phone_number_format: national

hyperlink: true

show_icons: true

display_urls_instead_of_usernames: false

separator: ''

space_between_connections: 0.5cm

section_titles:

type: with_partial_line

line_thickness: 0.5pt

space_above: 0.5cm

space_below: 0.3cm

sections:

allow_page_break: true

space_between_regular_entries: 1.2em

space_between_text_based_entries: 0.3em

show_time_spans_in:

- experience

entries:

date_and_location_width: 4.15cm

side_space: 0.2cm

space_between_columns: 0.1cm

allow_page_break: false

short_second_row: true

degree_width: 1cm

summary:

space_above: 0cm

space_left: 0cm

highlights:

bullet: •

nested_bullet: •

space_left: 0.15cm

space_above: 0cm

space_between_items: 0cm

space_between_bullet_and_text: 0.5em

templates:

footer: 'NAME -- PAGE_NUMBER/TOTAL_PAGES'

top_note: 'LAST_UPDATED CURRENT_DATE'

single_date: MONTH_ABBREVIATION YEAR

date_range: START_DATE – END_DATE

time_span: HOW_MANY_YEARS YEARS HOW_MANY_MONTHS MONTHS

one_line_entry:

main_column: 'LABEL: DETAILS'

education_entry:

main_column: |-

INSTITUTION, AREA

SUMMARY

HIGHLIGHTS

degree_column: 'DEGREE'

date_and_location_column: |-

LOCATION

DATE

normal_entry:

main_column: |-

NAME

SUMMARY

HIGHLIGHTS

date_and_location_column: |-

LOCATION

DATE

experience_entry:

main_column: |-

COMPANY, POSITION

SUMMARY

HIGHLIGHTS

date_and_location_column: |-

LOCATION

DATE

publication_entry:

main_column: |-

TITLE

SUMMARY

AUTHORS

URL (JOURNAL)

date_and_location_column: DATE


### Other Theme Overrides

Other themes only override specific fields from the classic defaults above. To use a theme, set `design.theme` and optionally override any field. Each theme also customizes `design.templates` (entry layout patterns) — see the classic sample above for the full template structure. The override YAMLs below omit templates for brevity.

#### harvard

yaml-language-server: $schema=../../../../../../schema.json

design:

theme: harvard

page:

top_margin: 0.5in

bottom_margin: 0.5in

left_margin: 0.5in

right_margin: 0.5in

show_top_note: false

colors:

name: rgb(0,0,0)

headline: rgb(0,0,0)

connections: rgb(0,0,0)

section_titles: rgb(0,0,0)

links: rgb(0,0,0)

typography:

font_family:

body: XCharter

name: XCharter

headline: XCharter

connections: XCharter

section_titles: XCharter

font_size:

name: 25pt

connections: 9pt

section_titles: 1.3em

header:

space_below_name: 0.5cm

space_below_headline: 0.5cm

space_below_connections: 0.5cm

connections:

show_icons: false

separator: •

space_between_connections: 0.4cm

section_titles:

type: centered_with_centered_partial_line

space_below: 0.2cm

sections:

space_between_regular_entries: 1em

show_time_spans_in: []

entries:

short_second_row: false


#### engineeringresumes

yaml-language-server: $schema=../../../../../../schema.json

design:

theme: engineeringresumes

page:

show_footer: false

typography:

font_family:

body: XCharter

name: XCharter

headline: XCharter

connections: XCharter

section_titles: XCharter

font_size:

name: 25pt

section_titles: 1.2em

bold:

name: false

header:

connections:

separator: '|'

show_icons: false

display_urls_instead_of_usernames: true

colors:

name: rgb(0,0,0)

connections: rgb(0,0,0)

headline: rgb(0,0,0)

section_titles: rgb(0,0,0)

links: rgb(0,0,0)

links:

underline: true

show_external_link_icon: false

section_titles:

type: with_full_line

space_above: 0.5cm

space_below: 0.3cm

sections:

space_between_regular_entries: 0.42cm

space_between_text_based_entries: 0.15cm

show_time_spans_in: []

entries:

short_second_row: false

summary:

space_above: 0.08cm

side_space: 0cm

highlights:

bullet: ●

nested_bullet: ●

space_left: 0cm

space_above: 0.08cm

space_between_items: 0.08cm

space_between_bullet_and_text: 0.3em


#### engineeringclassic

yaml-language-server: $schema=../../../../../../schema.json

design:

theme: engineeringclassic

typography:

font_family:

body: Raleway

name: Raleway

headline: Raleway

connections: Raleway

section_titles: Raleway

bold:

name: false

section_titles: false

header:

alignment: left

links:

show_external_link_icon: false

section_titles:

type: with_full_line

sections:

show_time_spans_in: []

entries:

short_second_row: false

summary:

space_above: 0.12cm

highlights:

space_left: 0cm

space_above: 0.12cm

space_between_items: 0.12cm


#### sb2nov

yaml-language-server: $schema=../../../../../../schema.json

design:

theme: sb2nov

typography:

font_family:

body: New Computer Modern

name: New Computer Modern

headline: New Computer Modern

connections: New Computer Modern

section_titles: New Computer Modern

colors:

name: rgb(0,0,0)

connections: rgb(0,0,0)

section_titles: rgb(0,0,0)

headline: rgb(0,0,0)

links: rgb(0,0,0)

links:

underline: true

show_external_link_icon: false

section_titles:

type: with_full_line

sections:

show_time_spans_in: []

header:

connections:

hyperlink: true

show_icons: false

display_urls_instead_of_usernames: true

separator: •

entries:

short_second_row: false

highlights:

bullet: ◦

nested_bullet: ◦


#### moderncv

yaml-language-server: $schema=../../../../../../schema.json

design:

theme: moderncv

typography:

line_spacing: 0.6em

font_family:

body: Fontin

name: Fontin

headline: Fontin

connections: Fontin

section_titles: Fontin

font_size:

name: 25pt

section_titles: 1.4em

bold:

name: false

section_titles: false

header:

alignment: left

photo_width: 4.15cm

photo_space_left: 0cm

photo_space_right: 0.3cm

links:

underline: true

show_external_link_icon: false

section_titles:

type: moderncv

space_above: 0.55cm

space_below: 0.3cm

line_thickness: 0.15cm

sections:

show_time_spans_in: []

entries:

short_second_row: false

side_space: 0cm

space_between_columns: 0.3cm

summary:

space_above: 0.1cm

highlights:

space_left: 0cm

space_above: 0.15cm

space_between_items: 0.1cm

space_between_bullet_and_text: 0.3em

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card