CMS

htmx is how Forma stays interactive without becoming a SPA

Declarative HTML, server-rendered truth, tiny surface area. Why Forma’s admin uses htmx — and why that’s exactly what agents want too.

The SPA tax

Somewhere along the way, “modern admin” started meaning: ship a client router, a state store, a toast empire, and a loading spinner between you and the save button.

That’s a product. It’s also a tax.

Forma’s bet is ruder: the server still knows the truth. The browser asks for HTML fragments. The page updates. You keep typing.

What htmx actually is

htmx lets HTML make the requests you’d otherwise write JavaScript for:

  • Click a tab → swap in a partial
  • Save a form → replace the editor
  • Delete a row → refresh the list

Attributes, not a framework. hx-get, hx-post, hx-target, hx-swap. The server returns HTML. The DOM updates. That’s the whole trick.

No virtual DOM reconciliation. No “which client version is the admin on?” The admin is just pages that happen to feel snappy.

Why it fits a portable CMS

Forma ships as PHP + SQLite you can drop on shared hosting. An SPA admin fights that:

  • Extra build pipeline
  • Extra failure modes when JS breaks
  • Two sources of truth (API JSON and UI state)

htmx keeps one pipeline: render on the server, enhance in the browser. If JavaScript fails, you still have forms. Progressive enhancement isn’t nostalgia — it’s uptime on DreamHost.

The agent angle

Here’s the quiet part: agents hate SPAs too.

Scraping a React admin is misery. Calling a clean HTTP API — or reading HTML the server already understands — is a workflow.

Forma’s Agent API is the power tool. htmx is why the human UI stays on the same mental model: pages, posts, partials, save, done. Humans and agents share one content shape. The admin doesn’t invent a second universe in TypeScript.

What “interactive” means in Forma

A good CMS admin needs:

  • Fast list → editor transitions
  • Inline confirms for deletes
  • Settings panes that don’t full-reload the universe
  • Snippet/media pickers that feel immediate

htmx covers that without turning /admin into a second product you have to version, bundle, and apologize for.

What we refuse

  • Client-side routing “because modern”
  • Hydration puzzles for a settings switch
  • Shipping 300KB of JS so a Markdown textarea can… exist

We’ll take a few well-chosen attributes and a dark, dense shell over a dashboard that needs its own changelog.

Try the shape

Install Forma. Open Admin. Watch the URL stay honest while the UI swaps. Then hit GET /api/v1/help from Cursor.

Same site. Two doors. One truth on the server — and htmx is the latch that keeps the human door feeling alive.