Long-form PDF reports for the Linkup newsletter, typeset in Typst.
| Report | Source | Output |
|---|---|---|
| How to Evaluate Web Search for AI Systems | search-evaluation-guide.typ |
search-evaluation-guide.pdf |
| Why Developers Are Choosing Linkup Over Exa | linkup-vs-exa.typ |
linkup-vs-exa.pdf |
Content sources live alongside the Typst files as Markdown (search-evaluation-guide.md,
linkup-vs-exa.md). The .typ files carry the layout and brand system; the .md files
carry the prose.
Requires Typst 0.14+ (brew install typst). DM Sans and DM Mono are vendored in fonts/,
so --font-path fonts is always required. linkup-vs-exa.typ additionally expects a
system-installed display face — see Fonts.
For the verification steps below you will also want Poppler (brew install poppler), which
provides pdftoppm, pdfinfo, and pdffonts.
typst compile --font-path fonts --root . search-evaluation-guide.typTo watch and rebuild on save:
typst watch --font-path fonts --root . search-evaluation-guide.typBuilt PDFs are gitignored — regenerate them from source. The exception is
linkup-vs-exa.pdf, which is committed (force-added) so the report can be reviewed
without a local Typst install.
| Face | Where it lives | Used for |
|---|---|---|
| DM Sans | vendored in fonts/ |
body copy, tables, card titles, italic pull-quotes |
| DM Mono | vendored in fonts/ |
running header, folios, tracked labels, tags |
| Season Mix | vendored in fonts/ |
display elements in linkup-vs-exa.typ only |
Season Mix is the Linkup brand display face, from Displaay Type Foundry. Everything needed to build is vendored, so a fresh clone compiles both reports with no font installation at all. You can verify that for yourself by disabling system fonts entirely:
typst compile --font-path fonts --ignore-system-fonts --root . linkup-vs-exa.typImportant
Season Mix is proprietary and licensed, not redistributable. Displaay's terms — embedded in the font's own name table — state that you must not "modify, reassemble, rename, store on publicly accessible servers, redistribute, or sell" it. It lives here so the Linkup team can build the reports; this repository must stay private, and the font file must not be copied out of it or passed on to anyone without their own Season licence. Full terms: https://displaay.net/about/licenses/
Two things to know about it:
It ships Regular only. typst fonts --variants reports a single face, Style Normal /
Weight 420 — no bold, no light, no italic. Typst does not synthesize the missing faces: asking
Season for weight: 600 or style: "italic" silently renders plain Regular with no compile
warning. Season is therefore confined to display elements where no weight or italic distinction
is doing semantic work. Anything that relies on bold or italic to carry meaning — every table
cell, card titles, the pull-quotes — stays in DM Sans. Keep it that way when editing.
Its absence degrades rather than fails. This no longer applies to a normal clone, since the
font is vendored — but it matters if the font is ever removed from fonts/, or if a build runs
without --font-path fonts. In that case the build still exits 0 and still produces a complete
13-page PDF; the display elements simply come out in a different face. Typst does emit one
warning: unknown font family: season mix, so it is not literally silent, but nothing fails and
the output is wrong without saying so. Any build that does not treat warnings as errors will
hand you a PDF in the wrong typeface. To keep that outcome harmless, the display font is declared
as a fallback chain rather than a bare family name:
#let display-font = ("Season Mix", "DM Sans")so an environment missing Season falls back to DM Sans — the report's previous typography — instead of Typst's default serif. To confirm a build genuinely used Season rather than the fallback, check the embedded font list:
pdffonts linkup-vs-exa.pdf | rg -i season # expect SeasonMix-RegularProse and layout are separate. Edit the .md file to change what the report says; edit the
.typ file to change how it looks. The .typ files do not read the .md files at build
time — the Markdown is the content source of record, and text is carried across by hand, so
change both when you reword something.
After any edit, rebuild and look at the result. A clean compile is not evidence of correctness: several failure modes in this system produce a valid PDF that is silently wrong.
typst compile --font-path fonts --root . linkup-vs-exa.typ
pdftoppm -png -r 70 linkup-vs-exa.pdf /tmp/page # then open the imagesThe three traps most likely to bite you, all covered in full in the style guide:
- The closing CTA block is positioned with
place(), which reserves no space in the flow. Any body text that lands on its page is rendered underneath it and disappears. Thepagebreak()before it must survive, and the last two pages need a look after any edit that shifts pagination anywhere earlier. - Section headings are deliberately kept unbreakable with only their first paragraph. Wrapping a whole section instead pushes it to a fresh page and leaves a large gap; wrapping nothing strands the heading alone at a page foot.
- Season Mix has no bold or italic, and Typst substitutes Regular silently. Keep anything where weight or italic carries meaning in DM Sans.
report-style-guide.md is the full house style — the brand palette
with contrast measurements, the typography split, page furniture, every reusable helper, the
cover and CTA construction, the pagination rules, and the image-resolution and font-embedding
checks. Read it before making structural changes.
linkup-vs-exa.typ is the current reference implementation: it carries the green palette and the
Season Mix display type. Copy from it when starting a new report.
search-evaluation-guide.typ predates the rebrand — it is still orange throughout and entirely
DM Sans. It remains useful for section archetypes it uniquely has, but do not copy its colours
or font declarations into new work.
Diagrams live in assets/ as SVG so they stay crisp and text-editable; chart raster exports
are PNG. Check the pixel dimensions of any raster asset before embedding it — an oversized cover
image previously made one report 43MB. generate_docx.py produces a Word version of the
evaluation guide when a non-PDF deliverable is needed.
The open-source evaluation framework the search evaluation guide is built around lives at
LinkupPlatform/standard-benchmark.
It is checked out into standard-benchmark/ locally and ignored here.