I haven't used Tailwind, but as someone who regularly has to deal with CSS created by Tailwind, I have to wonder why they're even using CSS at all. It feels like going back to HTML 3.2 attributes. How is 'class="bg-white"' any better than 'bgcolor="white"'?
There is one thing that Tailwind is good for, and that's for making sure people can't override your CSS easily. Anybody who's ever used Stylus to override Tailwind-created CSS will know this pain.
(That said, I think this site is rather... abrasive. That doesn't help anybody.)
[edit: Also, in case it's not obvious, I'm not actually advocating for making sure people can't override your CSS. Please, please let me override your CSS.]
So, I avoid modern webdev, because... reasons.... but is the argument here, really, that this is better than. <button>click me</button> with the default styling applied to button { ... } in style.css?
Follow up question, wasn't the point of css so that you didn't have to write excessive html like this?
To your first question: For me, yes. Although, If I’m going to use it in multiple places with that same style, I’d find the best way to declare it once (like in a React component). Generally I much prefer to keep the style close to the element it’s styling, and I’d rather it be done declaratively rather than native CSS with polyfills. CSS is such a core part of appearance and behavior that building and debugging structures and style together is much more effective.
Apologies, I meant browser normalization, not polyfill. Go my terms mixed up. I also appreciate Tailwind’s pre-built sizings and quick ways to define breakpoint-base styling at the element level. That said, if you want absolute control rather than convenience, then Tailwind can be more of a hindrance than a help. I would rather not manage a lot of that myself for most of my projects.
I’m pretty tired of posts like this stating opinions as though they are objective truth, and using expletives to “get their point across”, seemingly because they can’t write a convincing argument for that opinion.
I know it’s intended to be funny (at least most of the time), but there’s usually truth under the expletives, I believe that humour factor has been lost.
There's an ethos among certain circles (especially on HN, I feel) that basically boils down to "tools don't matter" (perhaps manifesting as "a tool isn't bad if it's ubiquitous" (e.g. Bash or CSS), or "learning curve and footguns don't matter" (e.g. C++)). Of course, it's true that there's a lot of essential complexity to many problems, and hey, maybe CSS really is a local maximum to layout design. And sometimes, a steep learning curve really is inherently necessary, like in functional programming or Rust or what have you. But if a tool is difficult to use due to historical accident, simply accepting that everyone should get good—when more ergonomic alternatives really do exist and are widely used—is simply defeatist. The mere fact that some mental model exists for a tool (in this case, maybe it's "HTML should be semantic") does not necessarily mean it's a good or useful one.
(I say all this as one who's been thoroughly Stockholm syndrome'd by Git, knowing full well that my own argument applies just as much to me in that regard....)
> when more ergonomic alternatives really do exist and are widely used
As someone who got good at Bootstrap, I have to say that Tailwind sucks: it feels like you’re just doing CSS with low-granularity classes. Sure, flexibility, but to the same extent that makes CSS terrible, only now your HTML is littered with inconsistencies.
CSS being nice: one sheet that renders your pages consistent and nice with minimal littering is the markup code.
CSS being sucky: Disconnect between what the CSS codes do, and where they’re used, nearly impossible to clean up, and easy to end up with duplicate efforts.
Bootstrap, for me, strikes the balance better: you do add some classes to the markup, and you get some smart stuff for free, like responsiveness via media queries, but if you want highly configured elements, you extend the CSS; you make a design system and stick to a few custom, high-level classes, and you don’t tack a million classes together at the markup level.
The accessibility argument backfires. Class names are not important for accessibility, it is actually important to use the correct HTML tags, labels, etc. It is also a disadvantage to have semantic class names and use them in tests for selectors. Using accessible attributes of elements in tests helps both the tests and the accessibility.
The problem with HTML and CSS is there are encapsulation boundaries where there shouldn’t be. Tailwind, by contrast, does not separate the layout from the styling; creating a more cohesive developer experience. Anyone making a point like this does not understand why Tailwind—and similar libraries—are superior to classical encapsulated HTML/CSS.
The worst thing that happened is LLMs make using tailwind _easy_. So now it's easier and easier to use and more and more tailwind.
CSS is pretty hard to be proficient in, and maintain, but there's an intentionality to it that improves the results, from my experience.
In contrast, tailwind is so easy to clone "beautiful" designs. A THOUSAND beautifully cloned designs slide into your app that nobody needs to care about. and it's a fucking nightmare of reality but no one cares because that's for the LLMs to sus out.
The rage against Tailwind is absurd. Maybe it is overhyped but it’s an incredibly useful tool and framework; it also brings an enforced consistency that plain CSS doesn’t, which is especially helpful for responsive sites so that the page use feels consistent across platforms.
For me, both sites work fine on mobile. The first one makes a strawman argument by deliberately writing bad CSS and then pointing at it to say that CSS is bad.
The point he’s trying to make it’s that it’s become a default like react has. People pick things because they’re the default not because they’re the right tool for the job. Of course there’s less nuance in the article but I think there is something to be said about picking the right tool for the job and how it’s strangely not the norm in the field especially for web.
I get the authors intent at angry humor (especially since it's a response to justfuckingusetailwind.com) but it does feel hypocritical.
I also think CSS frameworks will be here to stay so long as many of the big backend frameworks like Ruby on Rails and Elixir Phoenix use generators. If they're generating pages they may as well throw CSS in there, and I don't want them using custom CSS. If I'm building a static site though I certainly wouldn't use a framework, and I think the author is right in some regards
I agree about frameworks but I never considered TW to be a framework. It's a tool for generating utility classes, the fact it has basic spacing and colours never seemed frameworkish to me.
I don't really see people getting angry about utility-based css, just tailwind for some reason.
Everything should be Tailwind because all code is written by LLMs these days.
If you need a converter for a normal HTML/CSS component, my free extension SnipCSS is the best Tailwind converter. I haven't seen anything else come close.
I haven't used Tailwind, but as someone who regularly has to deal with CSS created by Tailwind, I have to wonder why they're even using CSS at all. It feels like going back to HTML 3.2 attributes. How is 'class="bg-white"' any better than 'bgcolor="white"'?
There is one thing that Tailwind is good for, and that's for making sure people can't override your CSS easily. Anybody who's ever used Stylus to override Tailwind-created CSS will know this pain.
(That said, I think this site is rather... abrasive. That doesn't help anybody.)
[edit: Also, in case it's not obvious, I'm not actually advocating for making sure people can't override your CSS. Please, please let me override your CSS.]
> Want a button? Here's all you need:
> <button class="bg-sky-500 hover:bg-sky-600 active:bg-sky-700 text-white px-4 py-2 rounded-lg">Click me</button>
So, I avoid modern webdev, because... reasons.... but is the argument here, really, that this is better than. <button>click me</button> with the default styling applied to button { ... } in style.css?
Follow up question, wasn't the point of css so that you didn't have to write excessive html like this?
To your first question: For me, yes. Although, If I’m going to use it in multiple places with that same style, I’d find the best way to declare it once (like in a React component). Generally I much prefer to keep the style close to the element it’s styling, and I’d rather it be done declaratively rather than native CSS with polyfills. CSS is such a core part of appearance and behavior that building and debugging structures and style together is much more effective.
CSS is declarative already!
Tailwind also doesn’t polyfill.
It uses CSS variables (custom properties) extensively. Which you can also do with just CSS.
Defining properties locally is a legit preference, but you can also use CSS for this.
Apologies, I meant browser normalization, not polyfill. Go my terms mixed up. I also appreciate Tailwind’s pre-built sizings and quick ways to define breakpoint-base styling at the element level. That said, if you want absolute control rather than convenience, then Tailwind can be more of a hindrance than a help. I would rather not manage a lot of that myself for most of my projects.
I’m pretty tired of posts like this stating opinions as though they are objective truth, and using expletives to “get their point across”, seemingly because they can’t write a convincing argument for that opinion.
I know it’s intended to be funny (at least most of the time), but there’s usually truth under the expletives, I believe that humour factor has been lost.
I agree. As someone who doesn’t like Tailwind, I was looking for something to agree with, and there hardly was anything except attitude.
This is not the thinkpiece that dismantles Tailwind, come back another time.
Same but I will steal Tailwinds colour palette, that part is pretty good.
There's an ethos among certain circles (especially on HN, I feel) that basically boils down to "tools don't matter" (perhaps manifesting as "a tool isn't bad if it's ubiquitous" (e.g. Bash or CSS), or "learning curve and footguns don't matter" (e.g. C++)). Of course, it's true that there's a lot of essential complexity to many problems, and hey, maybe CSS really is a local maximum to layout design. And sometimes, a steep learning curve really is inherently necessary, like in functional programming or Rust or what have you. But if a tool is difficult to use due to historical accident, simply accepting that everyone should get good—when more ergonomic alternatives really do exist and are widely used—is simply defeatist. The mere fact that some mental model exists for a tool (in this case, maybe it's "HTML should be semantic") does not necessarily mean it's a good or useful one.
(I say all this as one who's been thoroughly Stockholm syndrome'd by Git, knowing full well that my own argument applies just as much to me in that regard....)
> when more ergonomic alternatives really do exist and are widely used
As someone who got good at Bootstrap, I have to say that Tailwind sucks: it feels like you’re just doing CSS with low-granularity classes. Sure, flexibility, but to the same extent that makes CSS terrible, only now your HTML is littered with inconsistencies.
CSS being nice: one sheet that renders your pages consistent and nice with minimal littering is the markup code.
CSS being sucky: Disconnect between what the CSS codes do, and where they’re used, nearly impossible to clean up, and easy to end up with duplicate efforts.
Bootstrap, for me, strikes the balance better: you do add some classes to the markup, and you get some smart stuff for free, like responsiveness via media queries, but if you want highly configured elements, you extend the CSS; you make a design system and stick to a few custom, high-level classes, and you don’t tack a million classes together at the markup level.
The accessibility argument backfires. Class names are not important for accessibility, it is actually important to use the correct HTML tags, labels, etc. It is also a disadvantage to have semantic class names and use them in tests for selectors. Using accessible attributes of elements in tests helps both the tests and the accessibility.
The problem with HTML and CSS is there are encapsulation boundaries where there shouldn’t be. Tailwind, by contrast, does not separate the layout from the styling; creating a more cohesive developer experience. Anyone making a point like this does not understand why Tailwind—and similar libraries—are superior to classical encapsulated HTML/CSS.
Wow, a bunch of bad words and a verbose way of saying “skill issue”, what a compelling argument
That was always an option
Cannot imagine to build a large project with regular CSS anymore. Tailwind is just too good.
The worst thing that happened is LLMs make using tailwind _easy_. So now it's easier and easier to use and more and more tailwind.
CSS is pretty hard to be proficient in, and maintain, but there's an intentionality to it that improves the results, from my experience.
In contrast, tailwind is so easy to clone "beautiful" designs. A THOUSAND beautifully cloned designs slide into your app that nobody needs to care about. and it's a fucking nightmare of reality but no one cares because that's for the LLMs to sus out.
The rage against Tailwind is absurd. Maybe it is overhyped but it’s an incredibly useful tool and framework; it also brings an enforced consistency that plain CSS doesn’t, which is especially helpful for responsive sites so that the page use feels consistent across platforms.
Compare these two sites:
1. https://justfuckingusetailwind.com/
2. https://fuckyouiwontusetailwind.com/
On mobile, the first site is infinitely more pleasant to use. It sells itself by comparison!
For me, both sites work fine on mobile. The first one makes a strawman argument by deliberately writing bad CSS and then pointing at it to say that CSS is bad.
https://justfuckingusetailwind.com makes heavy use of Tailwind specifically to show off the framework
https://fuckyouiwontusetailwind.com keeps it simple on purpose (also because it's copying https://perfectmotherfuckingwebsite.com on purpose)
Someday we'll be past bad words = funny, but until then we'll have to deal with dreck like this.
Giving me some good Ol’ Zed Shaw vibes…
https://programming-motherfucker.com/
Apply this generally to all frameworks
> Tailwind is a tool. It's not a religion or a way of life. Get off your high horse and stop obsessing over a fucking hammer
The author should take his own advice. It is a tool and a useful one at that, why all the rage bruh.
The point he’s trying to make it’s that it’s become a default like react has. People pick things because they’re the default not because they’re the right tool for the job. Of course there’s less nuance in the article but I think there is something to be said about picking the right tool for the job and how it’s strangely not the norm in the field especially for web.
No browsers ship with Tailwind or React pre-loaded. Node and npm don’t come with it loaded. It’s not a default, it’s just popular.
Tailwind is popular with humans, but it is the default for LLMs, which is why we see it everywhere now.
I just tested it, Claude and Gemini spat out a bunch of vanilla CSS.
Popular != default
I get the authors intent at angry humor (especially since it's a response to justfuckingusetailwind.com) but it does feel hypocritical.
I also think CSS frameworks will be here to stay so long as many of the big backend frameworks like Ruby on Rails and Elixir Phoenix use generators. If they're generating pages they may as well throw CSS in there, and I don't want them using custom CSS. If I'm building a static site though I certainly wouldn't use a framework, and I think the author is right in some regards
I agree about frameworks but I never considered TW to be a framework. It's a tool for generating utility classes, the fact it has basic spacing and colours never seemed frameworkish to me.
I don't really see people getting angry about utility-based css, just tailwind for some reason.
Everything should be Tailwind because all code is written by LLMs these days.
If you need a converter for a normal HTML/CSS component, my free extension SnipCSS is the best Tailwind converter. I haven't seen anything else come close.
https://www.snipcss.com
> Everything should be Tailwind because all code is written by LLMs these days.
Sarcasm? Bait? Woefully misinformed?
Not all code is written by LLM these days.