The site is an Obsidian vault published with Quartz 4. Open the repository root as a vault and write markdown in content/; pushing to master rebuilds and deploys.

Frontmatter

Every page starts with a YAML block. Only title is required.

---
title: The title shown at the top of the page
authors:              # bylines; must match a heading on the People page
  - Daniel Boigk
created: 2026-09-13   # publication date — controls blog ordering
description: One sentence used in previews, search and RSS.
tags:
  - category-theory
math: typst           # optional; omit for LaTeX/KaTeX
draft: true           # optional; excluded from the build entirely
---

authors also accepts a single name (authors: Daniel Boigk) or a comma-separated string. Every name becomes a link to the people page, so add yourself there once and the bylines take care of themselves.

Where things go

PathWhat belongs there
content/blog/Dated, signed posts. Filename YYYY-MM-DD-slug.md.
content/notes/Undated reference notes, definitions, work in progress.
content/projects/One page per project, pointing at its real home.
content/templates/Obsidian templates. Not published.
content/private/Anything you want in the vault but not on the web.

Mathematics

Notes may mix Typst and LaTeX freely — that is the default, and it is what our vaults actually look like. Each formula is rendered on its own:

  1. If the source contains a backslash command (\frac, \beta, \mathrm), it is LaTeX and goes to KaTeX.
  2. Otherwise Typst gets first refusal.
  3. Anything Typst rejects falls through to KaTeX.

So both of these work in the same paragraph, with no frontmatter at all:

The Typst $lim_(h -> 0) (f(x+h) - f(x))/h$ and the LaTeX
$\lim_{h \to 0} \frac{f(x+h) - f(x)}{h}$.

The Typst limℎ→0𝑓(𝑥+ℎ)−𝑓(𝑥)ℎ and the LaTeX .

Pinning a page to one engine

frontmatterbehaviour
(none)Typst first, KaTeX fallback. Mixed notes work.
math: typstTypst only. Anything it rejects is shown as an error.
math: latexKaTeX only. Typst is never tried.

Pinning is how you keep a cleaned-up note clean: once a page is pure, math: makes the build complain if someone slips the other syntax back in. See the Typst post for a pinned page and the mixed note for an unpinned one.

Where auto-detection falls down

$1/2$ is valid in both, and the two disagree: Typst stacks it as a fraction, LaTeX leaves it as a slash. Typst wins by default. If you meant the LaTeX reading, write $\frac{1}{2}$ or pin the page with math: latex.

The same goes for any formula with no backslash in it — $x^2$, $f(x)$, $P(A|B)$ are identical either way, but $sin x$ is upright in Typst and italic in LaTeX.

Wypst is global in Obsidian

The Wypst plugin applies to the whole vault, so LaTeX formulas look wrong in Obsidian while Wypst is enabled — and vice versa. The published site does not care: it decides per formula.

Typst inside a LaTeX page

A fenced typst block is always compiled by Typst and never falls back, so a mistake in it shows up as an error rather than being silently reinterpreted:

```typst
sum_(k=1)^n k = (n(n+1))/2
```
∑𝑛𝑘=1𝑘=𝑛(𝑛+1)2

Finding mixed notes

The build prints a line for every note that ended up using both engines:

Mixed math in content/notes/mixed-math.md: 6 formula(s) rendered with Typst, 6 with katex

Use it to work through the vault if you want to make notes pure. Nothing breaks if you never do.

TikZ

A fenced tikz block, containing its \usepackage lines and a complete document:

```tikz
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
A \arrow[r, "f"] \arrow[d, "g"'] & B \arrow[d, "h"] \\
C \arrow[r, "k"'] & D
\end{tikzcd}
\end{document}
```
ABCDfghk

tikz, tikz-cd, circuitikz and pgfplots are available. Diagrams are compiled once and cached by content hash in site/.tikz-cache; commit that directory so CI does not recompile everything.

The Inline TikZ plugin renders the same blocks live in Obsidian.

Tabs

The tabs block from the Obsidian Markdown Tabs plugin works here too:

````tabs
tab: Julia
```julia
f(x) = x^2
```
tab: Python
```python
def f(x): return x**2
```

## Links and callouts

Wikilinks (`[[people]]`, `[[people|our people]]`), embeds (`![[image.png]]`),
backlinks, the graph view and Obsidian callouts all work as they do in the
vault:

> [!note] Callouts
> 
> `> [!note]`, `[!tip]`, `[!warning]`, `[!todo]`, `[!example]`, … all render.

## Previewing locally

```bash
cd site
npm ci          # first time only
npx quartz build --serve -d ../content
```

Then open <http://localhost:8080>. The server watches `content/` and rebuilds on
save.