I first tried Tailwind CSS in 2022. Until then, I was more familiar with CSS frameworks that provided ready-made components such as buttons and cards.
Tailwind took a different approach. Instead of giving me a card component,
it provided small utility classes that I could combine in the markup.
The Card Example That Made It Clear
With Bootstrap, a card already has named component classes:
<div class="card">
<div class="card-body">
<h2 class="card-title">Card title</h2>
<p class="card-text">A short description.</p>
</div>
</div>
With Tailwind, I built the appearance from utilities:
<article class="max-w-sm overflow-hidden rounded-lg shadow-lg">
<div class="px-6 py-4">
<h2 class="text-xl font-bold">Card title</h2>
<p class="mt-2 text-gray-700">A short description.</p>
</div>
</article>
If I wanted a wider card, different padding, or another border radius, I could change the relevant utility without first creating a new component style. That flexibility was the part I liked most in the first few days.
The Setup Felt Unfamiliar
The initial setup was less simple than adding a CSS file. I had to install npm packages, create configuration, and run a build command. For someone who was not yet comfortable with a terminal, that could feel like a lot before writing the first class.
The documentation and Indonesian tutorials helped me get through it. The Tailwind CSS IntelliSense extension in VS Code also made a noticeable difference. Autocomplete meant I did not need to remember every class or keep switching to the documentation while experimenting.
What Changed in My Workflow
Tailwind made small interface changes feel faster for me. I could adjust spacing, color, size, and responsive behavior near the element I was editing. It also gave me a consistent set of values instead of asking me to invent a new number each time.
The trade-off is visible in the markup: a complex element can collect many classes. Repeating a long list everywhere is still duplication, so reusable interface patterns belong in components. Plain CSS can also remain clearer for complex selectors or a very small page that does not need a build process.
Those are limits I understand more clearly now. My first impression was much simpler: once the setup worked, building and changing a custom interface felt comfortable, and I wondered why I had not tried the utility-first approach earlier.