sites/tobias.raayoni-last.com
2026-10-07 16:51:17 +03:00
..
content pruned, moved mutantenkino 2026-10-07 16:51:17 +03:00
plugins fix: recover one hotlinked image, retire the other eleven 2026-10-06 11:04:28 +03:00
raayoni feat: add favicons for all three sites 2026-10-06 09:04:50 +03:00
Makefile Three sites, one directory each 2026-10-05 20:54:45 +03:00
pelicanconf.py fix: recover one hotlinked image, retire the other eleven 2026-10-06 11:04:28 +03:00
publishconf.py Three sites, one directory each 2026-10-05 20:54:45 +03:00
README.md Three sites, one directory each 2026-10-05 20:54:45 +03:00
tasks.py Three sites, one directory each 2026-10-05 20:54:45 +03:00

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.