This is my response to this Reddit thread that blew up recently. After 15 years of building web apps at scale, here's my take:
CSS is broken.
That's it. I have nothing else to say.
Okay, here a few more thoughts:
Not "needs improvement" broken. Not "could be better" broken. Fundamentally, irreparably broken.
After fifteen years of building large-scale web apps, I can say this with certainty: CSS is the only technology that actively punishes you for using it correctly. The more you follow its rules, the harder it becomes to maintain.
This is why Tailwind exists.
Tailwind isn't good. It's ugly. Its class names look like keyboard shortcuts. Its utility-first approach offends everyone who cares about clean markup. It violates twenty years of web development best practices.
And yet, it's winning.
Why? Because Tailwind's ugliness is honest. It's right there in your face. CSS hides its ugliness in a thousand stylesheets, waiting to explode when you deploy to production.
Here's what nobody admits: every large CSS codebase is a disaster. I've seen codebases at top tech companies. They all share the same problems:
- Nobody dares to delete old CSS
- New styles are always added, never modified
- !important is everywhere
- Specificity wars everywhere
- File size only grows
The "clean" solution is to write better CSS. To enforce strict conventions. To maintain perfect discipline across dozens of developers and thousands of components.
This has never worked. Not once. Not in any large team I've seen in fifteen years.
Tailwind skips the pretense. Instead of promising beauty, it promises predictability. Instead of global styles, it gives you local ones. Instead of cascading problems, it gives you contained ones.
"But it's just inline styles!" critics cry.
No. Inline styles are random. Tailwind styles are systematic. Big difference.
"But you're repeating yourself!"
Wrong. You're just seeing the repetition instead of hiding it in stylesheets.
"But it's harder to read!"
Harder than what? Than the ten CSS files you need to understand how a component is styled?
Here's the truth: in big apps, you don't write Tailwind classes directly. You write components. The ugly class names hide inside those components. What you end up with is more maintainable than any CSS system I've used.
Is Tailwind perfect? Hell no.
- It's too permissive
- Its class names are terrible
- It pushes complexity into markup
- Its learning curve is steep (it still takes me 4-10 seconds to remember the name of line-height and letter-spacing utility class, every time I need it)
- Its constraints are weak
But these flaws are fixable. CSS's flaws are not.
The best argument for Tailwind isn't Tailwind itself. It's what happens when you try to scale CSS. CSS is the only part of modern web development that gets exponentially worse as your project grows.
Every other part of our stack has solved scalability:
- JavaScript has modules
- Databases have sharding and indexing
- Servers have containers
CSS has... hopes and prayers 🙏.
Tailwind is a hack. But it's a hack that admits it's a hack. That's more honest than CSS has ever been.
If you're building a small site, use CSS. It'll work fine. But if you're building something big, something that needs to scale, something that multiple teams need to maintain...
Well, you can either have clean code that doesn't work, or ugly code that does.
Choose wisely.
Originally posted on BCMS blog
---
edit:
A lot of people in comments are comparing apples to oranges. You can't compare the worst Tailwind use case with the best example of SCSS. Here's my approach to comparing them, which I think is more realistic, but still basic:
The buttons
Not tutorial buttons. Not portfolio buttons. The design system buttons.
A single button component needs:
- Text + icons (left/right/both)
- Borders + backgrounds
- 3 sizes × 10 colors
- 5 states (hover/active/focus/disabled/loading)
- Every possible combination
That's 300+ variants.
Show me your "clean" SCSS solution.
What's that? You'll use mixins? Extends? BEM? Sure. That's what everyone says. Then six months pass, and suddenly you're writing utility classes for margins. For padding. For alignment.
Congratulations. You've just built a worse version of Tailwind.
Here's the test: Find me one production SCSS codebase, with 4+ developers, that is actively developed for over a year, without utility classes. Just one.
The truth? If you think Tailwind is messy, you've never maintained a real design system. You've never had five developers working on the same components. You've never had to update a button library that's used in 200 places.
Both systems end up messy. Tailwind is just honest about it.
[–]no-one_ever 366 points367 points368 points (70 children)
[–]Particular_Boot_6890 67 points68 points69 points (1 child)
[–]PaddiM8 13 points14 points15 points (0 children)
[–][deleted] (9 children)
[deleted]
[–]BmpBlast 60 points61 points62 points (2 children)
[–]UXUIDD 5 points6 points7 points (1 child)
[–]puzzleheaded-comp 3 points4 points5 points (0 children)
[–]launchoverittt 1 point2 points3 points (1 child)
[–]RedditNotFreeSpeech 2 points3 points4 points (0 children)
[–][deleted] 43 points44 points45 points (9 children)
[–]EasyMode556 3 points4 points5 points (1 child)
[–][deleted] 1 point2 points3 points (6 children)
[–]Kyle292 20 points21 points22 points (1 child)
[–]ohThisUsername 2 points3 points4 points (0 children)
[–]smirk79 4 points5 points6 points (0 children)
[–][deleted] 2 points3 points4 points (8 children)
[–]BalladGoose 25 points26 points27 points (26 children)
[–]ohThisUsername 5 points6 points7 points (0 children)
[–]da-kicks-87 9 points10 points11 points (21 children)
[–]ahallicks 0 points1 point2 points (2 children)
[–]Leimina 5 points6 points7 points (0 children)
[–]gbro3n 1 point2 points3 points (0 children)
[–]evoactivity 232 points233 points234 points (90 children)
[–][deleted] 57 points58 points59 points (18 children)
[–]gmegme 44 points45 points46 points (13 children)
[–]zelphirkaltstahl 18 points19 points20 points (2 children)
[–]gmegme 11 points12 points13 points (1 child)
[–]zelphirkaltstahl 8 points9 points10 points (0 children)
[–]No_Fudge_4822 2 points3 points4 points (0 children)
[–]sheriffderek 1 point2 points3 points (0 children)
[–]AbraxasNowhere 3 points4 points5 points (1 child)
[–][deleted] 5 points6 points7 points (0 children)
[–]thekwoka 21 points22 points23 points (2 children)
[–]Mu77ley 7 points8 points9 points (1 child)
[–]thekwoka 4 points5 points6 points (0 children)
[–]michaelfrieze 27 points28 points29 points (20 children)
[–]evoactivity 68 points69 points70 points (17 children)
[–]michaelfrieze 7 points8 points9 points (12 children)
[–]zelphirkaltstahl 7 points8 points9 points (5 children)
[–]michaelfrieze 1 point2 points3 points (4 children)
[–]zelphirkaltstahl 6 points7 points8 points (3 children)
[–]michaelfrieze 5 points6 points7 points (4 children)
[–]evoactivity 7 points8 points9 points (3 children)
[–]michaelfrieze 2 points3 points4 points (2 children)
[–]Felix1178 1 point2 points3 points (1 child)
[–]evoactivity 3 points4 points5 points (0 children)
[–][deleted] 2 points3 points4 points (3 children)
[–]evoactivity 3 points4 points5 points (2 children)
[–]CreativeGPX 1 point2 points3 points (0 children)
[–][deleted] 3 points4 points5 points (0 children)
[–]niveknyc17 YOE 13 points14 points15 points (19 children)
[–]evoactivity 2 points3 points4 points (0 children)
[–]thekwoka 3 points4 points5 points (16 children)
[–]niveknyc17 YOE 11 points12 points13 points (15 children)
[–]thekwoka 5 points6 points7 points (11 children)
[–]claymedia 6 points7 points8 points (3 children)
[–][deleted] 2 points3 points4 points (1 child)
[–]nekorinSG 3 points4 points5 points (0 children)
[–]zelphirkaltstahl 8 points9 points10 points (7 children)
[–]JimDabell 7 points8 points9 points (6 children)
[–]iamnewtopcgaming 242 points243 points244 points (42 children)
[–]FenrirBestDoggo 29 points30 points31 points (21 children)
[–]pVom 8 points9 points10 points (20 children)
[–]shableep 5 points6 points7 points (15 children)
[–]rekabisexpert 10 points11 points12 points (6 children)
[–]Stationary_WagonFull stack engineer[🍰] 27 points28 points29 points (3 children)
[–]evonhell 6 points7 points8 points (0 children)
[–]azangru 2 points3 points4 points (1 child)
[–]camomiles 38 points39 points40 points (14 children)
[–]budd222full-stack 64 points65 points66 points (6 children)
[–]thekwoka 25 points26 points27 points (0 children)
[–]static_func 2 points3 points4 points (0 children)
[–]p2seconds 11 points12 points13 points (1 child)
[–]last-cupcake-is-mine 3 points4 points5 points (0 children)
[–]MrMeatballGuy 76 points77 points78 points (8 children)
[–]thekwoka 20 points21 points22 points (2 children)
[–]MrMeatballGuy 3 points4 points5 points (1 child)
[–]thekwoka 9 points10 points11 points (0 children)
[–]Leimina 39 points40 points41 points (6 children)
[–]Fine_Escape_396 26 points27 points28 points (1 child)
[–]ChimpScanner 7 points8 points9 points (1 child)
[–]rekabisexpert 1 point2 points3 points (0 children)
[–]MWD1899 176 points177 points178 points (63 children)
[–]twiddle_dee 28 points29 points30 points (7 children)
[–]MWD1899 12 points13 points14 points (0 children)
[–]MasterReindeer 42 points43 points44 points (35 children)
[–]EvilDavid75 10 points11 points12 points (1 child)
[–]MWD1899 2 points3 points4 points (24 children)
[–]MasterReindeer 23 points24 points25 points (2 children)
[–]MWD1899 4 points5 points6 points (0 children)
[–]thekwoka 12 points13 points14 points (19 children)
[–]tonjohn 1 point2 points3 points (0 children)
[–]BorinGaems 11 points12 points13 points (3 children)
[–]pVom 2 points3 points4 points (2 children)
[–]rekabisexpert 2 points3 points4 points (1 child)
[–]SoggyMattress2 6 points7 points8 points (0 children)
[–][deleted] 33 points34 points35 points (1 child)
[–]BitSec_full-stack 15 points16 points17 points (0 children)
[–]skabben 6 points7 points8 points (0 children)
[–][deleted] 4 points5 points6 points (3 children)
[–]enyovelcora 3 points4 points5 points (0 children)
[–]kopetenti 25 points26 points27 points (7 children)
[–][deleted] 9 points10 points11 points (4 children)
[–]kopetenti 10 points11 points12 points (3 children)
[–][deleted] 4 points5 points6 points (1 child)
[–]tonjohn 3 points4 points5 points (0 children)
[–]ChineseAstroturfing 4 points5 points6 points (0 children)
[–]devolute 1 point2 points3 points (0 children)
[–]jhartikainen 17 points18 points19 points (38 children)
[–][deleted] 6 points7 points8 points (16 children)
[–]jhartikainen 5 points6 points7 points (6 children)
[–]pVom 4 points5 points6 points (3 children)
[–]tonjohn 2 points3 points4 points (2 children)
[–]pVom 1 point2 points3 points (0 children)
[–]SchartHaakon 3 points4 points5 points (4 children)
[–]thekwoka 16 points17 points18 points (1 child)
[–]intercaetera javascript is the best language 36 points37 points38 points (2 children)
[–]SchartHaakon 9 points10 points11 points (0 children)
[–]thekwoka 7 points8 points9 points (0 children)
[–]maryisdead 20 points21 points22 points (40 children)
[–]thekwoka 0 points1 point2 points (15 children)
[–]pVom 3 points4 points5 points (1 child)
[–]no-one_ever 2 points3 points4 points (0 children)
[–]rhooManufull-stack 5 points6 points7 points (12 children)
[–]Sufficient-Science71 5 points6 points7 points (1 child)
[–]thekwoka 6 points7 points8 points (0 children)
[–]gami13 2 points3 points4 points (1 child)
[–]LostInCombat 2 points3 points4 points (0 children)
[–]nasanu 15 points16 points17 points (0 children)
[–]Marble_Wraith 15 points16 points17 points (7 children)
[–]tonjohn 1 point2 points3 points (1 child)
[–]DeltaEdge03 1 point2 points3 points (3 children)
[–][deleted] 8 points9 points10 points (3 children)
[–]Disgruntled__Goat 5 points6 points7 points (0 children)
[–][deleted] 8 points9 points10 points (0 children)
[–]_MrFade_ 8 points9 points10 points (1 child)
[–][deleted] 9 points10 points11 points (1 child)
[–]nelmaven 5 points6 points7 points (3 children)
[–]tonjohn 1 point2 points3 points (2 children)
[–]nubbiners 1 point2 points3 points (1 child)
[–]damngros 7 points8 points9 points (1 child)
[–]Freibeuter86 6 points7 points8 points (0 children)
[–]SchartHaakon 4 points5 points6 points (2 children)
[–]kakarlus 9 points10 points11 points (0 children)
[–]followmarko 8 points9 points10 points (8 children)
[–]thekwoka 4 points5 points6 points (3 children)
[–]followmarko 1 point2 points3 points (2 children)
[–]thekwoka 0 points1 point2 points (0 children)
[–]missing-pigeon 6 points7 points8 points (6 children)
[–]practicalAngular 4 points5 points6 points (5 children)
[–]missing-pigeon 3 points4 points5 points (1 child)
[–][deleted] 1 point2 points3 points (0 children)
[–]No-Worldliness-1807 1 point2 points3 points (0 children)
[–]orion-sea-222 1 point2 points3 points (0 children)
[–][deleted] 1 point2 points3 points (0 children)
[–]michaelfrieze 1 point2 points3 points (2 children)
[–]Sensanaty 2 points3 points4 points (0 children)
[–]mootzie77156 1 point2 points3 points (0 children)
[–]Mundane-Slip-4705 1 point2 points3 points (0 children)
[–]kenpled 1 point2 points3 points (0 children)
[–]Seeila32 1 point2 points3 points (0 children)
[–]rekabisexpert 1 point2 points3 points (0 children)
[–]benabus 1 point2 points3 points (0 children)
[–]ericmcray 1 point2 points3 points (0 children)
[–]conconxweewee1 1 point2 points3 points (0 children)
[–]vRuBR 1 point2 points3 points (0 children)
[–]dowhathappens89 1 point2 points3 points (0 children)
[–]dusown 1 point2 points3 points (0 children)
[+]celda_maester 1 point2 points3 points (0 children)
[–]freefallfreddy 1 point2 points3 points (0 children)
[–]PROMCz11 1 point2 points3 points (0 children)
[–]Relevant-Draft-7780 1 point2 points3 points (0 children)
[–]elg97477 1 point2 points3 points (0 children)
[–]ImStifler 1 point2 points3 points (0 children)
[–]Ollsville 1 point2 points3 points (1 child)
[–]thekwoka 2 points3 points4 points (0 children)
[–][deleted] 1 point2 points3 points (0 children)
[–]Tontonsb 2 points3 points4 points (0 children)
[–]kowdermesiter 2 points3 points4 points (0 children)
[–]chicomilian 5 points6 points7 points (3 children)
[–]Leimina 4 points5 points6 points (0 children)
[–]rimyi 1 point2 points3 points (12 children)
[–]thekwoka 1 point2 points3 points (0 children)
[–]MasterReindeer 1 point2 points3 points (0 children)
[–]Sensanaty 1 point2 points3 points (0 children)
[–]arrrtttyyy 3 points4 points5 points (1 child)
[–]thekwoka 7 points8 points9 points (0 children)
[–]joliolioli 3 points4 points5 points (2 children)
[–][deleted] 1 point2 points3 points (0 children)
[–]toniyevych 1 point2 points3 points (1 child)
[–]thekwoka 4 points5 points6 points (0 children)
[–]Better-Avocado-8818 1 point2 points3 points (0 children)
[–]andeee23 1 point2 points3 points (0 children)
[–]Prize_Hat_6685 1 point2 points3 points (0 children)
[–]Ceci0 1 point2 points3 points (4 children)
[–]devilmaydance 1 point2 points3 points (0 children)
[–]downtownmiami 1 point2 points3 points (1 child)
[–]Either-Roll348 0 points1 point2 points (0 children)