www — vincent.demeester.fr
Personal website and activity stream.
Architecture
org files (Emacs) → ox-tufte → site/*.html → soupault → build/ → rsync → carthage
↑
flux generate (Go) → flux/ (entries, feeds, HTML) ──→ build/flux/
Two pipelines merge into build/:
- Org content: org-mode → ox-tufte HTML → soupault (CSS/JS injection, plugins) →
build/ - Flux stream: Go CLI fetches sources → renders HTML + feeds →
build/flux/
Static assets (images, data) are copied directly to build/.
Key Directories
site/— soupault input (handwritten pages + copies from root). Gitignored except:index.html,about.html,sandbox.html,posts/index.htmlbuild/— soupault output, the actual deployed site. Gitignored.flux/— flux tool output (entries.json, HTML, feeds).entries.jsonis tracked in git.cmd/flux/,internal/flux/— Go source for the flux CLI toolplugins/— soupault Lua pluginsscripts/— deploy script + NixOS service config- Root
*.html,articles/,posts/, etc. — org-exported content (source of truth)
Flux Tool (Go)
6 sources, ~936 entries:
- GitHub merged PRs + opened issues (search API)
- GitHub releases (tektoncd + vdemeester orgs)
- Git log (page new/updated)
- TIL (
~/desktop/org/til.org) - Bookmarks (
~/desktop/org/bookmarks.org) - Mastodon (fosstodon.org/@vdemeester — posts + boosts)
Output: flux/entries.json (store), flux/index.html (latest 50), year archives, tag pages, JSON+Atom feeds, content-only feeds, homepage snippet.
Build: go build -o bin/flux ./cmd/flux/
Run: ./bin/flux generate -v
Soupault Plugins
All pages go through soupault which injects:
- CSS (
style.css) + JS (flux.js) + viewport meta - Theme toggle (☀️/🌙) in floating
.site-controlspill - Navigation links (⌘ ≋ ☉) in the same pill
- Consistent footer with feed links
- Heading slug anchors (§)
- Callout transforms, tag pills, link timestamps
- Strips old CSS (tufte.css, etc.)
- Fediverse creator meta tag
Build Pipeline
make build runs:
flux generate— fetch sources, render flux outputpopulate-site— copy root HTML tosite/(skip files already there)inject-snippet— insertflux/home-snippet.htmlintosite/index.htmlsoupault— processsite/→build/- Copy static assets + flux output →
build/
make deploy = make build + rsync build/ → carthage.vpn
Important Notes
- Don’t edit
site/index.htmlwithout the<!-- FLUX_SNIPPET -->placeholder — the Makefile injects the flux snippet there populate-siteskips existing files — handwrittensite/*.htmlpages won’t be overwritten by root copiesentries.jsonis version-controlled — TIL/bookmark entries persist across server runs where org files aren’t available- Slug algorithm must match soupault’s —
slugify()in Go uses[^a-z0-9] → hyphen(same asheading-slugs.lua) - Old root HTML files are source content (org exports) — don’t delete them
- Deploy target:
carthage.vpn:/var/www/vincent.demeester.fr