Data-Driven CVs with 'Quarto' and 'Typst'
Overview
Provides tools for producing data-driven curriculum vitae documents from structured data stored in an Excel workbook. The core workflow reads CV content from a workbook, converts it into 'Typst' layout blocks, and renders a polished PDF via the 'Quarto' publishing system. Includes functions for reading and cleaning CV data, building 'Typst' section headings and entries, rendering CV sections from data frames, and scaffolding new CV projects with a standard folder structure and template workbook. Designed to separate content from layout: CV data lives in the spreadsheet, rendering configuration lives in 'Quarto', and transformation logic lives in small, reusable R functions. See the 'Typst' typesetting system at https://typst.app and the 'Quarto' publishing system at https://quarto.org. Inspired by the 'vitae' package https://CRAN.R-project.org/package=vitae and the 'Awesome CV' LaTeX template https://github.com/posquit0/Awesome-CV.
Breaking changes
read_cv_data()now requires theopenxlsx2package instead ofreadxl. Removereadxland addopenxlsx2to any explicit dependencies in your own projects that callread_cv_data()directly.create_cv()no longer falls back to a bundled placeholder image whenphoto = NULLin render mode. Omittingphotonow produces a single-column header layout with no image. Supply a path explicitly to restore the two-column layout with a profile photo.
New features
- **Resume variant.**
create_cv()andread_cv_data()gain avariantargument ("cv"or"resume"). Whenvariant = "resume", only rows whereinclude_in_resumeis checked in the workbook are included in the rendered output. Every section sheet now carries aninclude_in_resumecolumn for row-level control.
Show all changes in 0.3.0Hide the rest of the changes in 0.3.0
- **Font Awesome icons.**
create_cv()gains ause_iconsargument ("fontawesome"or"none"). When"fontawesome"(the default), contact fields in the CV header are rendered with Font Awesome icons via the Typst@preview/fontawesomepackage. Fields with no icon equivalent fall back to plain text with a warning. The new exported functioncv_contact_line()assembles the contact line and can be called directly in custom templates. - **Workbook-controlled theming.** A new
themesheet in the workbook controls fonts, colors, and page layout. Keys map directly to the Typst style block and the Quartoformat: typst:YAML block, both of which are now injected bycreate_cv()via sentinel substitution. If thethemesheet is absent, built-in defaults are used and individual missing keys are filled from defaults, so partial theme sheets are supported. - **
add_section().** New exported function that adds a new sheet to an existing curriculr workbook and registers it in thesectionscontrol sheet. The new sheet is pre-populated with the standard column spine includinginclude_in_resume. Thesectionsrow is appended or updated in place without touching the sheet's formatting. - **No-photo header layout.** When
photo = NULL,CV.qmdnow emits a single full-width centered header block instead of a two-column grid with an empty left column.
Improvements
read_cv_data()reads thethemesheet as a named character vector keyed by thekeycolumn, parallel to theprofilesheet. ReturnsNULLif the sheet is absent.read_cv_data()coerces all section columns to character after import, including numeric year columns and logical boolean columns, giving the rendering pipeline a uniform contract.read_cv_data()gains a.coerce_col()internal helper that normalizesNAstrings produced byas.character(NA)back toNA_character_.create_cv()injectsvariantanduse_iconsintoCV.qmdas Quarto params so the Quarto subprocess applies the same filtering and icon settings as the calling R session.- The
cv-data-template.xlsxtemplate workbook gains athemesheet with all twelve default theming keys and adescriptioncolumn for in-workbook documentation. Thereadmesheet is updated to document thethemesheet and to reflect thatinclude_in_resumeis now present on all section sheets. - Internal helpers
.cv_theme_defaults(),.resolve_theme(),.build_format_block(),.build_typst_theme_block(), and.fa_icon_map()are added to support theming and icon assembly.
Dependency changes
openxlsx2added toImports.readxlremoved fromImports.
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-07-03
- ERROR6 OK, 1 ERROR2026-05-14
Documentation
- Help pages
- 9 (1 internal)includes a package overview page
- Examples that run
- 0%4 only when donttest examples are enabled (R CMD check --as-cran)
- Exported functions with examples
- 50%
- Documented parameters
- 100%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- 1
- Median days to close, 50 most recently updated closed PRs
- 1
Stars over time
Forks over time
Releases over time
Issues over time
PRs over time
Commits over time
8 development-tooling and community-health practices detected across 5 families in the upstream repository
Checks run against github.com/erwinlares/curriculr on 2026-10-21.
The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel
GitHub Pages site last deployed 2026-08-31 · The repository has a site deploy workflow
pkgdown site last built 2026-08-31
Show all practicesHide 1 practice
Dependencies
Code & Tests
People & History
- 0.3.0Latest2026-05-13 · current release
- RR 4.6.0 released · 2026-04-24
Package metadata
- First published
- 2026-05-13
- Total releases
- 1 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.2.0
- Download size
- 4.3 MB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("curriculr")The package provides a citation file that builds its entry when R runs it. Run citation() to see it.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-24, which the citation names so these numbers can be found later. More on citing and the projects behind them.