EN FR

Why I don't use Tailwind

Tailwind is everywhere. Job listings, tutorials, GitHub repos. And yet I don't use it. Here's why — without nostalgia or dogma.

  • CSS
  • Tailwind
  • front-end
  • integration
Native CSS vs Tailwind, perspective from a freelance front-end developer

When Tailwind appeared, I looked at it with curiosity. The idea of no longer writing CSS in separate files — composing everything directly in the HTML via utility classes — is appealing on paper. Fast to get started, consistent by construction, popular with teams.

But after using it on a few projects, I stopped. Not out of conservatism. Out of conviction.

The HTML becomes unreadable

The first problem is visual. A Tailwind component looks like this:

class="flex items-center gap-4 px-6 py-3 bg-white text-gray-900 rounded-full border border-gray-200 hover:border-gray-400 transition-colors duration-200"

It works. But it is noise. HTML, meant to describe structure and meaning, ends up invaded by atomised visual decisions. You lose the readability of one without truly gaining the readability of the other.

With named CSS, the same thing is written as class="btn_primary". The name carries the intent. The CSS rule carries the form. Each in its place.

Native CSS is more powerful than people think

Tailwind was born at a time when native CSS was still limited. No custom properties, no clamp(), no :is(), no subgrid, no container queries. We made do.

Today, native CSS is a mature, powerful, elegant language. Variables enable a complete design system in a few lines. Mathematical functions replace rigid breakpoints. Modern pseudo-classes simplify patterns that previously required JavaScript.

Learning to bypass it rather than master it means missing something important.

The configuration overhead

Tailwind is not just classes in the HTML. It is a configuration, a build step, a tailwind.config.js to maintain, purges to manage, plugins to install for what the core does not cover.

For a bespoke project where I control every line of code, that is unnecessary complexity. My CSS is a single file. It reads from top to bottom. It does not need to be compiled. It lives with the project, without dependencies.

A question of method, not morality

I am not saying Tailwind is bad. On a large team with a codified design system, dozens of components to maintain and a need for consistency among developers with very different CSS levels, it makes sense.

But in a bespoke development context — where every site is a unique object, where CSS is a direct expression of visual intent — I prefer to write the CSS myself. Completely. Without an intermediary. It takes longer upfront. It is more precise, lighter, more readable in the end.

And honestly, it is also what I find most satisfying about this craft.