A Pelican generator that writes a capsule beside the HTML build: plain
Markdown plus per-directory .itsybitsy.toml sidecars, which a protocol daemon
converts per request to gemtext, XHTML-MP, WML or plain text.
The obstacle was recorded in the README as "smolweb reads YAML frontmatter
while Pelican uses bare Title: lines". Both halves turned out to be wrong:
itsybitsy parses no frontmatter at all, by design, and metadata lives outside
the document. So the transform is not a translation between dialects, it is a
removal, and a protocol daemon stays ignorant of one static generator.
Nothing in plugins/smolnet.py is specific to this site. Every difference is a
setting and every setting has a default, so another site enables it with
PLUGINS = ['smolnet']. It sits at the repo root for the same reason
flux.vision reaches into tobias.raayoni-last.com for lostimages.
Index entries are emitted as link-only paragraphs rather than Markdown lists,
which is not a style choice: the gemtext renderer prints a bare => line for a
paragraph holding nothing but links, and a bullet *and* a => line for a list
item, so a list would publish every entry twice. Gemini clients number link
lines themselves, so the board's dial-an-area-by-number idiom survives into
the capsule without emitting a single bracket. The trade-off is in the
docstring: the text renderer reflows such a run into prose, which costs
nothing here because randogoth.com is not getting Nex or Gopher.
Also drops a Zemanta tracking pixel that came in with a 2012 blog import and
is live on the site today, firing a third-party request on every view of that
article. It would have been worse in the capsule, where an image becomes a
visible link line advertising a dead tracker. It was the only one across all
three sites.
Verified by serving the output with the real daemon: 41 articles, 2 pages, 6
area indexes and an archive, no metadata surviving, no {filename} left,
trl@posteo.net revealed on Connect where the renderer would otherwise have
dropped it with its enclosing HTML, images served as image/png, and the index
rendering as a clean run of => lines in gemtext and as XHTML Mobile over HTTP.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| flux.vision | ||
| plugins | ||
| randogoth.com | ||
| tobias.raayoni-last.com | ||
| .gitignore | ||
| justfile | ||
| README.md | ||
sites
Three domains, one directory each, one audience each.
| Directory | Domain | Subject | Audience |
|---|---|---|---|
flux.vision/ |
flux.vision | Kiritan Flux: media arts, VJ, performance, installations, 2003-2021 | festival and art world |
tobias.raayoni-last.com/ |
tobias.raayoni-last.com | client work, portfolio, CV | clients, employers, galleries |
randogoth.com/ |
randogoth.com | the technical work, six areas | devs, retro and small-net readers |
They were one site until October 2026. The split is the fix: four audiences were being handed one page, and a page that serves four audiences collapses into the only format that can hold unrelated things, which is a dated list.
sublunar.space is deliberately not here. It is a working blog with nine years and 440 commits of
its own voice, and it keeps its own repo.
Building
All three are Pelican, with no shared build. Each stands alone:
cd flux.vision # or tobias.raayoni-last.com, or randogoth.com
uv run --quiet --with pelican --with markdown -- pelican content -o output -s pelicanconf.py
Each directory has its own README covering its theme, its taxonomy and the traps specific to it.
| articles | theme | notes | |
|---|---|---|---|
flux.vision/ |
90 | flux |
recovered from the Wayback Machine; closed, maintained not updated |
tobias.raayoni-last.com/ |
97 | raayoni |
grid of tiles, light and dark |
randogoth.com/ |
41 | bbs |
an ANSI bulletin board, 80 columns; mc-pelican is the fallback |
Deployment
Built and served on bucur. A push triggers a webhook that builds the changed site and rsyncs it
into place. Content does not trigger a system activation: the site derivations are flake packages,
so a typo costs a Pelican run rather than a nixos-rebuild switch.
Shared conventions
- No em dashes. Commas, colons, full stops or
·. - Flat slugs.
{slug}.htmlon all three. Categories get reworked; slugs should not move. - No
nl2br. The recovered bodies are hard wrapped at about 70 characters, so it turns every source line into a forced break. This has been fixed twice; do not add it back. - Lost images are handled at build time, not in the browser. The references stay in the Markdown
because the reference records what was there;
plugins/lostimages.pystrips them from the output. - Check the built output, not the source. Several bugs here were invisible at a glance and obvious to a counter: forced line breaks that fell near the natural wrap, box drawing a column short, a config change that silently emptied every hotkey.
The working material
The inventory, the recovery pipelines, the pruned articles, the source archives and REFACTOR.md
live outside this repo, at /mnt/data/Backup/sites-restructure-2026-10-05/. A clone is the three
sites, not the argument that produced them.
That backup is worth keeping: the sort is not reproducible from the sites alone. inventory.tsv
records why each of 266 articles went where it did, and _pruned/ is the only record of what was
taken out.