Typst CV / Resume
Build a clean, modern CV in Typst. Plain-text source. Git-versionable. Compiles to PDF in milliseconds. Better typography defaults than Word.
A minimal one-page Typst CV
#set page(margin: 0.75in, paper: "us-letter")
#set text(font: "Inter", size: 10pt)
#set par(leading: 0.6em)
// Section heading style
#show heading.where(level: 1): it => {
v(0.5em)
text(weight: "bold", size: 13pt, fill: rgb("#1A4480"), it.body)
v(0.2em)
line(length: 100%, stroke: 0.5pt + rgb("#1A4480"))
v(0.3em)
}
// Header — name and contact
#align(center)[
#text(size: 22pt, weight: "bold")[Your Name]
#text(size: 9pt)[
Email · Phone · #link("https://github.com/you")[GitHub] · #link("https://linkedin.com/in/you")[LinkedIn]
]
]
= Education
*PhD in Computer Science* #h(1fr) 2020–2025 \
University Name, City \
_Dissertation: "Title of dissertation"_
*BS in Mathematics* #h(1fr) 2016–2020 \
University Name, City
= Experience
*Research Scientist* #h(1fr) 2024–present \
Company Name \
- Bullet point on achievement
- Another achievement
- Quantified result
= Publications
1. Author, A., *Your Name*, Author, B. (2024). Paper title. _Conference Name_.
2. *Your Name*, Author, A. (2023). Another paper. _Journal Name_.
= Skills
*Programming:* Python, Rust, TypeScript \
*Tools:* Typst, LaTeX, Git, DockerTwo-column layout (sidebar + main)
#grid(
columns: (1fr, 2fr),
column-gutter: 1em,
// Left sidebar
[
= Contact
Email \
Phone \
LinkedIn
= Skills
Python \
Rust \
TypeScript
],
// Main column
[
= Experience
*Senior Engineer* — Company \
2024–present
- Description
= Education
PhD — University, 2020
],
)Use a community template
#import "@preview/modern-cv:0.2.0": *
#show: cv.with(
author: "Your Name",
email: "you@email.com",
phone: "+1-555-0100",
github: "yourhandle",
linkedin: "yourhandle",
)
= Education
... (use the template's structured macros)Common patterns
- Right-aligned dates: use
#h(1fr)between job title and date. - Section divider line:
#line(length: 100%, stroke: 0.5pt)after a heading. - One-page enforcement:
#set page(height: auto)+ careful content; or use a template that enforces single page. - Print-ready: default Typst output is print-ready PDF with embedded fonts.
TypeTeX includes academic and modern CV templates ready to use. Open one, replace the placeholder text, and download a PDF in 30 seconds. Free.
Frequently Asked Questions
Three reasons: (1) Typst's clean syntax makes layout iteration fast — change a font or spacing once and it propagates; (2) compiles in milliseconds so you can tweak and preview rapidly; (3) version-controllable plain text — your CV history lives in git, not Word .docx files. Compared to LaTeX moderncv: simpler syntax, no package conflicts, better default typography.
Set up document defaults: #set page(margin: 0.75in), #set text(font: "Inter", size: 10pt). Define a section header style with #show heading. Then write each section (Education, Experience, Publications) using = headings. The whole CV fits in 100-150 lines of Typst.
Yes. The Typst Universe (typst.app/universe) hosts community CV templates: 'modern-cv', 'simple-cv', 'didactic-cv', and academic-specific variants. Import with #import "@preview/modern-cv:0.2.0": *. TypeTeX includes several CV templates pre-loaded.
#set page(columns: 2) for full document. For partial two-column (sidebar with contact, main with experience): use #grid(columns: (1fr, 2fr), [sidebar content], [main content]). Or place a contact box at the top with #place(top + right). Most CV templates use the grid approach for the sidebar.
Either inline as a list, or import from your BibTeX file. Inline: a list of formatted entries with #set list(marker: none) so it doesn't show bullets. From BibTeX: #bibliography("my-pubs.bib", style: "apa", title: none). The 'title: none' suppresses the auto-generated 'Bibliography' heading.
Use a sans-serif font like Inter, Helvetica, or Lato. Tighter line spacing (#set par(leading: 0.5em)). Bold for job titles, regular for company names, italic for dates. Use color sparingly — one accent color (e.g., dark blue for section headings) on monochrome body. Look at modern-cv template for an example of this aesthetic.
Click compile in TypeTeX or run typst compile cv.typ on the command line. PDF is the only output format Typst produces by default — exactly the format recruiters and hiring committees want. The PDF includes embedded fonts so it renders identically on any device.
Yes — use #if conditionals based on a 'mode' variable: #let mode = "resume". Then conditionally include sections: #if mode == "cv" { [extended publications list] }. One source file, two outputs (one-page resume vs full academic CV) by changing one variable.