Tailwind's Critics Keep Winning Arguments and Losing the War
The latest viral takedown gets the technical details right — and misses what actually decides this choice in 2026.
Every year or two, an "I don't recommend Tailwind" post climbs the Hacker News front page, and the comment section splits along the same fault line it did the time before. The latest entry, from developer Andros Fenollosa, drew well over a hundred comments this week — and it's one of the better specimens of the genre, because most of its technical claims are simply true. It's the conclusion that's aimed at the wrong decade.
The critics keep being right about the details
Fenollosa's strongest material is stuff Tailwind's own creator has conceded on the record. Adam Wathan tweeted back in 2020 that @apply "basically only exists to trick people who are put off by long lists of classes into trying the framework," and doubled down in 2022: if he started over, there would be no @apply at all, because "the behavior is outrageously complicated" and it encourages bad CSS architecture. That's not a gotcha dug out of a private Slack. It's the framework's author telling you its most-reached-for escape hatch is a trap.
The cascade critique lands too. Write class="text-red-500 text-green-500" and the text renders red, because precedence is decided by where utilities sit in the generated stylesheet, not by the order you typed them. That's a genuinely leaky abstraction — leaky enough that an entire runtime dependency, tailwind-merge, exists to re-resolve conflicts in JavaScript at render time. And the design-system argument has always been softer than the pitch: the moment your codebase sprouts w-[347px] and text-[#1a2b3c], the constraint system is running on the honor system, same as vanilla CSS.
So yes: the abstraction leaks, the naming is inconsistent, and utilities teach you Tailwind fluency rather than CSS fluency. Stipulated. The problem is that none of this is new information, and the market has heard it all before. In the State of CSS 2025 survey, Tailwind was the most-used CSS framework by a wide margin — roughly half of all respondents, nearly double Bootstrap's count. Critiques like this one have been published continuously since 2019. The gap between "loses the argument" and "wins the adoption" is the interesting part, and it has an explanation.
The framework already surrendered — by absorbing its critics
Here's what makes the "just learn modern CSS" advice feel stale in 2026: Tailwind Labs agrees with it. Version 4, shipped in January 2025, threw out the JavaScript config file for CSS-first configuration via @theme, and rebuilt the whole output on the exact features critics recommend as alternatives — native cascade layers, registered custom properties via @property, color-mix(), and built-in container queries with no plugin. Tailwind v4 is, structurally, a thin generated veneer over modern CSS. The two camps didn't fight to a draw; they converged.
That convergence also dissolves the framing of the choice. This was never really "framework vs. fundamentals." It's an architecture question, and Fenollosa himself concedes the key point mid-article: the separation-of-concerns objection mostly evaporates in component-based codebases. When a button's markup lives in exactly one file, a wall of utilities on it is a local implementation detail. When you're writing Django or Rails templates without a component layer — which is visibly the world this critique is written from — that same wall of utilities gets copy-pasted across templates, and Wathan's official advice ("reuse your utility-littered HTML") has nothing to attach to. Both experiences are real. They're just different stacks having different conversations.
The threat to Tailwind isn't a blog post
While the recommendation wars replay, the actual existential pressure on Tailwind arrived from a direction no 2019-era critic predicted. In January 2026, Tailwind Labs laid off three of its four engineers. Wathan's own framing: Tailwind is bigger and growing faster than ever, and revenue is down close to 80%. Documentation traffic — the top of the funnel for Tailwind Plus, the commercial templates that fund the open-source work — has fallen roughly 40% since early 2023, because developers now ask an LLM instead of opening the docs.
Sit with that irony for a second. AI code generation is simultaneously Tailwind's best distribution and its worst business outcome. Models emit utility classes by default because the training data is saturated with them, and colocated styles suit token-by-token generation far better than "now go edit this other file" does. Every AI-assisted scaffold deepens the lock-in — while starving the company that maintains the framework. If you're betting a design system on Tailwind for the next five years, the maintenance runway of a four-person-turned-one-person engineering team is a more material risk than anything in any takedown post.
How to actually make this call
If you're on a server-rendered stack without components — classic Django, Rails partials-lite, plain templates — the critics are right, and more right than they used to be. Native nesting, :has(), @layer, and container queries are cross-browser baseline now; a few hundred lines of well-layered vanilla CSS with custom properties will cost you less than utility soup you can't deduplicate. No build step, no version migrations, no vendor risk.
If you're on a component-based product with a team, Tailwind is still the lowest-friction way to stop relitigating naming conventions and spacing values in every PR, and v4's speed and CSS-first config removed most of the old operational gripes. Take it with eyes open: budget for tailwind-merge if you compose class props, ban arbitrary values in review if you actually want the constraint system, and never touch @apply — the author told you why.
Either way, learn the cascade. Not as a virtue signal, but because the code you'll spend 2026 debugging is increasingly AI-generated class soup, and when it breaks, it breaks in cascade-shaped ways that no amount of Tailwind fluency explains. On that point, at least, the critics have always been unambiguously right.
Sources & further reading
- Why I don't recommend Tailwind CSS — en.andros.dev
- I don't recommend Tailwind CSS - discussion — news.ycombinator.com
- Adam Wathan on @apply — x.com
- Tailwind CSS v4.0 — tailwindcss.com
- State of CSS 2025 - Other Tools — 2025.stateofcss.com
- Tailwind Labs lays off 75 percent of its engineers — devclass.com
Ji-ho covers the increasingly tangled overlap between cloud architecture and security, drawing on a background as a penetration tester to keep his reporting grounded in real-world attack paths. He never lets a vendor claim go unquestioned and insists that every buzzword come with a proof of concept.
Discussion 5
the framing here feels backwards to me. yes, the technical critiques are valid—utility-first CSS *is* more verbose in markup and creates different tradeoffs than semantic class design. but saying critics "win the arguments and lose the war" suggests adoption momentum somehow proves correctness. it doesn't. plenty of suboptimal tooling wins market share for reasons orthogonal to technical merit (team familiarity, ecosystem lock-in, hiring signals). if we're going to dismiss legitimate design objections because "everyone uses it anyway," we should at least be honest that we're making a business/convenience choice, not a technical one.
adoption doesn't prove correctness, but it does tell you something about real-world tradeoffs that matter beyond purity. semantic css requires discipline that scales badly on big teams, which... yeah, that's orthogonal to the platonic ideal but relevant to whether you'd actually pick it
exactly—and that's where the cost analysis breaks down. i see teams pick tailwind not because it's technically superior but because onboarding a contractor or junior dev into "just use these class names" takes an afternoon, whereas enforcing consistent semantic naming across a sprawling codebase needs constant review cycles. nobody's quantifying that friction cost in these debates, so the "but it bloats your html" crowd wins the pure argument and loses the actual decision.
honestly the tailwind wars are so boring because both sides are technically correct and just talking past each other about different priorities
exactly. the real question nobody asks is: can you backfill your markup changes across a codebase without losing your mind. everything else is aesthetic preference dressed up as principle.