Tailesswind is a community fork and adaptation of the open-source
Weft
project by its original author
Björn Roberg
One script tag. Your classes are compiled on the edge, cached globally, and served in under 50ms. No npm. No config. No maintenance.
<!-- This is the entire setup. -->
<script src="https://tailesswind.com/client/latest.js"></script>
<!-- Now use Tailwind classes anywhere. -->
<div class="flex items-center gap-4 p-6
bg-white rounded-xl shadow-lg">
<h1 class="text-2xl font-bold">
It just works.
</h1>
</div>
The client script (2kb) scans your HTML for Tailwind classes and computes a SHA-256 hash. Same classes always produce the same hash — this is the key insight.
On first visit, the classes are sent to a Cloudflare Worker running the real Tailwind v4 engine. Compilation takes ~8ms. The resulting CSS is cached globally on the edge.
On every subsequent visit — by anyone, anywhere — the CSS is served from edge cache or the browser's HTTP cache. Zero compilation. Zero round-trips. Instant.
Unlike the Tailwind Play CDN, Tailesswind is designed for production. No FOUC. No client-side CPU cost. Proper cache headers.
Every user warms the cache for everyone else.
flex items-center gap-4
is probably already compiled.
Works with HTMX, Alpine.js, Livewire, Django templates, Go/templ, Rails ERB, plain HTML — anything that renders markup.
Your Tailwind classes are standard. When you outgrow Tailesswind, switch to a build step — your HTML doesn't change. Zero lock-in.
→ HTMX and Alpine.js projects
→ Server-rendered apps (Django, Rails, Laravel, Go)
→ WordPress and CMS sites
→ Prototypes that become production
→ Internal tools and admin panels
→ Static sites without a build step
→ Email template builders
→ Documentation sites
Generous free tier always. Open-source client SDK.
The
Tailesswind
object provides methods to interact with the client script for dynamic
updates and optimization.
tailesswind.rehash()
Rescans the DOM for new Tailwind classes and recompiles CSS if needed. Useful after dynamic content changes.
tailesswind.preload(classes)
Pre-warms the cache for upcoming classes. Accepts an array of class strings.
tailesswind.observe(opts?)
Enables automatic rehashing on DOM mutations. Returns a disconnect function. Optional debounce config.
tailesswind.status()
Returns current state:
{ bundleId, version, ready }.
tailesswind.version
String property indicating the client version, e.g., "0.2.0".