Implements HTMX interactions, configures swap behaviors, debugs hx-* requests, and builds hypermedia-driven UI components. Use when tasks involve hx-* attributes, HTMX AJAX requests, swap strategies, server-sent events, WebSockets, or hypermedia-driven UIs.
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Implements HTMX interactions, configures swap behaviors, debugs hx-* requests, and builds hypermedia-driven UI components. Use when tasks involve hx-* attributes, HTMX AJAX requests, swap strategies, server-sent events, WebSockets, or hypermedia-driven UIs.
HTMX
Use this skill for HTMX implementation and integration. Covers htmx 2.x (current stable) and htmx 4.x (beta). Reference files are annotated with [htmx 4], [htmx 4 change], and [htmx 4 removed] admonitions. Read only the reference file(s) needed for the task.
Quick Start
Identify the domain of the task (attributes, requests, swapping, events, patterns).
Open the matching file from references/.
Implement using HTML-first, hypermedia-driven patterns.
Validate that server responses return HTML fragments, not JSON.
Minimal example — a button that loads content via GET:
The server endpoint (/contacts) must return an HTML fragment, not JSON:
<!-- Server response (HTML fragment, no <html>/<body> wrappers) --><ul><li>Alice</li><li>Bob</li></ul>
The default swap is innerHTML — the response replaces the target's children. Use hx-swap="outerHTML" to replace the target element itself.
Critical Rules
HTML responses - HTMX expects HTML responses from the server, not JSON
Attribute inheritance - (v2) Most attributes inherit to children; use hx-disinherit or unset to stop. (v4) Inheritance is explicit — use :inherited suffix to opt in. Not inherited in either version:hx-trigger, hx-on*, hx-swap-oob, hx-preserve, hx-history-elt, hx-validate
Default swap is innerHTML - Always confirm the intended swap method
Form values auto-included - Non-GET requests automatically include the closest enclosing form's values
Progressive enhancement - Use hx-boost="true" — pages must work without JS
Escape user content - Escape all user-supplied content server-side to prevent XSS. Wrap areas rendering user-generated content with hx-disable to prevent HTMX processing of injected attributes
CSS lifecycle classes - HTMX adds/removes CSS classes during requests — use for transitions and indicators
data-prefix supported - All hx-* attributes can also be written as data-hx-* for HTML validation compliance
Stop polling with HTTP 286 - Server returns status 286 to stop every or load delay polling. Always use 286 for poll termination, not conditional client-side logic
Error swaps - (v2) Non-2xx responses are not swapped by default — add an htmx:beforeSwap listener to enable. (v4) All responses swap by default except 204/304 — use hx-status for per-code control
Decouple with HX-Trigger headers - Use HX-Trigger response headers to fire client-side events instead of hardcoding DOM element IDs in server responses
Detect HTMX requests server-side - Check the HX-Request header to serve HTML fragments for HTMX requests and full pages for direct browser requests. Set Vary: HX-Request for caching
Reference Map
All hx-* attributes, values, and modifiers: references/attributes.md