The Thing That Was Driving Me Insane
For a while, my portfolio and my CV were telling slightly different stories.
I would update a project on the portfolio, then remember that the CV still had the old description. Or I would polish a CV bullet and forget to bring that improvement back to the site. Neither version was wildly wrong, which somehow made it worse: I just could not trust that they were the same.
Keeping two versions of the same career manually in sync is exactly the kind of small, recurring job that eventually drives me insane.
Markdown Is The Source Of Truth
The fix is simple: the portfolio content lives in Markdown collections.
I keep separate entries for the parts of my work that change over time:
- projects
- experience and education
- skills
- my resume profile and contact details
- posts
Each entry has the content the portfolio needs, such as a project description, tags, and links. When the CV needs a more focused version, it can use a few CV-specific fields too: whether to include an item, a subtitle, and the bullets that belong on a one-page resume.
That means a project is still one record. I am not maintaining a portfolio project and then copying it into a separate resume document.
How The CV Gets Built
The /cv page reads those same collections and builds the sections of the CV from them:
- experience entries become the experience section
- included projects become the projects section
- included skills are grouped into the skills section
- the resume profile supplies my name, title, and contacts
So if I correct a project description, add a better achievement bullet, or remove a skill I no longer want to lead with, the portfolio content and the CV page agree automatically.
The downloadable PDF comes from that CV page too. I use a small Playwright script to print /cv as an A4 PDF. The useful part is not that it creates a PDF; it is that the PDF has no separate content to maintain. Once the page is current, regenerating the document is just the final output step.
Content Corrections Have A Home
I also like that this gives content corrections a clear place to go.
If I notice that a description is vague, a date is wrong, or a project is missing an important result, I update the Markdown entry. I do not have to decide whether the portfolio or the CV is the “real” version first.
The portfolio can keep the fuller context. The CV can stay concise and intentional. Both start from the same facts.
The Next Syncs
This is not the end state. The next two things I want to connect are:
- GitHub, so shipped work and repository details can help keep project entries current.
- Obsidian, so notes and ideas I already write can flow into the portfolio instead of waiting in a separate system.
I do not want to automate every thought into a public page. I still want an editorial step. But I do want fewer places where useful information can quietly become stale.
For now, getting the portfolio, CV page, and PDF onto one content collection is a very satisfying first win.