My personal site: project write-ups, talks, papers, and a few reflective pieces. A static site built with Pelican and a customized, Tufte-style theme (a narrow reading column with right-hand margin notes).
- Pelican (Python) for static generation.
theme_tufte/— a customized FLEX theme: Tokyo Night palette with a light/dark toggle, Inter + JetBrains Mono, and MathJax for LaTeX.- uv for dependency management (
pyproject.toml,uv.lock). Requires Python 3.11+. ipynb2pelicanfor rendering notebooks (pulled as a submodule when present).
The live site uses GoatCounter — lightweight, privacy-oriented pageview analytics (paths, referrers, browsers, locations). No cookies, no cross-site tracking; bots that identify themselves are ignored.
The tracking script is in theme_tufte/templates/base.html and loads on every built page. Dashboard: casyfill.goatcounter.com.
Hits are sent on page load; the dashboard aggregates them about every 10 seconds (GoatCounter FAQ). Local previews (make serve) count too unless the script is blocked (adblockers often block gc.zgo.at).
git clone --recurse-submodules https://github.com/Casyfill/Casyfill.github.io
cd Casyfill.github.ioInstall dependencies, build, and preview:
uv sync # create .venv and install
make html # build the site into output/
make serve # preview at http://localhost:8000 (make devserver to auto-rebuild)Pushing to master triggers the GitHub Actions workflow
(.github/workflows/main.yml): it builds with uv run pelican ... -s publishconf.py
and deploys the result to GitHub Pages.
content/— pages and posts inWork/,AI/,Personal/,Others/. Folder sets the category, but URLs stay flat and slug-based (/slug/).pelicanconf.py— config and the curatedNAV_GROUPSsidebar.theme_tufte/— the theme (templates/,static/).docs/roadmap.md— what's shipped and what's next.IDEAS.md— unscoped post ideas.