A clean, two-page resume built with Typst and driven by simple JSON data files. It renders to a PDF with consistent typography and layout.
- PDFs are not committed; build one locally with the commands below.
- Pushing a
vX.Y.Ztag buildsken_esparta_cv.pdfin CI and uploads it to thecdn.kenesparta.devS3 bucket undercv/.
- Typst Install
- Make (optional, for using the provided Makefile)
- Fonts are bundled in
fonts/and referenced automatically during compilation.
- Build a development PDF (
local.pdf):- Using Make:
make gen/local - Directly with Typst:
typst compile main.typ local.pdf --font-path fonts --ignore-system-fonts
- Using Make:
- Build the release PDF (
ken_esparta_cv.pdf, the one CI publishes):make gen/build
- Build a PDF with a short hash in the filename:
make gen/revision
- Clean generated PDFs:
make clean
The generated PDF will appear in the project root.
main.typ— Entry point that includes the section templates.title.typ— Name and role heading.contact.typ— Contact links and social info.intro.typ— Short professional summary.experience.typ— Work experience section, rendered from JSON.additional-experience.typ— Earlier roles, rendered from JSON.projects.typ— Selected projects, rendered from JSON.education.typ— Education history, rendered from JSON.skills.typ— Skills by category, rendered from JSON.config.typ— Theme colors, common helpers, and reusable components.fonts/— Local font files used by the layout.data/— All data sources used to populate the resume sections:experience.jsonadditional-experience.jsonprojects.jsoneducation.jsonskills.json
Makefile— Convenience tasks for building and cleaning.
Update the JSON files in data/ to change content. Keys are straightforward and self-descriptive.
- experience.json
- Fields per job:
company,position,location,from,to,short_description,description(array of bullet points) - Dates use the format
MM-YYYY. An emptytovalue means "Now".
- Fields per job:
- projects.json
- Fields per project:
name,institution,link,link_name,description(array of bullet points)
- Fields per project:
- education.json
- Fields per entry:
school,location,degree,from,to
- Fields per entry:
- additional-experience.json
- Same fields as experience.json:
company,position,location,from,to,short_description,description
- Same fields as experience.json:
- skills.json
- Array of objects with:
categoryanditems(array of strings), rendered as two columns of cards in plain text so ATS parsers read each category with its items
- Array of objects with:
After editing, run a build command again to regenerate the PDF.
- Colors and helpers live in
config.typ:ink(body text),primary-color(names, headings),accent-color(Go teal for text accents and links),highlight-color(Gopher blue, decoration only),muted-color(dates, places)format-dateconvertsMM-YYYYstrings into "Mon YYYY".entrylays out one section entry (title, dates or place, subtitle, bullets) and keeps its header on the same page as the first bullet.mono-linkrenders monospace links (contacts, project repositories).
- Page, text, list and section-heading styles are set in
main.typ; sections are real headings (= Projects), so the PDF gets bookmarks. - PDF metadata (title, author, keywords) is set with
set documentinmain.typ.
- Keep bullet points concise and outcome-focused.
- Prefer consistent verb tense and measurable results where possible.
- Rebuild after each change to verify the layout still fits on two pages.
- If Typst can't find the fonts, pass
--font-path fonts(the Makefile does).--ignore-system-fontsmakes sure only the bundled fonts are used, so local and CI builds match. - If dates render unexpectedly, confirm the
MM-YYYYformat (e.g.,10-2022).
This project is licensed under the MIT License. See the LICENSE file for details.