I wanted a photo gallery that was just files. No database, no PHP relic, no SaaS lock-in — point a server at a directory tree of images, get a fast website. Nothing did quite what I wanted, so in late August 2025 I started Tenrankai (展覧会 — “exhibition”): a flat-file gallery, blog, and CMS server in Rust on Axum.

The first commit landed August 21. The first ten days were a sprint, and the commit log reads like a time-lapse:

  • Days 1–2: the gallery core — directory walking, image resizing with a disk cache, masonry layouts with dynamic viewport sizing, folder previews, breadcrumbs, and Liquid templating.
  • Day 2 (continued): EXIF extraction into per-image metadata, JSON APIs behind template partials, composite Open Graph preview images, WebP handling, 2× display support, and cache pregeneration — plus a systemd unit, because it was already running my site by then.
  • Day 3: GPS parsing, typed errors, a license, and CI.
  • Day 3 (evening): an entire markdown blog engine with hot reload.
  • Day 4: “A whole login system” — passwordless email login plus WebAuthn passkeys. No password column anywhere, because there are no passwords and no database.
  • Day 5: the image pipeline split into composable stages, and full AVIF support with HDR gain maps — the Apple-style HDR rendering that makes photos pop on modern displays, served as ordinary files.
  • Days 6–10: Docker builds, multiple template directories for overriding built-in templates per site, and regeneration of missing cache formats.

The design rules that emerged in that sprint still hold: everything on disk is the source of truth (images, markdown sidecars, TOML config), templates are overridable per site, and the server watches and hot-reloads rather than demanding restarts.

It’s open source under Apache 2.0 — tenrankai.com and GitHub.