Turn a folder of JSON files (+ one BibTeX file) into a polished, WCM-template XeLaTeX CV. You edit data, not LaTeX; the kit emits the PDF.
WCM CV Kit ships as a prebuilt image at ghcr.io/imedslab/cvkit:latest (rebuilt
by CI on every push here), so the normal way to use it needs no local install
— see below. See the output it produces in the
sample CV,
which CI compiles from cv_data/ on every push.
Keep your CV in its own (private) repo holding only your data plus one workflow that pulls the public image. Your data stays private; no LaTeX, no Python, no build step:
- Create a new repo and add a
cv_data/folder (copy this repo'scv_data/as a starting point — it's a working example). - Copy
examples/cv-repo-workflow.ymlinto it as.github/workflows/cv.yml. - Edit
cv_data/, commit, push.
That's it. Every push compiles the CV, and the freshest PDF is always at:
https://github.com/<you>/<repo>/releases/latest/download/cv.pdf
New repos have Actions on by default, so there's nothing else to configure. The
cvkit image is public, so the pull needs no auth even from a private repo.
Optional — support the project: add a repo secret CVKIT_STAR_TOKEN (a
classic GitHub PAT with the public_repo scope) and each build stars this repo,
so its author can gauge how many people use WCM CV Kit. The step self-skips if the
secret is absent. Note that GitHub stars are public.
cv_data/ is the only thing you personalise: one JSON file per CV section, plus
refs.bib for the publication list. Strings are LaTeX-ready, so write \&,
5\%, --, etc. directly. The "Date of Preparation" is always the build date.
See CLAUDE.md for the section→file map, the JSON conventions, and
how to add grants / mentees / publications.
To compile on your own machine you need uv and a
TeX distribution with xelatex + bibtex (TeX Live / MacTeX):
uv sync # one-time: env + install cvkit
uv run compile_cv --data cv_data --out cv_out # → cv_out/cv.pdf (also: make pdf)No local TeX? Use the same image the cloud build uses — it bundles everything:
docker run --rm -v "$PWD/cv_data:/data" -v "$PWD/cv_out:/out" ghcr.io/imedslab/cvkit:latestCompilation is hermetic: each LaTeX run happens in a throwaway temp dir, and only
cv.pdf (+ cv.tex) land in --out.
compile_cv --data DIR --out DIR [--name NAME] [--tex-only] [--keep-tmp]
| flag | default | meaning |
|---|---|---|
--data |
cv_data |
folder with the *.json files and the *.bib |
--out |
cv_out |
output folder for the compiled PDF |
--name |
cv |
output basename (cv → cv.pdf) |
--tex-only |
— | write the .tex only, skip LaTeX |
--keep-tmp |
— | keep the temp build dir (to debug LaTeX errors) |
The CV uses FreeSans by default, set in cv_data/meta.json:
- System font (portable): omit
font_path;cvkitlooks the family up by name. - Explicit files: set
font_pathto a directory +font_ext(.otf/.ttf).
A font_path that doesn't exist is ignored, so an absolute macOS path falls back
to the system FreeSans inside Docker/CI — the same meta.json builds everywhere.
This repo is the tool. src/cvkit/ is the package (generate.py = JSON→LaTeX,
compile.py = LaTeX→PDF, cli.py = the command). ci.yml runs the tests,
builds the image, smoke-tests it on the demo cv_data/, and pushes
ghcr.io/<owner>/cvkit:latest from main.
uv run pytest # everything
uv run pytest -m "not integration" # fast unit tests (no TeX)
uv run pytest -m integration # end-to-end: actually compiles PDFsThis is an independent, unofficial project. It is not an official repository of Weill Cornell Medicine, is not endorsed or sponsored by it, and does not represent its views, values, or positions. The CV template here is a community reproduction of the publicly available layout. Weill Cornell Medicine and its affiliates bear no responsibility for this software or for any content produced with it. All trademarks and names are the property of their respective owners. The software is provided "as is", without warranty of any kind.
