The web was built on hypermedia. We broke it with SPAs.
It's time to fix it
What SPAs Broke
SPAs turned the browser from a hypermedia client into a JavaScript runtime. The result:
DEVELOPER SUFFERING
Build tools, bundlers, hydration, RSC, islands... a tower of complexity to solve problems we created. You shouldn't need a PhD in webpack to ship a form.
CORPORATE CAPTURE
React is Meta's. Next.js is Vercel's. Your "open" stack locks you into their cloud, their tooling, their pricing page. The web was meant to be yours.
INACCESSIBLE
Screen readers choke on virtual DOMs. Buttons that aren't buttons. Forms that don't submit. We broke the web for everyone.
BLOATED BUNDLES
2MB of JavaScript to render a list. Your users are on mobile. They notice.
BROKEN URLs
Routes that don't work without JavaScript. Try sharing a link. Go ahead.
FRAGILE STATE
Client-side state management is an entire career. Redux, MobX, Zustand, Jotai — we invented solutions for problems we created.
"We took the most successful hypermedia system in history and replaced it with distributed state machines running in hostile environments."
The Manifesto
Like the Agile Manifesto — we value the items on the left more than the items on the right.
The server should return documents, not data blobs for the client to assemble. HTML is the universal format — every browser, every screen reader, every LLM understands it.
The server knows the state. The server is the state. Stop duplicating it in Redux, syncing it, debugging drift, and pretending client-side state is simpler.
The web works without JavaScript. Forms submit. Links navigate. Your app should respect that. JavaScript is for enhancement, not existence.
Every view should have a URL that works when shared, bookmarked, or crawled. If your route only exists in JavaScript, it doesn't exist.
The browser already knows how to follow links, submit forms, and render HTML. Let it. We don't need to rebuild the browser in JavaScript.
How Hypermedia Works
The server sends HTML with built-in controls — links and forms. The browser follows them. That's the whole architecture.
SPA: 8 steps to render
- 1. Download JS bundle (2MB)
- 2. Parse & execute JavaScript
- 3. Initialize framework runtime
- 4. Mount component tree
- 5. Fetch data from API (JSON)
- 6. Parse JSON, update state
- 7. Reconcile virtual DOM
- 8. Patch real DOM
Hypermedia: 2 steps
- 1. Browser requests URL
- 2. Server returns HTML. Done.
For updates, HTMX sends a request and swaps the HTML fragment the server returns. Same two steps.
Try it live
<button hx-get="/api/demo"
hx-target="#result"
hx-swap="innerHTML">
Fetch from server
</button>
<div id="result"></div>Three HTML attributes. Zero JavaScript. That's HTMX.
Sign the Manifesto
Join the movement. Pledge to build hypermedia-first.
Oh, and It's AI-Ready
There's a bonus to building the web properly.
LLMs and AI agents interact with the web through HTTP and HTML — they make GET requests, parse markup, follow links, submit forms. That's hypermedia. It's what we've been talking about this whole time.
SPAs require a JavaScript runtime to render content. AI agents don't have one. Your client-rendered app is invisible to them.
This isn't the reason to build with hypermedia — developer freedom, accessibility, and simplicity are. But it means every hypermedia app you build is automatically an app that AI agents can read, navigate, and use. No special APIs required.
$ curl https://your-hypermedia-app.com
> AI agents can read this HTML.
> They can follow the links.
> They can submit the forms.
> You didn't have to do anything extra.
Build for humans, for accessibility, for simplicity, for yourself. The AI compatibility comes free.
The Proof
This entire site is built with Hono + HTMX.
The HTML IS the application.