@anja.codes/vitakit

Structured CV data in, academic website and LaTeX CV out.
1
Install
npm install @anja.codes/vitakit
Latest Version:0.2.0
Vue:3
License:MIT
Last Updated:Oct 23, 2026
Links: GitHub  ·  npm
Maintainer: behackl

@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 dev it 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 cv or private never reach the website, and pnpm check verifies that none did.
  • The PDF is LaTeX you own: cv-tex/cv.tex orders sections, Eta templates write entries, latexmk typesets — no -shell-escape, no Python.
  • The vitakit command 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

@anja.codes/create-vitakit

Scaffold a vitakit project: an academic website and a LaTeX CV from one set of f...

223
@privyid/nuxt-csrf

Module CSRF for NUXT

26,088 9
mixpanel-nuxt

Mixpanel module for Nuxt

19,992 7
vatex

A plugin of vue latex(base on katex), support vue2 and vue3

11,153 47
nuxt-radash

radash for Nuxt

10,601 20

Version History

Version Released Vue License
0.2.0 ^3.0 MIT
0.1.0 ^3.0 MIT