@anja.codes/vitakit
@anja.codes/vitakit
Your academic website and CV, from one set of files. Write your CV once, as YAML, Markdown and BibTeX; vitakit makes a static website from it and a typeset LaTeX CV — kept in sync, validated, and yours to change.
pnpm create @anja.codes/vitakit my-site
cd my-site && pnpm install
pnpm dev # the website, at http://localhost:3000
pnpm pdf # cv-tex/cv.pdf, from the same data
pnpm vitakit status # what is in the project, and where it appears
Documentation: vitakit.anja.codes — a
tutorial from an empty directory to a
published site, concepts,
how do I …?, and references for the
command,
content,
website and
PDF. The source is in docs/.
What it does
content/
profile.yml name, affiliation, links, menu, footer
<section>.yml education, employment, teaching, talks, …
publications.bib grouped, linked publication list
pages/*.md prose pages, mathematics and images included
schemas/<section>.ts optional: what a section of your own may contain
app/pages/*.vue which sections each website page shows
cv-tex/<document>.tex which sections each PDF shows; cv-tex/<document>.yml selects entries
- Validated content. Every file is checked against its schema. A broken
file fails the build, naming the file, the entry and the field; during
nuxt devit is reported in place, and fixing it recovers without a restart. - Nothing content-related in the browser. Markdown, mathematics (KaTeX) and citations (citation-js) are rendered at build time into static HTML.
- Private stays private. Entries marked
cvorprivatenever reach the website, andpnpm checkverifies that none did. - The PDF is LaTeX you own:
cv-tex/cv.texorders sections, Eta templates write entries,latexmktypesets — no-shell-escape, no Python. - The
vitakitcommand shows what is where (status,explain), checks everything without building (validate), and sets up sections, fields and pages (add,customize), showing every change before it makes it.
To use it in an existing Nuxt project:
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@anja.codes/vitakit/nuxt'],
})
Development
pnpm install
pnpm check # typecheck, build, tests, and the scaffolded example
pnpm docs:dev # the documentation site
To release, set one version everywhere it must match, commit, and push a tag:
node scripts/release.mjs set 0.2.0, then git tag v0.2.0 && git push --tags.
The Release workflow checks the versions, runs pnpm check, and publishes
both packages to npm with trusted publishing.
The creator lives in create/; its output is kept in
examples/scaffolded, regenerated by pnpm example
and verified in CI, so it cannot drift from the package.
Not yet implemented: cover-letter helpers (\vitacount, \vitafirst), a
second theme, and a Typst target.
MIT
Related Packages
Scaffold a vitakit project: an academic website and a LaTeX CV from one set of f...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.2.0 | ^3.0 | MIT | |
| 0.1.0 | ^3.0 | MIT |