Changelog
What changed in each release of @anja.codes/vitakit and @anja.codes/create-vitakit, which are always released together with the same version. To update a project, see Updating vitakit: vitakit migrate makes most of the changes a new version needs. The same notes are on GitHub.
0.3.0 — 2026-10-27
Publication lists
Which publications are shown, in what order and in which groups is now declared once per list in content/publication-lists.yml. A page or a PDF only says where a list goes and under which heading, so the same list shows the same publications on the website and in the PDF:
# content/publication-lists.yml
recent:
limit: 3<VitaPublications list="recent" title="Recent publications" />\vitapublications[Recent publications]{recent}- Select with
where(any BibTeX field;keywordsmatches one of an entry's keywords),keys(exactly these, in this order),since/untilandlimit. - Sort by date (default), year, title, source or any field.
- Group by status, year or any field; entries without it go under
otherLabel("Other"). vitakit status,vitakit explain publicationsandvitakit explain publication-list <name>say what each list selects, what each setting removed, the citation keys left, and where it is shown. A misspelt status, field or citation key is an error naming the list.- New projects declare
all(grouped by status, on/publications/and in the PDF) andrecent(the three newest, on the home page).
New commands
vitakit add publication-list <name> | declares a list and shows it on a page or in a PDF, asking what it should select if no options are given; checked against publications.bib before anything is written |
vitakit migrate | updates a project written for an earlier vitakit, showing every change and asking before writing; --dry-run only shows; safe to run again |
Updating from 0.2
pnpm add @anja.codes/vitakit@latest
pnpm vitakit migrate --dry-run # see what would change
pnpm vitakit migrate # make the changes
pnpm vitakit validateStep by step, with what may look different afterwards: Updating vitakit.
Breaking changes
vitakit migrate converts all of these, except where noted:
<VitaPublications>takeslistandtitleonly.groups,headings,where,limit, … on the page fail the build; declare a list instead.\vitainput{publications}is replaced by\vitapublications[Heading]{list}, andpublications.groupsin a document's.ymlby a list.schemas/publications.ts:groups/defaultGroupare nowstatuses/defaultStatus.usePublications()is replaced byusePublicationList('<list>').migratepoints to each use, but you change it by hand.- Copies of
VitaPublications.vueorpublications.etamade withvitakit eject/customizeneed updating by hand;migratelists them. - PDF order: publications in a PDF now follow the list's order, as on the website: newest first, then the order in
publications.bib. Before, biblatex sorted them by year and then author. Each group is numbered from 1. vitakit explaintakes the kind first when a name is shared, asadddoes:explain section talks,explain document cv,explain publication-list recent,explain page cv.--sectionand--documentare gone. A name alone still works while it is unique.
Fixes
- A syntax error in a project's TypeScript file (e.g.
schemas/*.ts) names the line, shows the code with a caret, and hints at a missing comma. - A
schemas/publications.tsthat does not load is reported as such, without follow-up errors about statuses. - The diff of a planned edit shows each change with its own context, instead of one block from the first changed line to the last.
- Help text that starts with an example keeps its indentation.
create-vitakit: the SSH/rsync deployment preset uses GitHub Actions (.github/workflows/rsync.yml) instead of Forgejo Actions.
Docs
Publications have their own place throughout: a feature on the home page, a section in the concepts, a "Publications and lists" page, and tutorial chapter 4 rewritten around lists. "Updating vitakit" walks through updating. The tutorial's customization chapter and the explanations of schemas and file paths were made easier to read (#16).
0.2.0 — 2026-10-19
The vitakit command
One command answers questions about a project and makes the common changes, showing every change before it is made:
vitakit status | every section, where it appears on the website and in the PDF, what is wrong |
vitakit explain <section|document|/route/> | where it comes from and where it goes; --field prints lines that show a field |
vitakit validate | everything a build checks, without building or LaTeX |
vitakit add section <name> | the file, a schema drafted from its entries, one line on a page and in a PDF |
vitakit add field <section> <name> | one more field a section accepts |
vitakit add page <name> | a page that can show sections, in the menu |
vitakit customize <section> | a component, a PDF template or a schema of your own |
vitakit pdf | build the PDFs (concise output; TeX's own error on failure) |
vitakit verify | check the generated website |
vitakit eject <file> | take over a shared component, the citation style or the LaTeX class |
Breaking changes
- Scripts.
build:cvis nowpdf,check:staticis gone. In an existing project'spackage.json:json(npm:"pdf": "vitakit pdf", "check": "pnpm typecheck && pnpm generate && vitakit verify"npm run typecheck && npm run generate && vitakit verify.) - Binaries.
vitakit-build-cvandvitakit-checkare removed; usevitakit pdfandvitakit verify.--no-pdfis--tex-only. - Commands.
vitakit add <name>isvitakit add section <name>;vitakit listisvitakit eject --list; ejecting a schema isvitakit customize <section> --schema --copy(publications:vitakit customize publications); ejecting a template isvitakit customize <section> --pdf. linkedreplacesinstitutionandlink. Every "name that may link" is{ label, url? }. YAML may still write{ name, url }; code reading.name(e.g.profile.affiliation.namein a page) must read.label. Schemas importinginstitutionorlinkimportlinked(andrequiredLinkfor links that need a URL). The context-line part kind is'linked',INSTITUTION_FIELDSisLINKED_FIELDS.
New
VitaSectiontakeswhere(likewherein a PDF document's.yml) andtitle(heading and anchor, hidden without entries). The scaffold'scv.vueis one<VitaSection id title />line per section, andcv.texwrites headings inline,\vitasection[Heading]{id}.wherevalues may be numbers; an entry's ownyearfield wins over the year of its date.- One broken schema no longer hides the other sections during development.
- The LaTeX class uses T1 font encoding under pdfLaTeX, so „, ł, ő and similar characters typeset.
- Shared helper
asLinkedListfor templates.
To update a 0.1 project, see From vitakit 0.1.
0.1.0 — 2026-10-04
The first release.