MinhVo

Minh Vo

rss feed

Slaying code & making it lit fr fr 🔥 tagline

Hey there 👋 I'm an AI Engineer with 7 years of experience building scalable web and mobile applications. Currently at Neurond AI (May 2025 — present), architecting an Enterprise AI Assistant Platform with multi-tenant RAG on pgvector, multi-provider LLM orchestration, and Azure-native infrastructure. Previously spent 5+ years at SNAPTEC (Sep 2019 — Apr 2025), leading SaaS themes, admin dashboards, and e-commerce platforms — earned the Hero of the Year award in 2021. I specialize in TypeScript, React, Next.js, and AI-Native engineering with Claude Code and Cursor.bio

Back to blogs

Tailwind CSS v4: Engine Rewrite and New Features

Explore Tailwind v4: Rust-based engine, CSS-first configuration, and lightning-fast builds.

TailwindCSSFrontendStyling

By MinhVo

Introduction

Tailwind CSS v4, announced in early 2024 and released as a public alpha, represents the most ambitious rewrite in the framework's history. The entire engine has been rebuilt from the ground up in Rust, replacing the JavaScript-based JIT compiler that powered v3. This rewrite delivers build speeds up to 10x faster than v3, making Tailwind one of the fastest CSS frameworks in existence. But speed is only part of the story—v4 also introduces a CSS-first configuration system that eliminates the tailwind.config.js file for most use cases.

The CSS-first approach means you configure your design system directly in your CSS file using @theme directives, CSS custom properties, and native CSS features. This aligns Tailwind more closely with the platform it enhances, reducing the abstraction layer between your configuration and the output. Combined with native support for container queries, CSS nesting, and cascade layers, v4 positions Tailwind as a thin, intelligent layer on top of modern CSS rather than a replacement for it.

This guide covers the new engine architecture, the CSS-first configuration system, migration strategies from v3, and the practical implications for production projects. We will explore real code examples, compare build performance, and discuss when and how to upgrade your existing projects.

Tailwind CSS v4 engine

Understanding the v4 Engine: Core Concepts

The Rust-Based Oxide Engine

The core of Tailwind v4 is the Oxide engine, written in Rust for maximum performance. The engine handles three critical tasks: scanning source files for class names, compiling utility classes to CSS, and optimizing the output for production.

The performance improvements are dramatic. In benchmarks on a typical Next.js project with 500 components, v3's JIT engine takes approximately 800ms for an initial build and 50ms for incremental rebuilds. The Oxide engine completes the same initial build in under 100ms and incremental rebuilds in under 10ms. This difference is imperceptible during development, meaning your CSS always feels instant.

The Rust engine also enables better integration with build tools. Instead of running as a PostCSS plugin (which adds overhead from the PostCSS pipeline), v4 can run as a standalone process or integrate directly with Vite, Turbopack, and other modern bundlers through native APIs.

CSS-First Configuration

The most visible change in v4 is the elimination of tailwind.config.js for common use cases. Instead of configuring your design system in JavaScript, you configure it directly in CSS:

/* Before (v3): tailwind.config.js */
/** @type {import('tailwindcss').Config} */
module.exports = {
  theme: {
    extend: {
      colors: {
        brand: '#3b82f6',
      },
    },
  },
};
 
/* After (v4): styles.css */
@import "tailwindcss";
 
@theme {
  --color-brand: #3b82f6;
}

This change means your design tokens live in CSS, where they belong. The @theme directive generates both the utility classes (like bg-brand) and the underlying CSS custom properties (like --color-brand), giving you full access to your design system from both utility classes and custom CSS.

Native CSS Features

Tailwind v4 embraces modern CSS features that have reached baseline browser support:

/* Container queries - no plugin needed */
@import "tailwindcss";
 
/* Now available as utilities */
.card {
  @container;
}
 
/* CSS nesting - works natively */
.nav {
  background: white;
  
  & a {
    color: blue;
    
    &:hover {
      color: darkblue;
    }
  }
}
 
/* Cascade layers */
@layer base, components, utilities;

CSS-first configuration

Architecture and Design Patterns

Theme Configuration with @theme

The @theme directive replaces the theme.extend section of tailwind.config.js:

@import "tailwindcss";
 
@theme {
  /* Colors */
  --color-primary: #3b82f6;
  --color-secondary: #8b5cf6;
  --color-accent: #f59e0b;
  
  /* Spacing scale */
  --spacing-18: 4.5rem;
  --spacing-88: 22rem;
  
  /* Typography */
  --font-display: 'Inter', system-ui, sans-serif;
  --font-body: 'Georgia', serif;
  
  /* Border radius */
  --radius-pill: 9999px;
  
  /* Animations */
  --animate-fade-in: fade-in 0.3s ease-out;
  
  @keyframes fade-in {
    from { opacity: 0; }
    to { opacity: 1; }
  }
}

This generates utility classes like bg-primary, text-secondary, p-18, font-display, rounded-pill, and animate-fade-in automatically.

Import-Based Plugin System

v4 replaces the JavaScript plugin array with CSS imports:

@import "tailwindcss";
@import "@tailwindcss/typography";
@import "@tailwindcss/forms";
 
/* Or with layer control */
@layer base {
  @import "@tailwindcss/preflight";
}
 
@layer utilities {
  @import "@tailwindcss/typography";
}

Automatic Content Detection

v4 can automatically detect your source files without explicit content configuration:

/* No content configuration needed - auto-detected */
@import "tailwindcss";
 
/* Tailwind scans the project root for class names automatically */

For monorepos or custom setups, you can still specify content paths:

@import "tailwindcss";
 
@source "../packages/ui/src/**/*.{js,ts,jsx,tsx}";
@source "../shared/components/**/*.{js,ts,jsx,tsx}";

Step-by-Step Implementation

Installing Tailwind v4

For new projects with Vite:

npm install tailwindcss@next @tailwindcss/vite@next

Configure Vite:

// vite.config.ts
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
 
export default defineConfig({
  plugins: [tailwindcss()],
});

Set up your CSS file:

/* src/styles.css */
@import "tailwindcss";
 
@theme {
  --color-brand: #3b82f6;
  --color-surface: #ffffff;
  --color-text: #1f2937;
}
 
/* Your custom styles */
body {
  font-family: var(--font-sans);
  color: var(--color-text);
  background-color: var(--color-surface);
}

Migrating a v3 Project to v4

Step 1: Update dependencies:

npm install tailwindcss@next @tailwindcss/vite@next
npm uninstall postcss autoprefixer

Step 2: Convert your configuration to CSS:

/* Replace tailwind.config.js with this in your main CSS file */
@import "tailwindcss";
 
@theme {
  /* Move your custom colors */
  --color-brand: #3b82f6;
  --color-brand-dark: #2563eb;
  
  /* Move custom fonts */
  --font-sans: 'Inter', system-ui, sans-serif;
  
  /* Move custom spacing */
  --spacing-18: 4.5rem;
}

Step 3: Remove the JavaScript configuration file:

rm tailwind.config.js
rm postcss.config.js

Step 4: Update your build configuration to use the Vite plugin instead of PostCSS.

Building a Modern Landing Page

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="/styles.css">
</head>
<body class="bg-white text-gray-900">
  <!-- Hero Section -->
  <section class="min-h-screen flex items-center justify-center 
                  bg-gradient-to-br from-blue-50 to-indigo-100">
    <div class="max-w-4xl mx-auto px-6 text-center">
      <h1 class="text-5xl md:text-7xl font-bold tracking-tight">
        Build Faster with
        <span class="bg-gradient-to-r from-blue-600 to-purple-600 
                     bg-clip-text text-transparent">
          Tailwind v4
        </span>
      </h1>
      <p class="mt-6 text-xl text-gray-600 max-w-2xl mx-auto">
        The next generation of utility-first CSS. Faster builds, 
        CSS-first configuration, and native modern CSS support.
      </p>
      <div class="mt-10 flex gap-4 justify-center">
        <a href="#" class="bg-blue-600 hover:bg-blue-700 text-white px-8 py-4 
                           rounded-xl font-semibold text-lg transition-colors">
          Get Started
        </a>
        <a href="#" class="border border-gray-300 hover:border-gray-400 
                           text-gray-700 px-8 py-4 rounded-xl font-semibold 
                           text-lg transition-colors">
          Learn More
        </a>
      </div>
    </div>
  </section>
 
  <!-- Features with Container Queries -->
  <section class="py-24 px-6">
    <div class="max-w-6xl mx-auto">
      <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
        <div class="@container p-8 bg-white rounded-2xl shadow-lg border border-gray-100">
          <div class="w-12 h-12 bg-blue-100 rounded-xl flex items-center justify-center">
            <span class="text-2xl">âš¡</span>
          </div>
          <h3 class="mt-4 text-xl font-bold @md:text-2xl">10x Faster</h3>
          <p class="mt-2 text-gray-600">
            The Rust-based Oxide engine compiles CSS in milliseconds, 
            not seconds.
          </p>
        </div>
        <!-- More feature cards -->
      </div>
    </div>
  </section>
</body>
</html>

Tailwind v4 implementation

Real-World Use Cases and Case Studies

Use Case 1: Large-Scale Enterprise Application

Enterprise applications with hundreds of components and multiple design themes benefit enormously from v4's speed improvements. A project that took 5 seconds to compile CSS in v3 now builds in under 500ms. The CSS-first configuration also simplifies onboarding—new developers can understand the design system by reading the CSS file rather than navigating a complex JavaScript configuration.

Use Case 2: Component Library Development

Component libraries that ship with Tailwind utilities need fast, reliable CSS generation. v4's automatic content detection means libraries do not need to document content path configuration for consumers. The @source directive allows consumers to point Tailwind at the library's source files without manual safelisting.

Use Case 3: Monorepo Architecture

Monorepos with shared UI packages and multiple applications benefit from v4's import-based configuration. Each package can define its own @theme with design tokens, and applications can compose them through CSS imports. This is cleaner than merging JavaScript configuration objects from multiple packages.

Use Case 4: Rapid Prototyping

For prototyping and hackathons, v4's zero-configuration mode is ideal. Install Tailwind, add @import "tailwindcss" to your CSS file, and start building. No configuration file to create, no content paths to configure—the engine figures it out automatically.

Best Practices for Production

  1. Adopt CSS-first configuration gradually: If you have a complex tailwind.config.js, migrate incrementally. Move colors first, then spacing, then plugins. The JavaScript config still works in v4 as a compatibility layer.

  2. Use @theme for all design tokens: Define colors, fonts, spacing, and animations in @theme blocks. This generates both utility classes and CSS custom properties, giving you maximum flexibility.

  3. Leverage automatic content detection: For most projects, v4's automatic detection works perfectly. Only add @source directives if classes are being missed.

  4. Use the Vite plugin instead of PostCSS: The Vite plugin provides faster builds and better integration with Vite's dev server. If you are using Vite, there is no reason to use PostCSS.

  5. Test with the Rust engine in CI: Ensure your CI environment supports the Rust engine. Most modern CI providers (GitHub Actions, GitLab CI, Vercel) support it out of the box.

  6. Monitor CSS bundle size: v4's output may differ slightly from v3 due to engine changes. Compare bundle sizes before and after migration to ensure no unexpected bloat.

  7. Update IDE extensions: The Tailwind CSS IntelliSense extension has been updated for v4. Ensure you are using the latest version for accurate autocompletion and linting.

  8. Document your @theme configuration: Add comments explaining the purpose of custom design tokens. This serves as living documentation for your design system.

Common Pitfalls and Solutions

PitfallImpactSolution
Keeping tailwind.config.js alongside @themeConflicting configurationsRemove the JS config after migrating to CSS-first
Not updating Vite pluginBuild errors or slow buildsUse @tailwindcss/vite instead of the PostCSS plugin
Missing @import "tailwindcss"No utilities generatedEnsure the import is in your main CSS file
Using v3 plugin syntaxPlugins not loadedUse @import "@tailwindcss/typography" instead of require()
Forgetting to remove PostCSS configRedundant processingDelete postcss.config.js when using the Vite plugin
Assuming automatic detection works everywhereMissing classes in edge casesAdd @source directives for unusual file structures
Not testing build in CIProduction build failuresRun the build in your CI pipeline before deploying

Performance Optimization

The Oxide engine is already fast, but you can optimize further:

/* Use @source to limit scanning scope */
@import "tailwindcss";
 
@source "../src/**/*.{js,ts,jsx,tsx}";
@source "../public/**/*.html";
 
/* Exclude test files explicitly */
@source-not "../**/*.test.{js,ts,jsx,tsx}";
@source-not "../**/*.stories.{js,ts,jsx,tsx}";

Benchmark comparison between v3 and v4:

MetricTailwind v3Tailwind v4Improvement
Initial build800ms80ms10x faster
Incremental rebuild50ms5ms10x faster
Cold start (first run)1.2s150ms8x faster
Memory usage120MB45MB62% less
Output CSS size (gzipped)12KB11KB~8% smaller

Comparison with Alternatives

FeatureTailwind v4Tailwind v3UnoCSSLightning CSS
EngineRust (Oxide)JavaScript (JIT)RustRust
ConfigurationCSS-firstJavaScriptJavaScript/ConfigMinimal
Build Speed~80ms~800ms~60ms~30ms
Utility ClassesFull supportFull supportFull supportN/A
Container QueriesNative utilitiesPluginNativeManual
CSS NestingSupportedNot supportedSupportedSupported
Plugin SystemCSS importsJavaScriptPresetsN/A
IDE SupportExcellentExcellentGoodLimited
Migration EffortModerateN/AHighHigh

Advanced Patterns and Techniques

Custom Theme with Multiple Color Schemes

@import "tailwindcss";
 
@theme {
  /* Light mode colors */
  --color-surface: #ffffff;
  --color-surface-alt: #f9fafb;
  --color-text: #111827;
  --color-text-muted: #6b7280;
  --color-primary: #3b82f6;
}
 
@variant dark {
  @theme {
    --color-surface: #111827;
    --color-surface-alt: #1f2937;
    --color-text: #f9fafb;
    --color-text-muted: #9ca3af;
    --color-primary: #60a5fa;
  }
}
 
/* Usage: bg-surface, text-text, text-text-muted, bg-primary */

Source Control for Theme Tokens

@import "tailwindcss";
 
/* Import shared tokens from a design system package */
@import "@company/design-tokens/tailwind.css";
 
@theme {
  /* Override specific tokens for this project */
  --color-primary: #1d4ed8;
}

Combining @theme with CSS Custom Properties

@import "tailwindcss";
 
@theme {
  --color-dynamic: var(--user-preference-color, #3b82f6);
}
 
/* The bg-dynamic utility now responds to the custom property */
/* Set via JavaScript: document.documentElement.style.setProperty('--user-preference-color', '#ef4444') */

Testing Strategies

Test your Tailwind v4 configuration and components:

// Verify theme tokens are generated correctly
import { readFileSync } from 'fs';
import { execSync } from 'child_process';
 
describe('Tailwind v4 Configuration', () => {
  beforeAll(() => {
    execSync('npx tailwindcss -i src/styles.css -o test-output.css');
  });
 
  it('generates custom color utilities', () => {
    const css = readFileSync('test-output.css', 'utf-8');
    expect(css).toContain('.bg-primary');
    expect(css).toContain('.text-secondary');
  });
 
  it('generates CSS custom properties', () => {
    const css = readFileSync('test-output.css', 'utf-8');
    expect(css).toContain('--color-primary');
    expect(css).toContain('--color-secondary');
  });
 
  it('excludes unused utilities', () => {
    const css = readFileSync('test-output.css', 'utf-8');
    expect(css).not.toContain('.bg-transparent'); // If not used
  });
});

Future Outlook

Tailwind v4 is currently in public alpha, with a stable release expected later in 2024. The roadmap includes full feature parity with v3, improved IDE support, and deeper integration with popular frameworks like Next.js, Nuxt, and SvelteKit.

The Rust-based engine opens possibilities for real-time CSS generation in development servers, eliminating the build step entirely during development. The team is also exploring integration with the Lightning CSS transformer for advanced CSS features like nesting, custom media queries, and color functions.

The CSS-first configuration approach aligns Tailwind with the direction of the web platform. As CSS continues to gain powerful features (container queries, cascade layers, CSS nesting, color-mix), Tailwind's role shifts from providing abstractions over CSS limitations to providing a convenient, token-based API over native CSS capabilities.

Conclusion

Tailwind CSS v4 represents a paradigm shift in how the framework operates:

  1. The Rust-based Oxide engine delivers transformative speed: Build times drop from seconds to milliseconds, making CSS compilation imperceptible during development and near-instant in CI/CD pipelines.

  2. CSS-first configuration aligns with the platform: By moving configuration from JavaScript to CSS, v4 reduces abstraction and makes your design system more discoverable and maintainable.

  3. Automatic content detection eliminates configuration overhead: For most projects, you no longer need to specify where your class names live. The engine figures it out.

  4. Native CSS features reduce plugin dependencies: Container queries, CSS nesting, and cascade layers work out of the box, reducing the need for third-party plugins.

  5. The migration path from v3 is manageable: While there are breaking changes, the core utility class system remains the same. Your existing markup works unchanged—only the configuration needs updating.

  6. The ecosystem is ready: Major tools and frameworks are already supporting or planning to support v4, ensuring a smooth transition for production projects.

Tailwind v4 is not just a faster version of v3—it is a rethinking of how CSS frameworks should relate to the web platform. By building on native CSS features and providing an intelligent, fast compilation layer, v4 positions Tailwind as a long-term solution that grows with the platform rather than competing with it.