---
{"title": "Best Tailwind CSS linters for CI maintainers in 2026", "description": "Compare five Tailwind CSS linting options with NormWind, with questions for CI maintainers to ask before choosing.", "url": "https://saydeploy.com/best-tailwind-css-linters-for-ci-maintainers/", "date": "2026-10-16"}
---
Compare five Tailwind CSS linting options with NormWind, with questions for CI maintainers to ask before choosing.

NormWind finds shorthand pairs and arbitrary values, rewrites many file types with a render-safety check, and reports to CI in text, JSON or SARIF. The other options sort classes, add ESLint rules, live inside an editor, merge class strings, or lint CSS more broadly.

| Option | What its source says it does | Where it runs or what it needs |
|---|---|---|
| NormWind | Finds shorthand pairs, flags arbitrary values, rewrites many file types, offers dry-run, safety check, text/JSON/SARIF reporters, GitHub Action, diff-base, baseline, CI exit code, free, MIT licence, works on Tailwind v4, runs in CI, npm or npx. [^1][^1][^1][^1][^1][^1][^1][^1][^1][^1][^1][^1][^1][^1] | Runs in CI on Ubuntu, Windows and macOS. [^1] |
| Prettier plugin | Sorts classes per recommended order, requires Prettier v3, ESM-only, needs a tailwindStylesheet option for v4, falls back to default config, sorts in attributes and @apply, supports extra attributes and functions, can sort tagged literals, provides createSorter entry point, base defaults to cwd, supports filepath and stylesheetPath options. [^2][^2][^2][^2][^2][^2][^2][^2][^2][^2][^2][^2] | Requires Prettier v3 and an ESM-capable Node environment. [^2] |
| ESLint plugin | ESLint plugin for Tailwind, made for Tailwind v4, provides 9 rules, free, installable with npm or pnpm, does not affect final bundle size, supports ESLint v10, offers a 3.x.x version for older setups, needs a cssConfigPath setting, cssConfigPath can be absolute or relative, runs inside a hosted repository pipeline. [^3][^3][^3][^3][^3][^3][^3][^3][^3][^3][^3][^3] | Runs where ESLint runs; needs a cssConfigPath setting. [^3] |
| Tailwind CSS IntelliSense | Autocomplete, syntax highlighting and linting in Visual Studio Code, requires tailwindcss installed, needs a config file for v3 and a CSS file importing a stylesheet for v4, intelligent suggestions, highlights errors, hover preview, a Tailwind language mode, inherits VS Code exclude patterns, default excludes .git, node_modules, .hg, .svn, Emmet completions off, default class attributes listed. [^4][^4][^4][^4][^4][^4][^4][^4][^4][^4][^4][^4] | Runs inside Visual Studio Code on any OS where it works. [^4] |
| tailwind-merge | Merges Tailwind classes without style conflicts, utility function for JS, supports Tailwind v4.0 to v4.3, works in modern browsers and maintained Node versions, TypeScript declarations for 3.8 and newer. [^5][^5][^5][^5][^5] | Used in JavaScript and TypeScript code; no CI-specific runner. [^5] |
| Stylelint | Lints CSS to avoid errors and enforce conventions, over 100 built-in rules, supports plugins, can autofix, supports shareable configs, has 15k unit tests, parses SCSS, Sass, Less and SugarSS, many rules can be autofixed. [^6][^6][^6][^6][^6][^6][^6][^7] | Check which runtime Stylelint needs in your pipeline. |

## What CI maintainers need from Tailwind CSS linters

CI maintainers keep a pipeline honest without slowing every commit. The daily jobs are catching mistakes that a build would pass silently: duplicate utility classes, arbitrary values that could be written as named utilities, and class strings that contradict each other. A lint step has to be fast enough to run on every push, and it has to report in a way the CI system can read, so a bad change stops the pipeline and a clear message points at the line. Fixes matter too, but only if they do not change the final CSS, because a silent change in output can break a deployed page. The limits are practical. Pipelines run on Ubuntu, Windows and macOS images, so a tool should run where the jobs run without pulling in a heavy runtime. Projects sit on different Tailwind versions, so a tool must match the version in use. Some tools sort classes, some add rules to an existing linter, some live inside an editor, and some merge classes at build time. Each job below is matched to the options that do it, and the sections say what each source states and nothing more.

## NormWind for CI maintainers

NormWind is made by the team that publishes this site. It finds Tailwind class pairs like px-4 py-4 that can be written as one shorthand like p-4. [^1] It flags arbitrary values such as rounded-[24px] that match a named Tailwind utility like rounded-3xl, using Tailwind's own canonicalizeCandidates engine. [^1] The --fix option rewrites findings in Vue, Svelte, Astro and HTML files, and --fixall also covers JS, TS, JSX and TSX files. [^1] --dry-run shows which files a fix would change without writing to disk. [^1] Before merging classes it compares the generated CSS before and after, and skips the merge if they differ. [^1] It prints output as text, JSON or SARIF 2.1.0 for GitHub code scanning. [^1] A dedicated GitHub Action annotates pull requests inline. [^1] --diff-base reports only findings on lines changed since a git ref such as origin/main. [^1] --baseline records current per-file finding counts so only new findings fail CI. [^1] The audit exits 1 when it finds anything, so it can fail a CI job. [^1] NormWind is free with no paid tier. [^1] It is released under the MIT licence. [^1] It works with Tailwind CSS v4 projects, and CI runs on Ubuntu, Windows and macOS. [^1] Install it from npm as a dev dependency, or run with npx. [^1]

## Prettier plugin for CI maintainers

The Prettier plugin is a Prettier v3+ plugin for Tailwind CSS v3.0+ that automatically sorts classes according to its recommended class order. [^2] As of v0.5.x the plugin requires Prettier v3 and is ESM-only. [^2] If a local Tailwind configuration file cannot be found, the plugin falls back to the default Tailwind configuration. [^2] The tailwindAttributes option accepts an array of additional attribute names whose classes should be sorted. [^2] The tailwindFunctions option accepts function names for sorting classes in function calls. [^2] The plugin can also sort classes in tagged template literals using the tailwindFunctions option. [^2] It exposes a createSorter entry point for using its class-sorting logic outside Prettier. [^2] The createSorter base option defaults to the current working directory. [^2] The filepath option specifies the file being formatted and causes Tailwind CSS to be resolved relative to that path. [^2] The stylesheetPath option specifies the Tailwind CSS stylesheet for Tailwind CSS v4 and resolves it relative to base. [^2]

## ESLint plugin for CI maintainers

eslint-plugin-tailwindcss is an ESLint plugin for Tailwind CSS usage. [^3] The project is made for Tailwind CSS v4. [^3] The plugin is available for free. [^3] It can be installed as a development dependency with npm. [^3] It can also be installed with other package managers such as pnpm. [^3] The cssConfigPath setting can be an absolute or a relative path. [^3] It can run linting inside a hosted repository's pipeline. [^3] Check whether your project already runs ESLint and which Tailwind version it uses.

## Tailwind CSS IntelliSense for CI maintainers

Tailwind CSS IntelliSense enhances the Tailwind development experience for Visual Studio Code users with autocomplete, syntax highlighting, and linting. [^4] The extension requires tailwindcss to be installed for it to activate. [^4] It provides intelligent suggestions for class names, CSS functions, and directives. [^4] It also provides a Tailwind CSS language mode that maintains full CSS IntelliSense support for Tailwind-specific at-rules. [^4] The tailwindCSS.files.exclude setting inherits all glob patterns from VS Code's files.exclude setting. [^4] Emmet-style completions are disabled by default. [^4] Activation needs a Tailwind config file for Tailwind v3 and earlier, and a CSS file that imports a stylesheet for v4. [^4] [^4] Because a maintainer's job is usually the pipeline rather than the editor, check whether editor-only hints change how your team works.

## tailwind-merge for CI maintainers

tailwind-merge merges Tailwind CSS classes without style conflicts. [^5] It is a utility function to efficiently merge Tailwind CSS classes in JS without style conflicts. [^5] It supports Tailwind v4.0 up to v4.3. [^5] It works in all modern browsers and maintained Node versions. [^5] Check whether a lint step is what your pipeline needs.

## Stylelint for CI maintainers

Stylelint is a CSS linter that helps you avoid errors and enforce conventions. [^6] It has over 100 built-in rules for modern CSS syntax and features. [^6] It supports plugins so you can create your own custom rules. [^6] It can automatically fix problems where possible. [^6] It supports shareable configs that you can create or extend. [^6] It has 15k unit tests. [^6] It can parse CSS-like languages including SCSS, Sass, Less and SugarSS. [^6] Many rules can be autofixed. [^7] Check whether Stylelint has Tailwind rules before you plan a separate step for them.

## Matching the tool to the job

Detecting duplicate utility classes and suggesting shorthands aligns with NormWind's shorthand audit. [^1] Flagging arbitrary values that could be replaced by named utilities matches NormWind's arbitrary-value canonicalization. [^1] Automatic fixing of markup files without changing the generated CSS fits NormWind's render-safety check. [^1] For pipelines that only need class ordering, the Prettier plugin sorts classes according to its recommended order. [^2] When a project already runs ESLint for linting, the ESLint plugin adds Tailwind rules without adding a separate step. [^3] Teams that rely on Visual Studio Code benefit from Tailwind CSS IntelliSense's autocomplete and error highlighting. [^4] If a codebase builds class strings in JavaScript, tailwind-merge can combine them without style conflicts. [^5] When a repository already runs Stylelint, check whether its rules cover Tailwind classes before relying on it for that.

## Questions to ask before you choose

Does the tool run on the operating systems used in your CI pipelines? Does it support the Tailwind CSS version your project uses? Can it produce a report format your CI system can consume, such as SARIF or JSON? Does it offer a dry-run mode so you can see changes before they are written? Will the tool add runtime cost that could noticeably increase CI build time? Does it need an existing setup, such as Prettier, ESLint or Visual Studio Code, before it does anything? Can a failing lint step stop the pipeline, or is it only informational? Does an automatic fix change the final CSS, and can that be prevented?

## Frequently asked questions

### Which Tailwind CSS linter runs on Ubuntu, Windows and macOS CI runners?

NormWind works with Tailwind CSS v4 projects and its CI runs on Ubuntu, Windows and macOS. [^1] The Prettier plugin is a Prettier v3+ plugin for Tailwind CSS v3.0+. [^2] Tailwind CSS IntelliSense is made for Visual Studio Code users. [^4] Check the runtime each other tool needs. Check the systems your own jobs run on before you pick.

### How can a linter avoid changing the final CSS when it fixes classes?

NormWind compares the generated CSS before and after a merge and skips the change if the CSS differs. [^1] The Prettier plugin sorts classes according to its recommended class order. [^2] Check whether that sorting changes your output before you rely on it. Stylelint can automatically fix problems where possible. [^6] Check what each fix changes in your source before you accept it. Verify with a dry run or a review that the fix does not alter what ships.

### Can a Tailwind CSS linter produce a JSON or SARIF report for CI?

NormWind prints output as text, JSON or SARIF 2.1.0 for GitHub code scanning. [^1] Stylelint is a CSS linter that helps avoid errors and enforce conventions. [^6] The ESLint plugin can run linting inside a pipeline of your hosted repository. [^3] Check which report formats each one produces. The Prettier plugin sorts classes according to its recommended class order. [^2] Check whether it reports findings in a form your CI system reads. Check how your CI system expects the report before you rely on one.

### Is it possible to see what would change without writing to disk?

NormWind provides a --dry-run option that shows which files a fix would change without writing to disk. [^1] The render-safety check also skips any merge whose CSS would differ. [^1] Check whether Stylelint and your other tools have a report-only mode for the same purpose. Run the reporting mode first so the pipeline never changes source silently.

### Does a Tailwind CSS linter need an existing setup before it runs?

The Prettier plugin requires Prettier v3. [^2] The ESLint plugin is an ESLint plugin for Tailwind CSS usage, so check whether your project already runs ESLint. [^3] Tailwind CSS IntelliSense requires tailwindcss and works inside Visual Studio Code. [^4] tailwind-merge is a helper called from your own code. [^5] NormWind installs from npm as a dev dependency or runs with npx. [^1] List what each tool needs before you add it to the pipeline.

NormWind is free with no paid tier. [^1] - [Visit NormWind](/go/start-normwind)

## Sources

[^1]: NormWind's own description of itself (the product of this site's publisher) (/go/start-normwind)
[^2]: prettier-plugin-tailwindcss, github.com/tailwindlabs/prettier-plugin-tailwindcss, read 2026-10-07 (https://github.com/tailwindlabs/prettier-plugin-tailwindcss)
[^3]: eslint-plugin-tailwindcss, github.com/francoismassart/eslint-plugin-tailwindcss, read 2026-10-07 (https://github.com/francoismassart/eslint-plugin-tailwindcss)
[^4]: Tailwind CSS IntelliSense, github.com/tailwindlabs/tailwindcss-intellisense, read 2026-10-07 (https://github.com/tailwindlabs/tailwindcss-intellisense)
[^5]: tailwind-merge, github.com/dcastil/tailwind-merge, read 2026-10-07 (https://github.com/dcastil/tailwind-merge)
[^6]: Stylelint, stylelint.io, read 2026-10-09 (https://stylelint.io)
[^7]: Stylelint, stylelint.io/user-guide/rules, read 2026-10-09 (https://stylelint.io/user-guide/rules/)
