← All writing

One source of truth for my CV and this website

For a while my CV and my portfolio site told slightly different stories. A job title here, a date there, a project that existed in one place and not the other. None of it was dishonest, but the drift was real, and keeping two hand-written copies in sync is exactly the kind of manual work I dislike.

So I fixed the structure rather than the symptoms.

A structured layer and a narrative layer

My career information now lives in two deliberate layers. A career.json file holds the machine-readable facts: profile, experience, projects, publications, skills, education, and contact details, validated against a JSON schema. Alongside it sits a narrative document that captures framing and tone, the things a schema cannot hold.

The structured file is the contract. Everything downstream consumes it.

The website reads the same file

This site is built with Next.js and TypeScript, and it imports career.json directly through a typed accessor. There is one definition of my current role, one list of projects, one place where my publication is described. When I update a fact in the source file, the site reflects it. No copy-paste, no second source to forget.

The same file is also what keeps my LaTeX CV honest, synced across from the workspace where I maintain it.

Why bother for a one-person site

Because correctness compounds. The moment content is generated from data rather than typed by hand, a whole category of small embarrassing mistakes disappears: the stale availability date, the project that got better but never got updated, the footer that claimed the wrong framework.

It is the same instinct I bring to larger systems. Model the data well, derive the views from it, and let consistency be a property of the design rather than a chore.