Clone this repository
For self-hosted knots, clone URLs may differ based on your setup.
Download tar.gz
- Add @page-tags metadata to 39 blog posts across 10 tags (ai, docs-ci,
meta, notebooks, ocaml, odoc, plugins, teaching, tessera, weeknotes)
- Generate tag pages with post lists via gen_blog_index.exe
- @page-tags plugin now uses resolved odoc references for chip links
instead of hardcoded URLs
- gen_atom.ml: deterministic timestamps, CLI args, UTF-8-safe truncation
- gen_rules.ml: add markdown generation phase (@markdown alias), atom.xml
and tag page diff rules under @runtest
- Include weeknotes-2026-15 in blog indexes
- Skip dotfiles in blog scanner (fixes Emacs lockfile crash)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Page_tags now uses register_with_link so it gets access to the
cross-reference environment at link time. For each tag, it calls
Env.lookup_page_by_path with (TCurrentPackage, ["tags"; tag]) to
verify that a corresponding tag page exists under site/tags/.
If the lookup fails, the build crashes with a clear message:
@page-tags: no page found for tag 'foo'. Create
site/tags/foo.mld before using this tag.
This enforces the invariant that tag chip links always resolve —
you can't use a tag until you've created its index page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The inline-extensions CSS (margin-note, kbd) was registered as a
separate support file (extensions/inline-extensions.css) but the
shell's page <link> only referenced extensions/jon-shell.css — so
margin notes rendered with no styling.
Fix: concatenate inline_extensions_css into the jon-shell.css support
file at registration time. The shell's existing <link> now picks up
both the shell styles and the inline-extension styles in one request.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>