the page you are on: a rust server, a hand-written ascii water simulation, and no front-end framework.
axum serves the pages, minijinja renders the templates on the server, and the blog reads a self-hosted writefreely instance instead of framing it. static directories carry their own cache headers. templates are read from disk at startup and compiled into the binary as a fallback.
there is no client-side router. each page is a document, and every internal link is a normal link.
the landing page is an ascii water simulation drawn into a <pre>. the grid is sized from the viewport, the characters are the pixels, and typing stirs the surface. the same simulation runs dimmed behind the blog, with the landing instance paused while it is off screen.
the artwork is avif. the grain is an inline svg turbulence filter, not an image request.
the host header picks the identity. the personal site keeps the easter eggs, the social links and the blog; the professional mirror hides everything that would tie the two names together. canonical redirects are resolved before a page is rendered, so a request never lands on the wrong identity.
a site about the water should be built out of the same characters the water is made of.