کلوفون
Stack
This site is built with Gleam, Lustre, Blogatto's rendering stack (Maud + Mork for Markdown, Jot for Djot), Wisp, Mist, PostgreSQL (via Pog and Squirrel), Nix, Docker, Cloudflare, and a Git-based CMS.
That is an unusual combination. It is unusual on purpose.
Why Gleam
Gleam offers a small, explicit language with a real type system on the BEAM. For a personal site that must survive years of maintenance, that matters more than framework fashion. The compiler is a collaborator, not a nuisance.
Why static-first
Every page starts as pre-rendered HTML. There is no client-side application shell or router. Lustre hydrates only four named islands, and the architecture page opts into one server component whose state lives on the BEAM.
The dynamic surface is tiny: a contact endpoint, a supervised real-time component, and admin-only listing of submissions. Everything else is files on disk, validated at build time.
Why Git-native content
Posts and pages live in content/ as Markdown with TOML frontmatter. The CMS edits those files and commits back to the repository. There is no separate content database, no migration of prose into rows, no second source of truth.
Drafts never ship: the build checks for leaked draft = true entries in production output.
Why typed browser islands
The site works without the browser bundle. Progressive enhancement is compiled from Gleam into native ES modules: theme, contact feedback, clipboard, and search. Browser APIs sit behind a small FFI boundary, while transport values decode into shared domain types.
Trade-offs accepted
- More build-time logic instead of runtime flexibility.
- Explicit bilingual modeling instead of automatic translation.
- A custom static pipeline instead of a turnkey SSG — because the validation requirements are part of the product.
- Slightly slower author onboarding in exchange for inspectable, diffable content.
Footer line
Built with Gleam, Lustre, Wisp, Mist, Blogatto, PostgreSQL, Nix, Docker, Cloudflare, Git-based publishing, and unreasonable care.