Tailwind CSS – Utility-First CSS in Action
January 10, 2021
Tailwind CSS is a utility-first CSS framework that encourages building UIs directly in your HTML using small, reusable utility classes.
Unlike traditional frameworks like Bootstrap that give you components, Tailwind gives you the building blocks. You style elements by composing utility classes right in your markup.
Why Tailwind?
- Encourages consistency without writing custom CSS
- Lets you prototype fast
- Avoids naming confusion with class names
- Supports dark mode, responsive design, and variants out of the box
Getting Started
Install Tailwind using npm:
npm install tailwindcss
npx tailwindcss init
Configure the generated tailwind.config.js
file if needed.
Set up Tailwind to process your CSS:
/* ./src/styles.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
And in your build tool (like PostCSS):
npx tailwindcss -i ./src/styles.css -o ./dist/styles.css --watch
Example: Card Component
<div class="max-w-sm rounded overflow-hidden shadow-lg">
<img class="w-full" src="/img/card-top.jpg" alt="Card image">
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">Tailwind Card</div>
<p class="text-gray-700 text-base">
This is a simple card built with Tailwind utility classes.
</p>
</div>
</div>
Design Without Leaving HTML
One of Tailwind’s main ideas is: design and implementation should happen in the same place. You don't write new class names in CSS files. You compose them using existing utilities:
text-center
,text-lg
,font-semibold
bg-blue-500
,hover:bg-blue-700
,text-white
Responsive Design
Tailwind uses a mobile-first approach with simple prefixes:
<div class="text-base md:text-lg lg:text-xl">Responsive text</div>
Final Thoughts
Tailwind CSS promotes a shift from traditional CSS thinking. Instead of writing custom styles and managing class names, you rely on predefined building blocks.
It feels strange at first but once you get used to it, the speed and consistency are hard to beat.
Recent posts
- At-Least-Once vs. Exactly-Once - Understanding Message Delivery Guarantees
June 12, 2025
Learn about message delivery guarantees in distributed systems. Understand why most production systems implement at-least-once delivery with idempotency rather than attempting exactly-once delivery.
- How Idempotency Saves Your API from Chaos
June 11, 2025
Learn how to implement idempotency in your APIs to prevent duplicate actions and ensure data consistency. Includes practical examples with Supabase and Node.js.
- Vibe Coding ‑ Notes from the First Try
June 6, 2025
Quick lessons from spinning up a new blog with an AI pair‑programmer and Cursor.