An ATS-friendly, aesthetic CV/resume template for Typst.
Resume content is written as plain, machine-parseable text (no multi-column layout tricks), while still looking polished — rounded section bars, dotted rule separators, pill-style skill chips, and optional profile photo.
Examples
| Without profile image | With profile image |
|---|---|
![]() |
![]() |
Features
- ATS-friendly — single-column flow, standard section headings, skills collected from plain text.
- Aesthetic — accent color, muted rounded blocks, external-link icons (via octique).
- Automatic skill registry — tag skills inline as you write bullet points
with
#s(...), then render them all in one place with#skills(). Duplicates are deduplicated and reported as warnings (via uniwarn). - Two variants — with or without a profile image (
main.typ/with-image.typ). - Themeable — name, title, contact info, colors, and font size are all
passed to a single
generate-blocks(...)factory.
Quick start
Note
By default, this template uses the
Space Groteskfont. If you don’t have it installed or don’t want to use it, you can change the font in thegenerate-blocksparam
- Start from the template
typst init @preview/atsthetic-cv cv && cd cv
- Edit the following files in the
commondirectory:blocks.typ- customize the parameter of thegenerate-blocksfunctioncontent.typ- customize the content of your cvpublications.yml(optional) - if you want to include your publications
- (Optional) If you want to use a profile picture in your cv, change the image
in
with-image.typ. Do your own research on whether or not this is a good idea. - Compile either
main.typorwith-image.typ
Skills
By default the template uses the skill helpers (i.e., the s and skills
function) to showcase your skills.
The s function is an alias for the internal skill function, and helps you
register your skills to be showcased later using the skills function.
These functions helps you aggregate your skills, and avoid duplicate skills to keep your cv short. A warning will be shown on compile time if a duplicate is found.
You can also register skill(s) using the s function without showing it inline
by setting the hide param to true.

