DEV Community

Garrett Hawkins
Garrett Hawkins

Posted on

The Tailwind Tax Nobody Talks About

Look, I know what you're thinking. It's 2026, everyone's using Tailwind, and here I am with my external .css files like some kind of developer fossil. But hear me out.

I've been working on Next.js projects for a while now, and every few months someone tells me I should really migrate to Tailwind... advice in which I've taken heed and begrudgingly applied to a few projects. The thing is, I keep asking myself: why? What problem am I actually solving?

(Before you write me off as inflexible: I'm a pragmatist. If I join a team that lives and breathes Tailwind, I'll write Tailwind. I've worked with plenty of tools I didn't initially love. But when I'm choosing for my own projects, I want that choice to be deliberate, not just habitual.)

We Already Learned This Stuff

Remember when we all sat down and learned CSS? Flexbox, grid, media queries, the cascade, specificity—all of it. It took time, sure, but we figured it out. Now Tailwind comes along and says "forget all that, learn our utility classes instead."

Except... it's the same concepts. flex items-center is just display: flex; align-items: center; with extra steps. I'm not learning something new, I'm learning a different syntax for something I already know. That feels backwards to me.

The Migration Tax

Here's where it gets real for me. I've got existing projects. They work. They're styled. Users are happy.

If I want to jump on the Tailwind train, I'm looking at weeks of work. Going through every component, ripping out class names, replacing them with utility strings, making sure nothing breaks. And for what? So my HTML looks like this?

<button className="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
  Click me
</button>
Enter fullscreen mode Exit fullscreen mode

Instead of this?

<button className="btn-primary">
  Click me
</button>
Enter fullscreen mode Exit fullscreen mode

I don't know. That first one makes me tired just looking at it.

It's Harder to Change My Mind

Say I decide our primary color needs to change. With my old-school approach, I pop into my CSS file, update one variable or a few declarations, done. With Tailwind, I'm searching through components trying to find every instance of bg-indigo-600 and hoping I don't miss any.

Yeah, yeah, I know—you can configure the colors in the config file. But then you're mapping semantic names to Tailwind's naming system, and honestly, at that point, didn't we just reinvent CSS custom properties with extra complexity?

The Readability Thing

Maybe I'm weird, but when I come back to code six months later, <article className="blog-post"> tells me something. <article className="max-w-2xl mx-auto px-4 py-8 prose prose-lg"> just tells me... measurements?

I want my HTML to describe what things are, not what they look like. Isn't that what we've been saying for years?

Are We Just Chasing Trends?

I wonder sometimes if we've confused "best practices" with "what's popular right now." CSS isn't broken. It's been working for websites since before most of us were developers.

Tailwind didn't unlock some new capability—it just changed the workflow. And that's fine! If it works for you, great. But I'm starting to think the emperor's new clothes might just be... regular clothes with a hipper marketing team.

What Actually Matters

At the end of the day, I ship features. My sites load fast. My styles are maintainable (at least to me). My users don't care whether I used Tailwind or hand-rolled CSS—they care if the button works and the site doesn't look broken on mobile.

I'm not against new tools. I've adopted plenty over the years. But I am against refactoring for the sake of keeping up with the Joneses. My time is finite. I'd rather spend it building things than rewriting things that already work.

Maybe There's Room for Both

I'm not trying to convince anyone to ditch Tailwind if you love it. If utility classes make you more productive, then you should absolutely use them. This isn't a holy war.

I just think we should be honest about the tradeoffs. Tailwind has costs—learning curves, migration overhead, verbosity, coupling between markup and styles. Classic CSS has costs too—naming things is hard, bad stylesheets can become spaghetti, specificity battles are real.

Pick your poison based on your project, not based on what's trending.

So Yeah, I'm Sticking with CSS

Call me old-fashioned if you want. I've made peace with it. While the cool kids are debating whether to use @apply or pure utilities, I'm over here writing .card { padding: 1rem; background: white; } and moving on with my life.

Maybe someday I'll convert. Or maybe in five years we'll all be using something else entirely and this whole debate will seem quaint.

Until then, my external stylesheet is doing just fine.


What about you? Are you team Tailwind or team classic CSS? Or have you found some other approach entirely? I'm genuinely curious what's working for other people.

Top comments (0)