MkDocs Material static site. Source in docs/, config in mkdocs.yml.
docs/blog/posts/<slug>/index.md— blog posts (MkDocs blog plugin)docs/projects/index.mdis a single scrolling page — one##section per project, written directly in that file (not the blog plugin)docs/projects/posts/<slug>/still holds each project's images, referenced fromprojects/index.mdasposts/<slug>/<file>docs/stylesheets/—extra.css(site tweaks), pluspresent.cssdocs/javascripts/—mathjax.js(math config),present.js(slide mode), and the vendored MathJax runtime (tex-mml-chtml.js+output/fonts)
Home | Projects | Blog
- One
blogplugin instance, forblog/, usingpost_url_format: "{date}/{slug}"with archive.projects/is a single hand-written page, not managed by the blog plugin. - Post URLs derive from the H1 title, not the folder name
- Google Analytics: G-V55C7EE2NV
- MathJax is vendored, not loaded from a CDN —
docs/javascripts/tex-mml-chtml.js(v3.2.2) plus its fonts underdocs/javascripts/output/. MathJax resolves font paths relative to its own script, so thatoutput/tree has to stay next to it. To upgrade, re-download both fromunpkg.com/mathjax@<exact-version>/es5/. - glightbox plugin for image lightboxes
Front matter needs date.created and categories. Put a <!-- more --> after
the opening paragraph — without it the blog index renders the entire post
instead of an excerpt. draft: true keeps a post off the built site while still
showing it under mkdocs serve. New projects are added as a ## section in
docs/projects/index.md, no blog front matter needed.
Unfinished posts live in backup/drafts/{blog,projects}/<slug>/, outside
docs/ so MkDocs never sees them at all. Move a folder back under docs/ to
resume work on it.
backup/ is gitignored: the repo is public, and half-finished writing should
not be. That means drafts are not version-controlled or synced between
machines - they exist only on this disk, so back them up yourself.
present.js turns any page into a slide deck — Slide show button (bottom
right) or ++shift+p++. Every ## starts a slide, a --- splits one further,
and everything before the first ## is the title slide. Nodes are moved into
the overlay rather than cloned, so MathJax and live widgets survive. The button
is hidden on blog/archive/category listings and on pages with no ##.
Writing implication: short sections with one idea each present well and read well; a wall of prose makes a poor slide.
Opt a page out even if it has ##s (e.g. ## used just for section breaks,
not slide-worthy content) by tagging any element with .no-present, e.g.
# Heading {: .no-present }.
uv sync— deps inpyproject.toml,uv.lockcommitteduv run mkdocs serveto preview locallyuv run mkdocs build --strict— catches broken links and bad config- Deploy: pushing
mainbuilds and publishes via.github/workflows/deploy.yml. Requires Settings → Pages → Source: GitHub Actions; thegh-pagesbranch is no longer the source. mkdocsis pinned below 2.0, which removes the plugin and theming systems with no migration path — theblogandglightboxplugins depend on it.