This site is itself a small engineering artifact, not just a container for one. Here's how it's actually built.

01 Stack

Built with Zola, a Rust static site generator — content in Markdown/TOML, templates in Tera. No JavaScript framework, no bundler, no build step for the frontend beyond Zola's own Sass compilation — no npm dependency tree to audit or update either, since Zola's own pipeline (Sass, cache-busted asset URLs) already covers what a bundler would otherwise be for. Every script under static/js/ is plain vanilla JS, self-guarding (if (!el) return;) so it's safe to load unconditionally on every page rather than being conditionally included per page type.

The theme has a name for itself, internally: "Workshop Ledger" — a design system built around specimens, stamps, mask bars, and a guide-rail table of contents, all sharing one small set of Sass tokens.

Deployment is a GitHub Actions workflow: push to main, it installs Zola, runs zola build, and FTP-deploys the output. No manual step, no server to manage beyond that. The source — every template, Sass partial, and static/js/*.js file behind this page — is public: github.com/rinekri/blog.

02 The generative marks

Every fingerprint-like mark on this site — the flat scatter on post/project/tag cards, the wide banner on a post's own header, the composite strip on each archive year, the polar ring around the photo on /about/, the flow-field on the home page — comes from one small shared PRNG core: an FNV-1a string hash feeding a mulberry32 generator. The same seed always produces the exact same mark, deterministically, with no server round-trip and no stored image — it's drawn fresh on every page load from a few bytes of seed text.

Different contexts use different drawing functions tuned for their shape and density (a 200×88 card mark reads very differently than a full-width hero banner drawn with the same technique), but they all share the same PRNG core and the same "seed in, deterministic mark out" contract.

"zola"
"tera"
"fnv-1a"
"mulberry32"
"colophon"

Five seed strings, one drawing function (drawFingerprint() in static/js/fingerprint.js). Reload this page and every one of them redraws pixel-identical — the seed text is the only input.

03 Try it

The exact same core, live: type anything below and drawFingerprint() redraws the canvas from your text as you go — client-side, no server round-trip, no image stored anywhere.

The same core also draws the polar portrait ring on /about/ — angle and radius around a fixed center instead of scattered x/y, a different drawing function for a deliberately different subject, but the same PRNG underneath.