Open-source project
ptsouchlos/modern-cv avatar
ptsouchlos/modern-cv

modern-cv: an Awesome-CV resume template rewritten for Typst

A modern resume template written in Typst, inspired by Awesome-CV

633 stars132 forksTypstNOASSERTION

At a glance

What is it?
modern-cv is a Typst package that ports the Awesome-CV LaTeX resume template, with a matching cover letter, multiple sections and multiple languages. It is published on the Typst Universe, so a resume compiles with one import line and no LaTeX toolchain.
Who is it for?
modern-cv suits a person who liked the layout of Awesome-CV and wants a PDF without installing a LaTeX distribution, because Typst compiles it in one command and the package arrives from the Typst Universe by version. It does not suit a project that needs to restyle the layout from scratch, since the design decisions of the original LaTeX template are carried over rather than exposed as a theming system.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 52 days ago.
What is it written in?
Mainly Typst, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The design of Awesome-CV came with the port

modern-cv is a port of the Awesome-CV LaTeX resume template in Typst, and that one sentence tells you both what the project is and where its limits lie.

Awesome-CV is a well known LaTeX template with a distinctive look: a coloured rule beside each section heading, a two column header block with name and contact details on one side and a profile picture on the other, and a section order that many technical CVs follow. Porting it to Typst means reproducing that layout with Typst's primitives.

That cuts both ways, and it is worth being plain about it. A port carries the original design decisions across, including the ones a user might not want. The colour scheme, the fonts and the section structure are inherited rather than chosen afresh. The README's feature list mentions easy to use and customize with colors, profile picture and fonts, so the customisation happens through parameters rather than through a layout system that can be restructured.

The feature list also names support for multiple sections such as education, experience and skills, and support for multiple languages. Both of those point to a package used by people outside the anglophone academic path. The repository carries a lang.toml file at the root, which is the Typst package manifest for language metadata, and a template/ directory holding the document templates themselves.

The topic tags cover the ground: resume, cv, typst-cv, cover-letter and typst-template, with awesome-cv named as the origin. The primary language is Typst, the default branch is main, and the last push was on 2026-09-01 with the most recent release v0.10.0 tagged on 2026-04-20, described in the release list as a long overdue release.

A resume is one import line and one compile command

The usage section of the README is short enough to copy and adapt, which is the point of the whole project.

typst
#import "@preview/modern-cv:0.10.0": *

The import is by package and version, taken from the Typst Universe. A show rule then applies the resume function with an author tuple and a handful of parameters.

The author tuple is the interesting part. It is a single structure holding firstname, lastname, email, phone, github, linkedin, telegram, address and a list of positions, so the name and the job titles live in one place rather than being scattered across the document. The profile picture is a parameter, and the paper size is a parameter too, with us-letter as the value in the README snippet.

The body of the document is then ordinary Typst markup with a helper for each kind of entry. A section heading is a level one heading, so the styling comes from the show rule rather than from markup. A resume-entry takes a title, a location, a date and a description, and a resume-item takes a list body of bullet points.

Then compiling is one command.

bash
typst compile resume.typ

There is no LaTeX distribution to install, no package manager to configure and no bibliography pass. The comparison with Awesome-CV is not only about the output; the toolchain collapses from a large TeX install to a single binary.

Fonts are the real dependency and they are not optional

The requirements section is where a user of this package is most likely to hit a wall, and it deserves reading in full.

You need the Roboto and Source Sans 3 fonts installed on the system or available somewhere. If the typst web app is used, no further action is necessary, because the web app has the fonts. Otherwise they have to be installed, and the README links Roboto from the Google Fonts specimen pages and Source Sans 3 from the Adobe Fonts repository.

Then there is the icon problem. The package also uses FontAwesome icons via the fontawesome package. You will need to install the fontawesome fonts on the system or configure the typst web app to use them, and the download link is given.

The alternative offered is the scripts in the scripts/ folder of the project, which install all the needed fonts. The README is careful about the limits of that path: those fonts have been tested on Linux but may also work on macOS, and the mileage may vary.

For the web app, the instruction is to add a fonts folder to the project and upload the otf files from the fontawesome download into it. The README also points at typst fonts --help for configuring fonts for typst that are not installed on the system, which is the mechanism for telling Typst where a font directory sits.

So the dependency chain for icons is: a Typst package that depends on the fontawesome package, which in turn expects the FontAwesome font files to be present in the font path. That is two steps beyond installing a compiler, and it is the difference between a package that works in a browser and one that needs a little setup on a workstation.

The development toolchain has the same shape. The tools used are typst, typst-test for running tests, just for simplifying command running, and oxipng for compressing thumbnails used in the README. Four tools, one of which is a test runner for Typst documents specifically, which tells you the project treats the rendered output as something to assert on.

Local development swaps the package source and the version number

Working on the package itself means pointing Typst at a local copy instead of the published one, and the README describes the exact switch.

With typst installed you can make changes to lib.typ and then just install or just install-preview to install the package locally. The import statement then changes to the local package.

typst
#import "@local/modern-cv:0.10.0": *

The @local scope tells Typst to look in the local package directory rather than the Universe. The version number stays in the import, and if just install-preview is used you only need to update the version number to match typst.toml. The note explains why that works: the script parses the typst.toml to determine the version number and the folder the local files are installed to.

So the local workflow has two artefacts that have to agree, the package manifest and the version in the import line. The script reads the manifest so the folder does not have to be hardcoded, but the import string still has to match.

Formatting is handled by typstyle, with just format covering all the *.typ files in the project, and the README is explicit that typstyle has to be installed before running the script.

The repository layout supports that workflow. There is a lib.typ at the root, which is the library the templates import, a template/ directory for the document templates, a tests/ directory, a Justfile at the root, a mise.toml for tool version management, and a .devcontainer/ directory for a reproducible development environment. The .typstignore file and lang.toml handle the package metadata.

The documentation is generated from the source. Documentation for this package is published with each commit, and the README points at the attached PDF on each GitHub Action run, so the reference read corresponds to a specific commit rather than to the newest release. The test CI badge points at a tests.yml workflow.

Where modern-cv is the wrong tool

The first wrong-tool case is a layout that has to be designed from scratch. modern-cv reproduces Awesome-CV. A different structure, a different column arrangement or a different section order means editing a Typst package rather than writing one, and the inherited design decisions are in the way rather than helping. Typst itself is a good typesetting system, and a package written from scratch would be a different and not unreasonable project.

The second case is a document that has to be compiled by somebody else's LaTeX pipeline. If the organisation's CV workflow is LaTeX-based, or if a form or an editor requires LaTeX source, a Typst package is not a drop-in replacement even if the output looks the same.

The third case is a system where installing fonts is not possible. The package needs Roboto, Source Sans 3 and the FontAwesome font files. In a locked-down environment, on a CI runner without network font access, or in a container image that cannot carry font licences, the compile fails with a missing font error rather than producing a slightly wrong document. The web app avoids this because the fonts are already there, and that is the deployment path to prefer when the machine cannot be controlled.

The fourth case is a cover letter that has to be reused across versions. The repository carries a cover letter package alongside the resume, and the preview table in the README shows two resume variants and two cover letter variants, so there is more than one document to keep in step. Two packages means two sets of customisation, and changing the author tuple or the header styling in one of them has to be mirrored in the other.

On licensing there is a discrepancy worth resolving before anything ships. The README states that the project is licensed under the MIT license and points at the LICENSE file, while the GitHub licence field for the repository shows Other, a custom licence that cannot be classified. The README is the more specific source, but a compliance check that reads only the GitHub metadata will flag it, and the answer sits in the LICENSE file rather than in either of these.

The other maintenance point is the release cadence. v0.10.0 was tagged on 2026-04-20 and described as a long overdue release, with v0.9.0 and a v0.9.0 patch in September 2025. The last push was on 2026-09-01. The import line in a finished resume pins a version, so when the package is updated the version string in the document does not change, and a fix will not reach anyone until the import is edited.

Editorial conclusion

modern-cv suits a person who liked the layout of Awesome-CV and wants a PDF without installing a LaTeX distribution, because Typst compiles it in one command and the package arrives from the Typst Universe by version. It does not suit a project that needs to restyle the layout from scratch, since the design decisions of the original LaTeX template are carried over rather than exposed as a theming system. Before adopting, install Roboto and Source Sans 3 plus the FontAwesome fonts, since the package will not compile without them, and settle the licensing discrepancy between the README, which says MIT, and the GitHub licence field, which shows a custom licence that cannot be classified.

Frequently asked questions

What is modern-cv?

modern-cv is a Typst package that is a port of the Awesome-CV LaTeX resume template. It provides a resume and a cover letter package with support for multiple sections and multiple languages, and it is published on the Typst Universe.

How do I use modern-cv to write a resume?

Import the package by version with #import "@preview/modern-cv:0.10.0": *, apply the resume function with the author details, and add sections as markup with resume-entry and resume-item. Then compile with typst compile resume.typ.

What fonts does modern-cv need?

The Roboto and Source Sans 3 fonts, plus the FontAwesome font files, since the package uses FontAwesome icons through the fontawesome package. The scripts in the scripts/ folder can install them, and that path has been tested mainly on Linux.

How do I develop modern-cv locally?

Make changes to lib.typ and run just install or just install-preview to install the package locally, then change the import to the local scope with #import "@local/modern-cv:0.10.0": *. The script parses typst.toml to determine the version and the destination folder, and just format runs typstyle over the .typ files.

What license is modern-cv released under?

The README states that the project is licensed under the MIT license with details in the LICENSE file, while the GitHub licence field shows a custom licence that cannot be classified. The most recent release is v0.10.0, tagged on 2026-04-20.

Official sources

  1. Issues
  2. Project website
  3. ptsouchlos/modern-cv on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ptsouchlos-modern-cv.svg)](https://hysenlabs.com/projects/ptsouchlos-modern-cv)

Was this useful?