Twelve images across seven articles were hotlinked from servers that no longer exist, so they were broken on the live sites. Checked every one against the Wayback Machine, patiently enough to trust the answer: an earlier pass appeared to find seven, but that was a test treating an empty response as a hit. One survives. visualberlin.org's p1010789, a 2011 capture of the projector set up against Mannheim city hall during the Flimmerkiste wildscreening, is now a local asset in flux.vision/content/library/ and the reference points at it. The other eleven were never captured. Both dead domains are archived, so this is not a gap in coverage: of 8,438 visualberlin.org URLs and 204 for mutanten.org, only that one image is there. mutanten.org's archive does not reach back to its fp-content era at all, which is where the Logan's Run stills lived. So lostimages.py learns about dead hosts, which it matches rather than fetching, because a build must not depend on the network and a dead host is a fact about the world rather than about the document. The references stay in the Markdown, as the existing ones do: the reference records what was there. It matters more on the capsule than on the web. A browser shows a broken image as a silent gap, but gemtext has no inline images, so every one becomes a visible => link line and the page would advertise a dead host as somewhere worth going. smolnet.py therefore strips them too, reading the same host list, since it works on the Markdown source and never sees Pelican's output. lostimages.py moves to the repo-level plugins/ directory beside smolnet. It was shared already, with flux.vision reaching into tobias.raayoni-last.com for it, and randogoth.com now needs it too; a shared plugin living inside one site was the wrong shape for three consumers. Left alone deliberately: the two mutanten.org links in mutantenkino-website.md. That entry is about having built the site, so the link is its subject rather than decoration, and a dead link does not make the record wrong. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| content | ||
| plugins | ||
| raayoni | ||
| Makefile | ||
| pelicanconf.py | ||
| publishconf.py | ||
| README.md | ||
| tasks.py | ||
tobias.raayoni-last.com, the professional record
Client work, portfolio, CV. 97 articles and 4 pages, running back to 1999.
The audience is clients, employers and galleries, which is the whole reason this is its own domain: it was sharing a page with a media-arts archive and a devlog, and a page that serves three audiences serves none of them.
Building
uv run --quiet --with pelican --with markdown -- pelican content -o output -s pelicanconf.py
No blog, no feed. This is a record, not a stream.
Disciplines
| Discipline | n | |
|---|---|---|
web |
38 | sites, shops, interfaces |
live |
15 | events run, produced or managed |
motion |
14 | film, trailers, titles |
design |
12 | identity, print, covers |
consulting |
9 | advisory and strategy |
interactive |
6 | installations and interfaces with a public |
cv |
3 | employment history |
The URLs do not carry the discipline. ARTICLE_URL is {slug}.html because this taxonomy has
already been reworked once, and every reassignment would have moved a URL. Slugs are stable;
categories are not.
Theme
raayoni, written for this site. Every Pelican theme is a blog theme and this is not a blog.
A single Muuri grid over everything, filterable and sortable client side, which is why
DEFAULT_PAGINATION is off: paginating would break both. Light and dark, with THEME_DEFAULT set
to dark rather than following the system, and an explicit toggle persisted in localStorage.
SUMMARY_MAX_LENGTH is 18 because most entries have no Summary and Pelican derives one from the
body. The median entry is 34 words, so a tile caption is a first clause rather than an excerpt.
Plugins
assetcheck.py |
flags Thumb:/Background: whose file did not survive, so the template renders a typographic card rather than a broken image |
lostimages.py |
the same for images inside article bodies: 22 of 410 point at files no archive holds |
lostimages.py is shared: flux.vision loads it from here via its own PLUGIN_PATHS.
Both resolve at build time on purpose. Doing it in the browser with an error handler means a visible flash of broken image on a third of the grid.
Traps
Do not add nl2br. The recovered bodies are hard wrapped at about 70 characters, so it turns
every source line into a forced break: 29 across the site, each one mid-sentence. They fall near the
natural wrap, so at desktop width they are invisible and on a phone the paragraph shatters. This was
found by counting <br> in the built output, not by looking at the site.
The references to lost images stay in the Markdown. The reference records what was there. The plugins remove them from the output; nothing should remove them from the source.
Assets
content/library/ 239 files, content/images/ 97. Images are stored at 1600px; the full-size
originals are in the backup named in the repo README, along with the inventory that records why each
article is here rather than on one of the other two sites.