YAMLResume

YAMLResume VS LaTeX

For decades, LaTeX has been the de facto way for engineers, researchers, and academics to produce a professionally typeset resume. Write a .tex file, compile it, and get a PDF with typography that Word cannot match. A rich template ecosystem grew around this workflow— Awesome-CV (20,000+ GitHub stars), moderncv, Jake's Resume, Deedy-Resume, AltaCV—and Overleaf hosts hundreds of CV templates that compile in your browser.

From the official LaTeX project website:

LaTeX is a document preparation system for high-quality typesetting. It is
most often used for medium-to-large technical or scientific documents but it
can be used for almost any form of publishing.

Here is the thing, though: YAMLResume is not an alternative to LaTeX—it is built on it. YAMLResume's LaTeX engine generates .tex source from your YAML and compiles it with XeLaTeX, the same engine that powers hand-written LaTeX resumes. The real comparison is between two authoring workflows: writing your resume directly in TeX markup, or writing it as structured YAML and letting a compiler generate the TeX for you.

Here is how the two workflows compare:

Feature Comparison

FeatureYAMLResumeHand-written LaTeX
ApproachYAML source compiled to LaTeXDocuments authored directly in TeX
Authoring LanguageYAML (plain text, no markup)TeX/LaTeX markup
TeX KnowledgeNone requiredProficiency required for customization
Typesetting EngineXeLaTeXYour choice: pdfLaTeX, XeLaTeX, LuaLaTeX
Output FormatsDOCX, HTML, Markdown, LaTeX/PDFPDF (pandoc conversions are possible but lossy)
Generated SourceClean .tex emitted alongside the PDF—you can inspect or tweak itN/A (the hand-written source is all there is)
Schema ValidationStrict Zod validation with JSON Schema IDE integrationNone—only compile-time TeX errors
Error Reportingclang-style diagnostics with line numbers, columns, and source snippetsTeX log: often cryptic cascading errors far from the real cause
Environment Setupnpm install -g yamlresume, Homebrew, or Docker with XeTeX pre-installed; yamlresume doctor checks fontsMulti-gigabyte TeX Live/MacTeX/MiKTeX install, missing-package hunts, manual font setup—or cloud-based Overleaf
TemplatesCurated official LaTeX, HTML, and DOCX templatesThousands of community templates and classes (Awesome-CV, moderncv, AltaCV, Jake's Resume, ...)
Design CustomizationPage, typography, and sections knobs—theme-encapsulatedUnlimited—anything TeX can typeset
Section CustomizationAliases and reorderArbitrary macros and environments
Internationalization10 languages across 12 locale codes, automatic babel and CJK package configurationManual: babel/polyglossia, fontspec, ctex/xeCJK/luatexja/kotex
Rich TextA selected set of Markdown syntax in summary fieldsAny TeX markup, anywhere
Data ModelFixed, structured schema; JSON Resume interopFree-form document
AI WorkflowsBuilt-in generation and translation; Markdown output is LLM-friendlyBring-your-own prompting of an LLM
Dev Modeyamlresume dev rebuilds on every savelatexmk -pvc or Overleaf auto-compile
Version ControlClean content diffs—only meaningful changes show upDiffs mixed with markup churn
CI/CDOfficial GitHub Action + Docker imageCommunity actions (e.g. latex-action); Overleaf GitHub sync is a paid feature
CollaborationGit pull requests on plain YAMLOverleaf real-time collaboration (paid tiers) or Git on .tex
Deterministic OutputYesYes, if you pin the toolchain and packages
CostFree (open source)Free self-hosted; Overleaf is freemium

Key Differences Explained

Authoring: Content vs. Markup

The most immediate difference is what you look at all day. Here is the same job entry, both ways.

In a hand-written Awesome-CV-style resume:

\cventry{Jan 2020 -- Present}
  {Senior Software Engineer}
  {ACME Inc.}
  {San Francisco, CA}
  {
    \begin{itemize}
      \item Led a team of 5 engineers building payments infrastructure
      \item Reduced p95 latency by 40\% via query optimization
    \end{itemize}
  }

In YAMLResume:

work:
  - name: ACME Inc.
    position: Senior Software Engineer
    startDate: Jan 2020
    summary: |
      - Led a team of 5 engineers building payments infrastructure
      - Reduced p95 latency by 40% via query optimization

Both produce a professionally typeset entry. But in the LaTeX version, your content is wrapped in macros, braces, and environments; in the YAML version, your content is the file. Anyone—including a non-programmer colleague, a recruiter, or your future self on a phone—can read and edit the YAML. And because the markup is a compiler's job, you can change how every date in the document is rendered by changing zero lines of your content.

Validation and Debugging

This is where the two workflows diverge most sharply.

With hand-written LaTeX, your only safety net is the compiler. TeX errors are famous for being cryptic and cascaded: a stray & in your job title can surface as Misplaced \omit somewhere deep inside a class file, and tracking it down requires reading the log carefully. Content errors—a malformed date, a misspelled field—are just text to TeX; it will happily typeset startDtae.

YAMLResume validates your data before a single TeX line is emitted. The compiler checks your resume against a strict Zod schema and reports clang-style diagnostics with line numbers, column numbers, and the offending source:

$ yamlresume validate my-resume.yml
my-resume.yml:9:12: warning: email is invalid.
    email: hi@pp
           ^
my-resume.yml:38:10: error: city is too short.
    city: S
          ^

By the time XeLaTeX runs, the data is known-good, and compile failures become rare enough that they are actual news—usually a font or package issue that doctor already flagged.

Separation of Content and Presentation

Hand-written LaTeX entangles content and presentation. Every entry is wrapped in template-specific macros, which means switching templates means rewriting your resume. Moving from moderncv to AwesomeCV is not a theme change; it is converting every \cventry into another macro (or whatever the new class expects) and reshuffling arguments.

YAMLResume enforces separation of concerns as a design principle:

  • content: what your resume says
  • locale: the language and region it says it in
  • layouts: how it looks—engine, template, page, typography, section aliases and order

Want to see your resume in the jake style instead of moderncv-banking? Change one line in layouts; the content file is untouched. This also makes per-application tailoring trivial: keep one canonical content file, and check in small layout variants that reorder or alias sections.

One Source, Four Engines

A .tex file compiles to PDF. That is the whole pipeline, and for many people it is enough—until a recruiter asks for a Word version, or you want your resume as a page on your personal site, or you need a plain-text version to paste into an ATS form. Pandoc can convert LaTeX to DOCX or HTML, but the results are typographically mediocre compared to a purpose-built engine, because the conversion has to guess intent from markup.

YAMLResume ships four first-class engines—DOCX, HTML, Markdown, and LaTeX—and one yamlresume build produces all of them from the same source. The Markdown engine is particularly useful in 2026: it gives LLMs and ATS parsers clean, structured text extracted from the same validated data.

Internationalization

Writing a German or Chinese resume by hand in LaTeX is a project in itself. German wants babel with ngerman, German date strings, and correct quotation marks. Chinese requires choosing between ctex, xeCJK, or luatexja, installing CJK fonts, and configuring font fallbacks—well-trodden paths for TeX veterans, but genuinely days of effort the first time. Every additional language multiplies the work, because nothing is shared between documents.

In YAMLResume you set the locale key. The compiler translates section headings, country names, degrees, skill levels, and fluency levels; formats dates and addresses idiomatically; applies locale-appropriate punctuation rules (including full-width punctuation for CJK and non-breaking spaces before high punctuation in French); and configures babel and the right CJK packages for XeLaTeX automatically. And yamlresume ai translate can produce a structure-preserving translation of your entire resume into any supported locale—turning a multi-day typesetting project into a single command.

The Customization Ceiling

To be fair: hand-written LaTeX wins the control contest, and it is not close. Anything TeX can typeset, you can put in a hand-written resume—TikZ diagrams, custom macros, precise micro-typographic tweaks, biblatex publication lists for academic CVs, multi-page layouts, a cover letter sharing the same class. If you are a TeX expert who enjoys this, YAMLResume will feel like guardrails.

But that ceiling comes with a cost: everything is your responsibility, forever. Every macro conflict, package upgrade, and font edge case is yours to fix. YAMLResume trades the infinite ceiling for a high floor: curated templates encode professional typography decisions so you cannot make bad ones, while still exposing the knobs that matter—paper size, margins, and page numbers, font family, size, and line spacing, and section aliases and ordering.

And if you ever hit the ceiling, there is an escape hatch: the generated .tex source is emitted alongside your PDF. You can read it to learn, or fork it and take over from there. YAMLResume does not hide LaTeX from you; it just does not require you.

Ecosystem

Templates

The hand-written LaTeX ecosystem's greatest strength is its scale: thousands of resume templates across GitHub, Overleaf's gallery, CTAN, and curation sites, in every visual style imaginable. The trade-off is quality variance—templates range from meticulously maintained classes to one-off exports with hardcoded values, outdated package usage, and no validation.

YAMLResume takes the curated approach: a small set of official LaTeX templates (moderncv-classic, moderncv-casual, moderncv-banking, jake, etc.), each tested against all 12 locale codes, so a template switch never silently breaks a localized resume.

Overleaf

Overleaf is the closest thing the LaTeX world has to a YAMLResume-like experience: zero installation, a template gallery, and auto-compile on every keystroke, plus genuinely excellent real-time collaboration. If you want to stay in a LaTeX workflow, it is the easiest way to do it.

The trade-offs are structural: your project lives in a cloud service; features like version history, track changes, and GitHub synchronization sit behind paid plans; and you still have a .tex document—no structured data, no multi-format export, no schema validation, no CLI. YAMLResume gives you Overleaf-style iteration speed locally through yamlresume dev, with Git as your version history.

CI/CD

Both workflows automate. The LaTeX world has community solutions like the latex-action for GitHub Actions, and Overleaf can sync with GitHub as a paid feature. YAMLResume ships an official GitHub Action that validates your resume and builds all four formats in one step:

- uses: yamlresume/action@v0.16.1
  with:
    resumes: |
      resume-en.yml
      resume-zh.yml
      resume-fr.yml

Because the input is structured YAML, CI can also do things no .tex pipeline can: fail a pull request that introduces a schema error, diff content changes without markup noise, or regenerate all localized variants from a single edit.

Summary

Hand-written LaTeX excels if you want:

  • Total typographic control—custom macros, TikZ graphics, biblatex bibliographies, precise spacing, any layout you can imagine
  • Access to thousands of community templates and classes in every style
  • The same toolchain you already use for papers, theses, and slides
  • A genuinely fun craft, if TeX is a skill you enjoy maintaining
  • Cloud convenience and collaboration through Overleaf

YAMLResume excels if you want:

  • LaTeX-grade PDF typography—via XeLaTeX—without writing or debugging TeX
  • Structured, validated data with clang-style errors instead of compile logs
  • Extended output formats (DOCX, HTML, Markdown, LaTeX/PDF) from one source file
  • Deep internationalization across 10 languages and 12 locale codes, including automatic CJK setup, with AI-assisted translation
  • Template switching without rewriting content, thanks to strict separation of content, locale, and layouts
  • A developer toolchain: watch mode, environment diagnostics, Docker, Homebrew, and a GitHub Action for CI/CD

Choose hand-written LaTeX if you already know TeX, need layouts beyond what any structured schema can express, or consider typesetting part of the craft.

Choose YAMLResume if you want the output LaTeX is famous for, but would rather your resume read like data than like a program.

Edit on GitHub

Last updated on

On this page