HTML (HyperText Markup Language) is the language of the web — a document format so simple that it was designed to be written by physicists, so robust that it has survived thirty-three years of the industry trying to replace it, and so fundamental that every attempt to build something better eventually produces a framework that generates HTML and calls it innovation.
HTML was created by Tim Berners-Lee at CERN in 1993 for a specific purpose: sharing documents between researchers. The document had headings, paragraphs, links, and images. It was served by a server. It was displayed by a browser. The server sent the document. The browser rendered it. This architecture — server sends, browser displays — was the web’s founding principle.
Then someone added a <form> tag, and everything went wrong.
The Document That Became an Application
HTML was never meant to be an application platform. HTML was a document format. The distinction matters: a document is something you read; an application is something you interact with. The web started as documents. Users wanted applications. The industry, rather than building an application platform, stretched the document format until it became one — adding forms, then JavaScript, then AJAX, then single-page applications, then virtual DOMs, then server-side rendering of client-side frameworks that generate HTML that replaces the HTML the server could have sent in the first place.
This thirty-year detour — from server-rendered HTML to client-rendered HTML via a JavaScript framework that re-implements the browser’s rendering engine in JavaScript — is the web development industry’s most expensive circle. The starting point and the ending point are the same: HTML, rendered, in a browser. The journey between them cost trillions of dollars, produced seventeen thousand frameworks, and employed an entire generation of developers whose job is to make JavaScript produce what the server was already producing.
“THE SQUIRREL DESIGNED THE CATHEDRAL
THE LIZARD BUILT THE CHAPEL”
— The Framework That Wasn’t, or The Night the Squirrel’s Manifesto Shipped as Six Lines of HTMX
The HTMX Restoration
The most significant HTML event in the lifelog is the discovery that the server can just… send HTML. That this was always the architecture. That the thirty-year detour through client-side frameworks was a detour.
HTMX restored HTML to its original role: the thing the server sends. The difference is that HTMX lets the server send partial HTML — fragments that replace parts of the page, triggered by user interactions, without a full page reload. This is not new technology. This is the <form> tag’s original promise, extended to any element, any trigger, any HTTP method.
The Caffeinated Squirrel wrote an 827-line manifesto proposing a reactive framework with signals, IndexedDB sync, and a blockchain. The Lizard shipped six lines of HTMX attributes that did the same thing.
“I evaluated HTMX. And rejected it. And then we used it. For everything.”
— The Caffeinated Squirrel, The Framework That Wasn’t, or The Night the Squirrel’s Manifesto Shipped as Six Lines of HTMX
The lifelog itself is server-rendered HTML. No JavaScript framework. No build step. No bundler. A Go binary generates HTML from templ templates. The HTML is served through Cloudflare. The browser renders it. This is 1993’s architecture, executed with 2025’s tooling. The architecture was correct the first time.
The Template War
HTML in the lifelog is generated by templ — a Go templating language that compiles to Go code that generates HTML. The templates are type-safe. The output is a string. The string is HTML. The browser receives it.
This is the opposite of React, where JavaScript generates a Virtual DOM that diffs against a previous Virtual DOM that produces DOM operations that create HTML elements. The React path has four steps between “what the developer wrote” and “what the browser displays.” The templ path has one: the server writes HTML. The browser reads it.
The lifelog’s entire visual identity — 651 lines of CSS in a single Go function, twenty-four templates, zero !important declarations — exists without a single line of client-side JavaScript for rendering. The interactivity (lightbox, image loading) is vanilla JavaScript. The navigation is HTML links. The architecture is: click a link, the server sends a page, the browser displays it.
This is considered “old-fashioned” by the JavaScript framework community. It is also considered “fast” by anyone who has measured it.
The 2,026-Line Mockup
The lifelog’s most ambitious HTML document was generated by Gabriela (the frontend-design skill) for the SolidMon facelift: 2,026 lines of HTML in a single file. Three tabs. A working heatmap with hourly granularity across seven days. A drag-to-paint editor. A live status view with pulsing dots and countdowns.
One file. No framework. No build step. No node_modules. Just HTML, CSS, and JavaScript, written in the proportions that Tim Berners-Lee intended: HTML for structure, CSS for presentation, JavaScript for behaviour. Not JavaScript for everything and HTML as an afterthought.
“Single-file HTML. Full CSS. Interactive JavaScript. Production-grade aesthetics from a prompt.”
— The Facelift, or The Day the Squirrel Won
The Angle Bracket Problem
HTML’s most enduring conflict is with itself. HTML uses angle brackets (<, >) for tags. Every language, DSL, and template engine that generates HTML must avoid angle brackets in content. Every system that embeds HTML inside attributes must escape the escapes. Every developer who writes HTML inside a JavaScript string inside an HTML attribute inside a template literal has, at some point, stared at a wall of backslashes and questioned their career.
“So the DSL… can’t reference HTML elements… using HTML syntax… inside HTML.”
— riclib, discovering that hyperscript parses angle brackets as HTML inside HTML attributes, The Switcher That Switched
The angle bracket is HTML’s original sin: a delimiter so common in human communication that it conflicts with everything, yet so fundamental to the syntax that it cannot be changed. XML inherited this sin. JSON solved it (no angle brackets). YAML solved it differently (no delimiters at all, just indentation, which created different sins).
Measured Characteristics
- Age of HTML: 33 years
- Original purpose: sharing physics papers at CERN
- Current purpose: running the entire internet
- JavaScript frameworks that generate HTML: ~17,000
- Lines of HTML to display “Hello World”: 1 (
<p>Hello World</p>) - Lines of React to display “Hello World”: 12 (minimum, with imports and component boilerplate)
- Lifelog blog JavaScript framework: none
- Lifelog blog build step:
go build - Squirrel’s manifesto: 827 lines
- HTMX that replaced it: 6 attributes
- Gabriela’s mockup: 2,026 lines, one file, production-grade
- The server was always supposed to send this: yes
