Personal site rebuilt from scratch — zero JavaScript frameworks, one CSS file, compiled to a native binary.
Goals#
Fast page loads with no framework overhead in the browser. Clean URLs served directly from a native binary with no JVM startup time. Static fonts bundled as assets with immutable cache headers.
The constraint was intentional: every feature had to be justified. Keyboard navigation, WCAG AAA contrast, semantic HTML — added because they improve the experience, not because a framework included them by default.
Stack#
| Layer | Technology |
|---|---|
| Server | Quarkus 3.37 with Qute Web |
| Templating | Qute (file-based routing via templates/pub/) |
| Content | Markdown with CommonMark + GFM tables |
| Runtime | GraalVM native image |
| Fonts | Commit Mono · 0xProto, self-hosted as woff2 |
| Hosting | Fly.io |
Interesting parts#
Native binary. GraalVM compiles the entire application — server, templates, fonts, CSS — into a single statically-linked binary. Cold start is under 10ms.
Markdown pipeline. Content lives in a content/ directory at the project root. A ContentService reads files from the filesystem in dev (instant hot-reload, no Quarkus restart) and from the classpath in production. CommonMark handles rendering.
Keyboard hints. Holding Shift shows numbered badges on every visible link. Press the number to navigate. Uses e.code (physical key) instead of e.key to correctly handle Shift+1 as digit 1, not !.
WCAG AAA contrast. The --muted color token is 7.1:1 against the background in light mode and 7.0:1 in dark mode, meeting the AAA threshold. Decorative elements use --subtle, which is excluded from informational or interactive text.
No FOUT. font-display: block on Commit Mono keeps text invisible until the font loads rather than swapping from a fallback. Combined with fetchpriority="high" preloads and immutable cache headers, the font is ready before first paint on repeat visits.