Specification
Skill ID
rendercv/rendercv-skill/rendercv
Publisher
rendercv
Repository
rendercv-skill
Installs
0
Files
1
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

rendercv/rendercv-skill/rendercvInstalls these files
  • SKILL.md

What this skill tells the agent

Quick Start

Available themes: classic, harvard, engineeringresumes, engineeringclassic, sb2nov, moderncv Available 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

These are starting points — every aspect of the design and locale can be fully customized in the YAML file.

# Install RenderCV
uv tool install "rendercv[full]"

# Create a starter YAML file (you can specify theme and locale)
rendercv new "John Doe"
rendercv new "John Doe" --theme moderncv --locale german

# Render to PDF (also generates Typst, Markdown, HTML, PNG by default)
rendercv render John_Doe_CV.yaml

# 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):

FieldTypeDefaultNotes
date`str \int \null`nullFree-form: "2020-09", "Fall 2023", etc. Mutually exclusive with start_date/end_date.
start_date`str \int \null`nullStrict format: YYYY-MM-DD, YYYY-MM, or YYYY.
end_date`str \int \"present" \null`nullSame 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`nullBullet points.

9 entry types:

Entry TypeRequired FieldsOptional FieldsTypical Use
ExperienceEntrycompany, positionall shared fieldsJobs, positions
EducationEntryinstitution, areadegree + all shared fieldsDegrees, schools
PublicationEntrytitle, authorsdoi, url, journal, summary, datePapers, articles
NormalEntrynameall shared fieldsProjects, awards
OneLineEntrylabel, details—Skills, languages
BulletEntrybullet—Simple bullet points
NumberedEntrynumber—Numbered list items
ReversedNumberedEntryreversed_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)

Use this skill in a project

Open any RiverX project, search the Skills panel for rendercv/rendercv-skill/rendercv, and install it in one click.

Use this skill