diff --git a/packages/preview/clean-print-cv/0.1.0/LICENSE b/packages/preview/clean-print-cv/0.1.0/LICENSE new file mode 100644 index 0000000000..fe4f5bd9ca --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 guillermodotn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/clean-print-cv/0.1.0/README.md b/packages/preview/clean-print-cv/0.1.0/README.md new file mode 100644 index 0000000000..ab13bf2c59 --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/README.md @@ -0,0 +1,143 @@ +# clean-print-cv + +A clean, print-friendly CV template for [Typst](https://typst.app). YAML-driven content, zero color fills, works in B&W. + +![Two-page CV example using the clean-print-cv template](thumbnail.png) + +## Features + +- **Print-friendly**: no solid color blocks, minimal ink usage, looks identical in B&W +- **YAML-driven**: edit `cv-data.yaml` with your content, the template handles the rest +- **No page breaks inside sections**: certifications, education, projects, etc. never split across pages +- **ATS-compatible**: single-column layout, standard section headings, clean PDF output +- **Self-contained**: no external Typst packages required + +## Using as a Typst package + +### Quick start with `typst init` + +The fastest way to get started is using Typst's built-in scaffolding: + +``` +typst init @preview/clean-print-cv:0.1.0 my-cv +cd my-cv +``` + +This creates a new directory with `main.typ` and `cv-data.yaml` ready to edit. + +### Manual import + +In any `.typ` file, import the template and use its functions: + +```typ +#import "@preview/clean-print-cv:0.1.0": * + +#let data = yaml("cv-data.yaml") + +#show: cv-page-setup + +#cv-header(data.personal) +#cv-summary(data.summary) +#cv-experience(data.experience) +#cv-skills(data.skills) +#cv-projects(data.projects) +#cv-certifications(data.certifications) +#cv-education(data.education) +#cv-languages(data.languages) +``` + +Then compile: + +``` +typst compile main.typ +``` + +## Local development + +If you've cloned this repository and want to work on it directly: + +1. [Install Typst](https://github.com/typst/typst#installation) +2. Edit `cv-data.yaml` with your data +3. Compile: + +``` +typst compile cv.typ +``` + +Or use live reload while editing: + +``` +typst watch cv.typ +``` + +## Files + +| File | Purpose | +|---|---| +| `cv.typ` | Entry point; compile this. Controls section order. | +| `cv-template.typ` | All styling and layout logic. | +| `cv-data.yaml` | Your CV content. Edit this. | +| `template/` | Scaffolding files for `typst init`. | +| `typst.toml` | Package manifest for Typst Universe. | + +## Sections + +The template includes these sections, all optional (comment out any line in your entry point to remove): + +- Professional Summary +- Professional Experience +- Technical Skills +- Key Projects +- Certifications +- Education +- Languages (with proficiency dots) + +Reorder them by moving lines in your `.typ` file. + +## Customization + +### Colors + +Edit the variables at the top of `cv-template.typ`: + +```typ +#let primary = rgb("#2b4c7e") // headings, name, accent bars +#let accent = rgb("#3d6098") // company names, bullets +#let body-color = rgb("#1a1a1a") // body text +#let muted = rgb("#666666") // dates, locations +#let rule-color = rgb("#d0d0d0") // hairline separators +``` + +### Font sizes + +```typ +#let name-size = 20pt +#let title-size = 10pt +#let section-size = 10.5pt +#let body-size = 9.5pt +#let small-size = 8.5pt +``` + +### Fonts + +Change the font in the `cv-page-setup` function: + +```typ +set text(font: "New Computer Modern", ...) +``` + +Replace `"New Computer Modern"` with any system font. + +## Licensing + +The package code (`cv-template.typ`) is licensed under [MIT](LICENSE). +The template directory contents (`template/`) are licensed under [MIT-0](template/LICENSE), +so you may use, modify, and distribute your CV without attribution or including a license notice. + +## Building the thumbnail + +The thumbnail for Typst Universe is generated from the template data. Requires [ImageMagick](https://imagemagick.org/): + +``` +make thumbnail +``` diff --git a/packages/preview/clean-print-cv/0.1.0/cv-template.typ b/packages/preview/clean-print-cv/0.1.0/cv-template.typ new file mode 100644 index 0000000000..635e1ea4ae --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/cv-template.typ @@ -0,0 +1,323 @@ +// ============================================================================= +// clean-print-cv — A Typst CV template +// +// Design: Clean, text-focused, fully print-friendly. Zero color fills. +// Centered header, left-aligned body. +// Accent bar on section headings (O'Reilly chapter feel). +// Muted metadata, generous whitespace (Chirpy blog style). +// Palette: HR/recruiter-optimized monochromatic deep blue. +// Data: YAML-driven — edit cv-data.yaml, not this file. +// Usage: #import "@preview/clean-print-cv:0.1.0": * +// Compile: typst compile main.typ +// ============================================================================= + +// --------------------------------------------------------------------------- +// Theme Colors +// --------------------------------------------------------------------------- +#let primary = rgb("#2b4c7e") // deep blue — headings, name, accent bars +#let accent = rgb("#3d6098") // steel blue — company names, bullets +#let body-color = rgb("#1a1a1a") // near-black — body text +#let muted = rgb("#666666") // medium gray — dates, locations, metadata +#let rule-color = rgb("#d0d0d0") // light gray — hairline separators +#let dot-empty = rgb("#c5cad3") // unfilled language dots + +// --------------------------------------------------------------------------- +// Theme Sizes +// --------------------------------------------------------------------------- +#let name-size = 20pt +#let title-size = 10pt +#let section-size = 10.5pt +#let body-size = 9.5pt +#let small-size = 8.5pt +#let contact-size = 8.5pt + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- +#let bullet-marker(content) = { + text(fill: accent, size: 6pt)[#sym.circle.filled] + h(5pt) + content +} + +#let contact-sep = { + h(5pt) + text(fill: rule-color, size: 8pt)[#sym.bar.v] + h(5pt) +} + +// --------------------------------------------------------------------------- +// Section heading — left-aligned accent bar (O'Reilly chapter style) +// --------------------------------------------------------------------------- +#let section-heading(title) = { + v(10pt) // generous gap from previous section + block(width: 100%)[ + #grid( + columns: (3pt, auto), + column-gutter: 8pt, + // Left accent bar + block( + width: 3pt, + height: section-size + 2pt, + fill: primary, + radius: 1pt, + ), + // Title text + text( + size: section-size, + weight: "bold", + fill: primary, + )[#upper(title)], + ) + #v(-4pt) // rule hugs the heading tightly + #line(length: 100%, stroke: 0.4pt + rule-color) + ] + v(2pt) // small gap to content — heading owns its content +} + +// --------------------------------------------------------------------------- +// Header — centered, print-friendly, zero ink waste +// --------------------------------------------------------------------------- +#let cv-header(personal) = { + // Name — centered, the visual anchor + align(center)[ + #text( + size: name-size, + weight: "bold", + fill: primary, + tracking: 1.5pt, + )[#upper(personal.name)] + ] + v(2pt) + // Title — centered, muted italic subtitle + align(center)[ + #text( + size: title-size, + fill: muted, + style: "italic", + )[#personal.title] + ] + v(5pt) + // Thin rule + line(length: 100%, stroke: 0.8pt + primary) + v(4pt) + // Contact row — centered + align(center)[ + #set text(size: contact-size, fill: muted) + #personal.email + #contact-sep + #personal.phone + #contact-sep + #personal.location + #if personal.linkedin != "" [ + #contact-sep + #personal.linkedin + ] + #if personal.github != "" [ + #contact-sep + #personal.github + ] + #if personal.at("website", default: "") != "" [ + #contact-sep + #personal.website + ] + ] + v(1pt) + line(length: 100%, stroke: 0.3pt + rule-color) +} + +// --------------------------------------------------------------------------- +// Professional Summary +// --------------------------------------------------------------------------- +#let cv-summary(summary-text) = { + block(breakable: false)[ + #section-heading("Professional Summary") + #block(width: 100%, inset: (left: 2pt))[ + #text(size: body-size, fill: body-color)[#summary-text] + ] + ] +} + +// --------------------------------------------------------------------------- +// Technical Skills +// --------------------------------------------------------------------------- +#let cv-skills(skills) = { + block(breakable: false)[ + #section-heading("Technical Skills") + #for group in skills { + block(width: 100%, inset: (left: 2pt, bottom: 3pt))[ + #text(size: body-size, weight: "bold", fill: primary)[#group.category:] + #h(5pt) + #text(size: small-size, fill: body-color)[ + #group.items.join(" | ") + ] + ] + } + ] +} + +// --------------------------------------------------------------------------- +// Experience +// --------------------------------------------------------------------------- +#let experience-entry(exp) = { + block(width: 100%, breakable: false, inset: (left: 2pt, bottom: 1pt))[ + // Role + Period + #grid( + columns: (1fr, auto), + align: (left, right), + text(size: body-size, weight: "bold", fill: body-color)[#exp.role], + text(size: small-size, fill: muted)[#exp.period], + ) + // Company + Location + #grid( + columns: (1fr, auto), + align: (left, right), + text(size: small-size, fill: accent, weight: "semibold")[#exp.company], + text(size: small-size, fill: muted, style: "italic")[#exp.location], + ) + #v(2pt) + // Bullets + #for item in exp.highlights { + block(inset: (left: 6pt, bottom: 1.5pt))[ + #bullet-marker(text(size: small-size, fill: body-color)[#item]) + ] + } + ] + v(3pt) +} + +#let cv-experience(experience) = { + section-heading("Professional Experience") + for exp in experience { + experience-entry(exp) + } +} + +// --------------------------------------------------------------------------- +// Key Projects +// --------------------------------------------------------------------------- +#let cv-projects(projects) = { + block(breakable: false)[ + #section-heading("Key Projects") + #for proj in projects { + block(width: 100%, inset: (left: 2pt, bottom: 3pt))[ + #grid( + columns: (auto, 1fr), + align: (left, right), + text(size: body-size, weight: "bold", fill: body-color)[#proj.name], + text(size: small-size, fill: muted, style: "italic")[#proj.url], + ) + #v(1pt) + #text(size: small-size, fill: body-color)[#proj.description] + ] + } + ] +} + +// --------------------------------------------------------------------------- +// Certifications +// --------------------------------------------------------------------------- +#let cv-certifications(certs) = { + block(breakable: false)[ + #section-heading("Certifications") + #for cert in certs { + block(width: 100%, inset: (left: 2pt, bottom: 2pt))[ + #grid( + columns: (1fr, auto), + align: (left, right), + [ + #text(size: body-size, weight: "semibold", fill: body-color)[#cert.name] + #h(4pt) + #text(size: small-size, fill: muted)[-- #cert.issuer] + ], + text(size: small-size, fill: muted)[#cert.year], + ) + ] + } + ] +} + +// --------------------------------------------------------------------------- +// Education +// --------------------------------------------------------------------------- +#let cv-education(education) = { + block(breakable: false)[ + #section-heading("Education") + #for edu in education { + block(width: 100%, inset: (left: 2pt, bottom: 2pt))[ + #grid( + columns: (1fr, auto), + align: (left, right), + text(size: body-size, weight: "bold", fill: body-color)[#edu.degree], + text(size: small-size, fill: muted)[#edu.period], + ) + #grid( + columns: (1fr, auto), + align: (left, right), + text(size: small-size, fill: accent, weight: "semibold")[#edu.institution], + text(size: small-size, fill: muted, style: "italic")[#edu.location], + ) + #if edu.at("details", default: "") != "" { + v(1pt) + text(size: small-size, fill: body-color)[#edu.details] + } + ] + } + ] +} + +// --------------------------------------------------------------------------- +// Languages +// --------------------------------------------------------------------------- +#let cv-languages(languages) = { + block(breakable: false)[ + #section-heading("Languages") + #block(width: 100%, inset: (left: 2pt))[ + #grid( + columns: (1fr,) * calc.min(languages.len(), 3), + column-gutter: 16pt, + ..languages.map(lang => { + let filled = lang.dots + let empty = 5 - lang.dots + [ + #text(size: body-size, weight: "semibold", fill: body-color)[#lang.language] + #h(4pt) + #text(size: small-size, fill: muted)[#lang.level] + #v(1pt) + #text(size: 8pt)[ + #for i in range(filled) [#text(fill: accent)[#sym.circle.filled] ] + #for i in range(empty) [#text(fill: dot-empty)[#sym.circle.filled] ] + ] + ] + }) + ) + ] + ] +} + +// --------------------------------------------------------------------------- +// Page setup +// --------------------------------------------------------------------------- +#let cv-page-setup(body) = { + set document( + title: "Curriculum Vitae", + author: "", + ) + set page( + paper: "a4", + margin: (top: 28pt, bottom: 24pt, left: 32pt, right: 32pt), + header: none, + footer: none, + ) + set text( + font: "New Computer Modern", + size: body-size, + fill: body-color, + lang: "en", + ) + set par( + justify: true, + leading: 0.55em, + ) + body +} diff --git a/packages/preview/clean-print-cv/0.1.0/template/LICENSE b/packages/preview/clean-print-cv/0.1.0/template/LICENSE new file mode 100644 index 0000000000..9c011b87ae --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/template/LICENSE @@ -0,0 +1,18 @@ +MIT No Attribution + +Copyright (c) 2026 guillermodotn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/clean-print-cv/0.1.0/template/cv-data.yaml b/packages/preview/clean-print-cv/0.1.0/template/cv-data.yaml new file mode 100644 index 0000000000..96978cb0b7 --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/template/cv-data.yaml @@ -0,0 +1,133 @@ +# ============================================================================= +# clean-print-cv — CV Data File +# Replace this placeholder data (Shrek) with your own! +# Template: https://github.com/guillermodotn/clean-print-cv +# ============================================================================= + +personal: + name: "Shrek" + title: "Ogre | Swamp Owner | Onion Enthusiast" + email: "shrek@far.away" + phone: "+777 123123 " + location: "The Swamp, Far Far Away" + linkedin: "in/shrek" + github: "github.com/the-ogre" + website: "shrek.onion" + +summary: >- + Fiercely independent ogre with 15+ years of swamp management experience + and a proven track record of solving impossible problems that entire + kingdoms cannot handle. Expert in perimeter security, solo operations, and + rescuing princesses from dragon-guarded towers under tight deadlines. + Excellent at working alone but surprisingly effective in cross-functional + teams when properly motivated (usually by the threat of eviction). + Known for getting things done with minimal resources, maximum efficiency, + and zero interest in office politics. + +skills: + - category: "Swamp Management" + items: ["Mud Engineering", "Outhouse Construction", "Perimeter Defense", "Wildlife Control", "Swamp Drainage Prevention"] + - category: "Combat & Rescue" + items: ["Dragon Negotiation", "Tower Infiltration", "Princess Extraction", "Tournament Fighting", "Angry Mob Dispersal"] + - category: "Social & Diplomacy" + items: ["Intimidation (Advanced)", "Royal Court Etiquette (Beginner)", "Donkey Management", "Crowd Control", "Public Speaking"] + - category: "Culinary Arts" + items: ["Weedrat Stew", "Slug-and-Bug Flambe", "Eyeball Tartare", "Onion-Based Everything", "Parfait Appreciation"] + - category: "Construction & Trades" + items: ["Log Cabin Carpentry", "Mud Brick Masonry", "Signage", "Fence Building", "Interior Decorating (Rustic)"] + - category: "Survival & Outdoors" + items: ["Fire Making", "Star Navigation", "Foraging", "Mud Bathing (Therapeutic)", "Ear Wax Candle Crafting"] + +experience: + - role: "Lord of the Swamp & Head of Household" + company: "The Swamp (Family Estate)" + location: "The Swamp, Far Far Away" + period: "2004 — Present" + highlights: + - "Successfully transitioned from solo swamp hermit to family man, expanding the estate to accommodate a wife, three ogre babies, and one uninvited donkey" + - "Negotiated permanent land rights with the Kingdom of Far Far Away after initial eviction attempt, securing the swamp as sovereign ogre territory in perpetuity" + - "Managed a household budget of zero gold coins while maintaining 100% family satisfaction through resourcefulness and onion-based cuisine" + - "Resolved multiple kingdom-threatening crises on a volunteer basis, including the Fairy Godmother hostile takeover and the Rumpelstiltskin alternate reality incident" + + - role: "Quest Contractor — Dragon Tower Rescue" + company: "Kingdom of Duloc (Lord Farquaad, Client)" + location: "Dragon's Keep, Far Far Away" + period: "2001 — 2004" + highlights: + - "Completed a full princess rescue mission in under 72 hours with zero prior quest experience and only a donkey as support staff" + - "Defeated an entire arena of knights in single combat during the contractor selection tournament, beating out hundreds of qualified applicants" + - "Navigated a dragon-guarded castle, extracted the client's requested princess, and delivered her across hostile territory with a 100% survival rate" + - "Identified and exposed critical fraud in the client's marriage contract (princess was an ogre at sunset), preventing a kingdom-wide compliance violation" + - "Formed a lasting strategic alliance with a dragon, converting a major threat into a long-term transportation asset" + + - role: "Independent Swamp Resident" + company: "Self-Employed" + location: "The Swamp, Outskirts" + period: "1990 — 2001" + highlights: + - "Designed and built entire swamp homestead from scratch as a solo operator, including cabin, outhouse, and shower system using only local materials" + - "Maintained an unbroken 11-year streak of zero trespassers through a combination of reputation management, signage, and occasional roaring" + - "Developed proprietary 'GET OUT OF MY SWAMP' early warning system, reducing unwanted visitor incidents by 95%" + - "Achieved complete self-sufficiency through foraging, hunting, and the cultivation of a diverse onion garden" + +projects: + - name: "The Great Fairy Tale Creature Relocation" + url: "farfaraway.gov/decree/fairy-tale-relocation" + description: >- + Led the effort to reverse Lord Farquaad's illegal eviction of fairy tale + creatures from their homes. Successfully negotiated the return of all + displaced creatures including the Three Blind Mice, the Big Bad Wolf, + Pinocchio, and the Three Little Pigs. + + - name: "Far Far Away Royal Succession Crisis" + url: "farfaraway.gov/archive/succession-crisis" + description: >- + When King Harold was incapacitated, recruited and mentored the next + rightful heir (Arthur Pendragon) from a medieval high school, preventing + Prince Charming's hostile takeover of the kingdom. Completed under + extreme deadline pressure with a team of fairy tale volunteers. + + - name: "Rumpelstiltskin Reality Restoration" + url: "farfaraway.gov/archive/reality-restoration" + description: >- + After signing a fraudulent contract that erased an entire day of + existence, orchestrated the complete restoration of the Far Far Away + timeline. Rallied an ogre resistance army and defeated a tyrannical + regime within 24 hours. Key learning: always read the fine print. + +certifications: + - name: "Certified Swamp Sovereign" + issuer: "Kingdom of Far Far Away" + year: "2004" + + - name: "Dragon Whisperer (Level II)" + issuer: "Far Far Away Creature Relations Board" + year: "2002" + + - name: "Licensed Quest Contractor" + issuer: "Duloc Department of Heroic Affairs" + year: "2001" + + - name: "Advanced Intimidation & Roaring" + issuer: "Ogre Academy of Traditional Arts" + year: "1995" + +education: + - degree: "School of Hard Knocks (No Formal Education)" + institution: "The Swamp, Self-Taught" + location: "Far Far Away" + period: "Ongoing" + details: "Autodidact. Learned everything from experience, stubbornness, and occasional near-death situations." + +languages: + - language: "English" + level: "Native" + dots: 5 + + - language: "Ogrese" + level: "Fluent" + dots: 5 + + - language: "Donkey" + level: "Involuntary" + dots: 4 diff --git a/packages/preview/clean-print-cv/0.1.0/template/main.typ b/packages/preview/clean-print-cv/0.1.0/template/main.typ new file mode 100644 index 0000000000..8eb3355eff --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/template/main.typ @@ -0,0 +1,39 @@ +// ============================================================================= +// clean-print-cv — Entry Point +// Compile: typst compile main.typ +// Watch: typst watch main.typ +// ============================================================================= + +#import "@preview/clean-print-cv:0.1.0": * + +// Load CV data from YAML +#let data = yaml("cv-data.yaml") + +// Apply page setup +#show: cv-page-setup + +// -- Header ------------------------------------------------------------------ +#cv-header(data.personal) + +// -- Professional Summary ---------------------------------------------------- +#cv-summary(data.summary) + +// -- Professional Experience ------------------------------------------------- +// (Before skills: for senior roles, what you DID matters more than tool lists) +#cv-experience(data.experience) + +// -- Technical Skills -------------------------------------------------------- +// (After experience: acts as an ATS keyword bank, supports the narrative above) +#cv-skills(data.skills) + +// -- Key Projects ------------------------------------------------------------ +#cv-projects(data.projects) + +// -- Certifications ---------------------------------------------------------- +#cv-certifications(data.certifications) + +// -- Education --------------------------------------------------------------- +#cv-education(data.education) + +// -- Languages --------------------------------------------------------------- +#cv-languages(data.languages) diff --git a/packages/preview/clean-print-cv/0.1.0/thumbnail.png b/packages/preview/clean-print-cv/0.1.0/thumbnail.png new file mode 100644 index 0000000000..18dfa629ad Binary files /dev/null and b/packages/preview/clean-print-cv/0.1.0/thumbnail.png differ diff --git a/packages/preview/clean-print-cv/0.1.0/typst.toml b/packages/preview/clean-print-cv/0.1.0/typst.toml new file mode 100644 index 0000000000..0b0f58ef88 --- /dev/null +++ b/packages/preview/clean-print-cv/0.1.0/typst.toml @@ -0,0 +1,17 @@ +[package] +name = "clean-print-cv" +version = "0.1.0" +entrypoint = "cv-template.typ" +authors = ["guillermodotn <@guillermodotn>"] +license = "MIT AND MIT-0" +description = "Create clean, print-friendly, YAML-driven CVs." +repository = "https://github.com/guillermodotn/clean-print-cv" +keywords = ["cv", "resume", "print", "yaml"] +categories = ["cv"] +compiler = "0.12.0" +exclude = ["cv.typ", "/cv-data.yaml", "cv.pdf", "Makefile", "thumbnail-*.png", "personal/", ".gitignore"] + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png"