Lukas has been writing web code since PHP 3.0 was hot, and the trajectory of his career reads like a compressed history of server-side rendering: raw PHP, Smarty, Template Toolkit, Jinja, Django templates, then the JavaScript SPA era he opted out of entirely. Two years into Zig, he's circled back to HTML generation — and the result is zt, a templating library that transpiles JSX-like .zt files into plain Zig code at build time. The core trick is that templates become real Zig source files during zig build. That means your template can import your app's structs, and your app code can import the template. If you pass a string where the template expects a ?User, the compiler rejects it. If you fat-finger u.nmae instead of u.name, you get a standard Zig compiler error pointing at the generated line, with a comment mapping back to your template source. This is not runtime template rendering with error pages — it's compile-time structural verification of your HTML output. The design leans hard on two Zig properties: comptime metaprogramming (which makes the high-level template syntax possible without runtime cost) and arena allocators (which make string-heavy web work manageable in a language with manual memory). The generated code just writes to a std.io.Writer — no intermediate DOM, no buffer allocation, no template object. You can point it at a socket or a fixed buffer. Security defaults are opinionated and correct. All dynamic values are HTML-escaped in both text and attributes. URL attributes like href and src are checked for dangerous schemes. Raw HTML output requires an explicit {!value} opt-in, making unescaped output visible in code review. The parser enforces properly closed elements, so you can't accidentally ship broken markup. It won't catch everything, but it removes the XSS vectors that actually bite people in production. The lineage here is explicit. Lukas credits Ziex by Nurul Huda for proving that JSX-style syntax was possible in Zig, and Go's Templ for the transpile-at-build-time architecture. The component model — reusable templates passed as values, @children for layout wrapping — covers what template inheritance does in Django or Jinja without the runtime dispatch. Control flow is just Zig: if, for, switch with payload captures, all compiling down to sequential writes. One design question remains genuinely open: block-level control flow currently uses bare Zig keywords, which means a line starting with "if you forgot your password" is a parse error. Lukas is considering @if/@for/@switch syntax (à la Razor or Twirl) to remove the ambiguity, and has an open GitHub issue soliciting input. It's a real tradeoff — cleaner parsing versus noisier templates — and the project is young enough that community input could shape it. The library ships with a TODO app example built on Dusty (Lukas's HTTP framework) using htmx for interactivity. Multiple people are reportedly using it already, though Lukas is upfront that it's not mature. The ambition is clear: full-stack Zig web development where the compiler catches your template bugs before the browser ever loads.