Data-Driven CV with LaTeX, Lua & GitHub Actions

LaTeX · Lua · GitHub Actions

An automated system for generating a Curriculum Vitae and cover letter in both Italian and English. Built on LaTeX with the moderncv class, but rethought from the inside: content is fully separated from presentation and lives in a single data.json file.

The Problem It Solves

Keeping a CV up to date in two languages across separate .tex files means updating every piece of data twice, in two different places - with the risk of them falling out of sync. This project eliminates that redundancy entirely.

How It Works

Single Source of Truth

Everything - work experience, education, skills, projects, personal info - lives in one data.json. Updating the CV means editing that one file.

The Lua ↔ LaTeX Bridge

The file commons/lua_data_loader.tex contains a Lua script that, during compilation via LuaLaTeX, reads the JSON and dynamically populates the document sections in the selected language. It’s not a static template - it’s code that runs at compile time.

CI/CD Pipeline

A GitHub Actions workflow automatically compiles all four documents on every push and publishes them to the pdf-release branch. From there, a second step syncs them directly to the personal website repository (eneamanzi.github.io), keeping the online version always current with no manual intervention.

data.json  →  lua_data_loader.tex  →  LuaLaTeX  →  PDF
                                                      ↓
                                          GitHub Actions deploy
                                                      ↓
                                       eneamanzi.github.io (always up-to-date)

Generated Documents

Document Language
Curriculum Vitae Italian
Curriculum Vitae English
Cover Letter Italian
Cover Letter English

Tech Stack

  • Markup language: LaTeX (moderncv)
  • Compilation engine: LuaLaTeX
  • Scripting: Lua
  • Data format: JSON
  • Automation: GitHub Actions
  • Build tool: latexmk

View on GitHub