Getting Started
Why htmx + Tailwind
Two bets: that HTML over the wire beats shipping a client framework, and that CSS is finally good enough to not need a config file. shadcn-htmx is what those two bets look like as a component library.
Server-rendered, on purpose
A React component library makes sense when React renders your app. If your app renders HTML on a server — Flask, Django, Rails, Phoenix, Go, Hono — pulling in a client framework just to get a styled dropdown is a tax: a build pipeline, a hydration step, a bundle to ship, and a second source of truth for state.
shadcn-htmx skips all of it. The server renders the markup; the browser runs it. The only JavaScript is a tiny shared keyboard layer for the composite widgets the platform doesn't cover — measured in kilobytes, not megabytes.
Why htmx v4
htmx lets any element issue an HTTP request and swap the response into the page — hx-get, hx-post, hx-swap. Interactivity becomes "ask the server for new HTML", not "mutate client state and re-render". There's no store, no virtual DOM, no serialization boundary between client and server.
Every component here types the htmx v4 attribute set — the renamed swap modifiers, hx-disable, the new request-lifecycle hooks — so live search, infinite scroll, inline edit, and optimistic toggles are a couple of attributes, not a framework.
Why Tailwind v4
Tailwind v4 is CSS-first: theme tokens live in @theme, custom utilities in @utility, and the Oxide engine compiles in milliseconds with no legacy tailwind.config.js. Components are styled with the same utility vocabulary you already use and themed through CSS variables, so dropping one into your project doesn't drag in a design-system runtime — just classes your build already understands.
Web standards over JavaScript
The rule: if the platform ships it, use it. A disclosure is <details>. A modal is <dialog>. A date picker is <input type="date">. A gauge is <meter>. These come with built-in accessibility, keyboard handling, and form integration that hand-rolled JS widgets spend thousands of lines approximating — usually less well.
JavaScript appears only where the platform genuinely has no primitive — the composite ARIA widgets (menu, listbox, combobox, tree) — and even there it's one small, shared keyboard layer, not a per-component runtime. Every component is measured against the WAI-ARIA APG, MDN, the htmx v4 source, and the Tailwind v4 source before it ships.
Who it's for
If you render HTML on the server and want shadcn-quality components without adopting React, this is for you — Python (Jinja2), Go (html/template), Elixir (Phoenix), or anything that can emit markup (the raw-HTML flavour). There's a typed Hono JSX flavour too, if your server already speaks JS/TS.
Where to go next
- Introduction — what shadcn-htmx is, in one page.
- The CLI — pick a flavour and add your first component.
- Browse components — 82 of them, every flavour.