unstale

npm / oxlint-tailwindcss

oxlint-tailwindcss

What changed in oxlint-tailwindcss 0.5 to 1, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.

28 breaking1 security28 new APIs and options4 performance17 behavior and defaults6 tooling80 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.1.1 on npm

oxlint-tailwindcss 1141 changes

Breaking changes 27

  • The declared Node.js range is now ^20.19.0 || >=22.12.0, matching oxlint’s requirement; older Node 20 releases are not supported.

    1.14.0release notes

  • The release requires Node.js ^20.19.0 || >=22.12.0.

    1.14.0release notes

  • The supported minimum is now Tailwind CSS v4.1.15; versions 4.1.0–4.1.14 receive a clear designSystemUnavailable instead of a raw engine error.

    1.14.0release notes

  • Bounds consecutive per-entry-point worker failures: after three, failures become sticky and the run fails fast; success clears the budget and the sticky state expires after a backoff window.

    1.11.0release notes

  • Engines older than v4.1 and major-version mismatches fail as designSystemUnavailable; newer minor versions and minor build drift warn and lint best-effort.

    1.9.0release notes

  • The autofix wraps templates into the block convention, using source-line indentation and re-wrapping only over-budget lines while leaving conforming lines verbatim.

    1.8.0release notes

  • The rule measures the longest individual line instead of the raw multiline template length, so splitting a string across lines can satisfy printWidth.

    1.8.0release notes

  • The rule now reads selectors only when collecting classes declared in project CSS, so nine previously accepted false positives, including com, css, and 5rem, are reported as unknown.

    1.7.0release notes

  • Declaration-service failures now surface through no-conflicting-classes and no-unknown-classes instead of silently falling back to weaker behavior.

    1.6.0release notes

  • Reports one diagnostic per collapsible group instead of one per matching family; CI diagnostic counts may drop.

    1.5.0release notes

  • Recognizes 37 additional collapsible patterns, so patterns that were previously silent can now report.

    1.5.0release notes

  • With an entry point, checks shorthand merges against emitted declarations; without one, sizing merges only values that cannot come from a per-axis namespace.

    1.5.0release notes

  • Now reports the (--x) shorthand spelling of arbitrary values, as well as the bracketed form.

    1.5.0release notes

  • With an entry point configured, orders project-defined variants according to their actual selectors, moving generated-box variants innermost and treating combinators as reordering barriers.

    1.4.0release notes

  • Reports same-value class pairs as redundant, including numeric spellings that normalize to the same value; these findings can fail CI runs that previously passed.

    1.4.0release notes

  • The rule runs unconditionally without settings.tailwindcss.entryPoint; any entryPoint passed as a rule option is ignored.

    1.3.5release notes

  • Flags @container and @container-size together as conflicting container-type markers.

    1.3.1release notes

  • The rule now converts negative physical utilities, which may produce new reports for projects using them.

    1.3.0release notes

  • The rule now converts negative logical utilities, which may produce new reports for projects using them.

    1.3.0release notes

  • The no-op entryPoint option was dropped; configurations that set it should remove it.

    1.3.0release notes

  • Strict mode now sorts prefixed groups stably instead of collapsing them to the same priority.

    1.2.0release notes

  • Under a project prefix, correctly prefixed utilities are valid; unprefixed utilities are reported with a missingPrefix message and a quick-fix that adds the prefix. Component classes remain valid without a prefix.

    1.2.0release notes

  • Merges utilities with the same variant prefix, including stacked and arbitrary variants, while leaving different-variant and mixed-importance pairs untouched. Same-variant stacks now report and autofix.

    1.1.0release notes

  • DS-dependent rules now report one actionable designSystemUnavailable diagnostic per file for fatal design-system failures instead of silently skipping.

    1.0.0release notes

  • Filesystem auto-detection and the global last-loaded-path fallback are gone; configurations must declare entryPoint explicitly.

    1.0.0release notes

  • An explicit entryPoint is now required. Use a string for a single project or an array of { files, use } mappings for monorepos; the legacy string-array shape is removed.

    1.0.0release notes

  • Default worker timeouts increase to 60 seconds for initialization and 30 seconds per request, reducing failures on slow CI.

    1.0.0release notes

Security 1

  • The cache is namespaced per user, created with mode 0o700, and schema-validates reads; corrupt or poisoned files are removed and recomputed.

    1.3.0release notes

New APIs and options 24

  • When enabled, reports canonical forms that also set variables other utilities read, with an editor-applicable suggestion and no autofix; it is off by default.

    1.15.0release notes

  • The new jsx value wraps JSX attribute strings in place; the default never preserves the previous behavior, and JavaScript strings still only report.

    1.15.0release notes

  • The new sizing option converts widths and heights, including min/max forms and size utilities, when enabled; it is off by default.

    1.15.0release notes

  • Adds tailwindcss() for registering the plugin and its recommended rules through extends in oxlint.config.ts or a published shared config.

    1.15.0release notes

  • The new option reports canonical forms that mean something different in the project, naming both variants and providing no fix; it is off by default.

    1.14.0release notes

  • Adds allowVariables: 'none' | 'runtime' | 'all' to allow pure CSS-variable references; the default remains 'none', and runtime mode consults the design system.

    1.14.0release notes

  • Adds an experimental, opt-in rule that reports native elements whose classes rebuild a configured component; it has no autofix.

    1.14.0release notes

  • Adds an opt-in rule that reports Tailwind default-palette colors in projects with their own theme colors, naming the project's colors as alternatives.

    1.14.0release notes

  • Adds an opt-in rule that reports runtime-built classes Tailwind will not generate; the recommended README config enables it as an error.

    1.14.0release notes

  • Accepts a per-rule entryPoint; with a theme that defines its own colors, reports name those colors as replacements. Without an entry point or on stock Tailwind, the message is unchanged.

    1.14.0release notes

  • Map a custom callee to a structured extractor such as tv, cva, classed, or flat so wrapped configuration receives deep extraction across all 24 rules.

    1.13.0release notes

  • Adds a group option for wrapLines: all, with newLine as the default; emptyLine separates variant runs with blank lines, and never skips grouping.

    1.11.0release notes

  • Adds opt-in width-based autofixing for template literals: overWidth wraps only lines exceeding printWidth, while all normalizes multiline or over-width templates.

    1.11.0release notes

  • Overrides the design-system disk-cache location so developers can pin it to a controlled path in CI or sandboxed builds.

    1.11.0release notes

  • Overrides sort, canonicalize, and declaration worker services' per-request timeout, allowing slow but functional machines or CI runners more time to complete requests.

    1.11.0release notes

  • Adds regex patterns matched against JSX attribute names, additive to the exact attributes list; invalid regex sources are skipped.

    1.11.0release notes

  • Set this to true to downgrade future-major and major-drift fatal errors to a warning and lint against an untested engine; engines older than v4.1 remain fatal.

    1.9.0release notes

  • Adds the float-left/float-start, clear-left/clear-start, and text-left/text-start pairs; verifies suggested classes exist when a design system is available.

    1.5.0release notes

  • Adds allow patterns to silence every pair involving a matching class or a specific two-class combination.

    1.4.0release notes

  • Adds reportRedundant: false to opt out of findings for class pairs that declare the same property with the same value.

    1.4.0release notes

  • Adds an allowlist option; it defaults to no-op behavior, so existing configurations keep working.

    1.0.0release notes

  • Adds a direction option; it defaults to no-op behavior, so existing configurations keep working.

    1.0.0release notes

  • Adds an allowlist option; it defaults to no-op behavior, so existing configurations keep working.

    1.0.0release notes

  • Adds a direction option; it defaults to no-op behavior, so existing configurations keep working.

    1.0.0release notes

Performance 3

  • After precomputing, the plugin removes its own cache files unused for 30 days; cache hits refresh file dates at most once a day, and other directory files are left alone.

    1.14.0release notes

  • Persists canonicalization results to disk across oxlint runs, reducing repeated worker round-trips for dynamic classes.

    1.4.0release notes

  • Keeps an LRU-bounded warm worker for each CSS entry point in monorepos, avoiding repeated design-system warmups when linting files from different packages.

    1.4.0release notes

Behavior and default changes 14

  • With the default direction of both, the rule now converts block-axis utilities using Tailwind 4.2 logical utilities; without an entry point, these are suggested but never autofixed.

    1.15.0release notes

  • The rule now converts block-axis utilities back to physical utilities and converts sizes when sizing is enabled; it does not touch display utilities.

    1.15.0release notes

  • String operands in + concatenations are now linted; complete classes receive rules and fixes, while glued fragments stay unchanged and runtime classes can be reported by no-dynamic-classes.

    1.14.0release notes

  • With an entry point and project-defined colors, the diagnostic now names the theme colors developers can use instead of a hardcoded value.

    1.14.0release notes

  • Typo suggestions use an edit allowance scaled to class length, reducing wrong quick-fixes on short classes while retaining close suggestions such as flxe to flex.

    1.14.0release notes

  • The first rule linting each file now reports unknown setting keys, wrong value types, invalid regular-expression patterns, and unknown callee extractor kinds once per file.

    1.14.0release notes

  • The autofixer no longer inserts whitespace that splits a class glued to a template interpolation; such cases are warn-only.

    1.11.0release notes

  • Becomes design-system optional; when entryPoint is configured, the all-mode newLine and emptyLine fixers consult it to strip the project prefix before grouping variants.

    1.11.0release notes

  • The plugin resolves the Tailwind engine per CSS entry point from the consumer's project, so monorepo packages can use their own pinned versions and avoid version-drift lint results.

    1.9.0release notes

  • Derives deprecated v3 renames from the design system and owns those diagnostics, including renames absent from the former hardcoded table.

    1.5.0release notes

  • Scans arbitrary values for color literals, including shorthands, inset utilities, and arbitrary properties; quoted strings and url() contents are excluded.

    1.5.0release notes

  • Compiles variant chains to detect invalid variants and off-scale values that produce no CSS; suggestions are checked against the design system.

    1.5.0release notes

  • Autofix rewrites v3 background and object-position spellings to their v4 axis-first form.

    1.3.1release notes

  • Tailwind v4 project prefixes are detected automatically from entryPoint and validated in the correct position, with no extra configuration.

    1.2.0release notes

Tooling 4

  • Adds a plugin that starts the project's oxlint --lsp language server and checks edited files for errors before Claude finishes, sending Claude back once if errors are found.

    1.14.0release notes

  • Adds an opt-in rule that reports hardcoded values numerically equal to named design-system tokens and suggests the token; it is report-only and has no autofix.

    1.6.0release notes

  • Now suggests full shorthands for axis pairs: px-* py-* to p-* and mx-* my-* to m-*.

    1.1.0release notes

  • Rules that take options now declare meta.defaultOptions, allowing tooling such as IDEs and doc generators to read rule defaults without running the rule.

    1.0.0release notes

Fixes and other changes 68

  • The rule now finds a class wherever its selector puts it, allowing canonicalization reports and autofixes for variants such as in-*, *:, **:, and divide-* while still avoiding changes that alter the selector.

    1.15.1release notes

  • Relative components paths for no-borrowed-component-styles now resolve against each discovered oxlint config's directory.

    1.15.0release notes

  • Relative entryPoint values now resolve against each discovered oxlint config's directory, including JSONC and TypeScript configs.

    1.15.0release notes

  • Style declaration keys in style objects are skipped rather than read as Tailwind classes, preventing invalid-class reports for framework style objects.

    1.15.0release notes

  • When enabled with an engine lacking canonicalizeCandidates, canonical and v3-rename maps stay empty while other rules continue working instead of failing the whole precompute.

    1.14.0release notes

  • Uses one outermost-first variant ordering with or without an entry point; the ordering change can rewrite chains once when --fix is run.

    1.14.0release notes

  • Cache keys now include local @plugin and @config files and imported or plugin-loaded package versions, avoiding stale class lists after edits or upgrades.

    1.14.0release notes

  • Counts a template literal across its ${} parts as one class string and reports once; long templates can now exceed the configured maximum.

    1.14.0release notes

  • Classes and custom properties from local stylesheets imported up to four levels deep are now recognized, including classes in @layer components.

    1.14.0release notes

  • Only dark-variant classes that set a color require a light-mode base; non-color filters, display, border width, and opacity are no longer reported for lacking one.

    1.14.0release notes

  • Named group and peer markers remain valid when a custom variant selector names .group or .peer; only component classes Tailwind does not generate are refused.

    1.14.0release notes

  • Each file now uses its own config's rule options and settings, so overrides and nested configs apply to the intended files without leaking across files.

    1.14.0release notes

  • Insiders versions are treated as untested newer engines rather than rejected as too old, with a one-time notice before linting continues.

    1.14.0release notes

  • Rules and autofixes now leave text glued to ${} out of class checks and rewrites, preventing fixes from splitting runtime classes or moving fragments away from expressions.

    1.14.0release notes

  • Autofixes arbitrary values under variants, such as dark:bg-white/[.08] to dark:bg-white/8, while retaining the value-preserving check.

    1.13.0release notes

  • Canonicalizes arbitrary variants such as data-[open]: and min-[40rem]: when the rewrite preserves the value; selector-changing rewrites remain unchanged.

    1.13.0release notes

  • No longer reports a plain CSS-variable shorthand swap, leaving that change to enforce-consistent-variable-syntax and preventing duplicate diagnostics and autofix oscillation.

    1.12.0release notes

  • The rule no longer flags a responsive class that restores a property overridden by an intermediate class, preventing regressions in responsive layouts.

    1.11.1release notes

  • No longer reports tooLong when a line's single class alone exceeds printWidth, avoiding an unactionable warning.

    1.11.0release notes

  • Malformed classes are resolved one at a time, so one bad class no longer masks a real typo in the same batch.

    1.10.2release notes

  • Malformed classes are resolved one at a time, so one bad class no longer masks a real typo in the same batch.

    1.10.2release notes

  • Request failures are no longer cached as sticky errors; the next keystroke re-spawns and retries the worker.

    1.10.2release notes

  • The rule checks the base token before rewriting classes with modifiers, preventing destructive autofixes when the color has no named token while preserving legitimate rewrites.

    1.10.1release notes

  • Skips composition fragments and only evaluates strings it can identify as the final class list on a native host element, avoiding false-positive reports.

    1.10.0release notes

  • Skips composition fragments and only evaluates strings it can identify as the final class list on a native host element, avoiding false-positive reports.

    1.10.0release notes

  • The cache key now includes the engine version per entry point, preventing packages with identical CSS but different engines from poisoning each other's cache entries.

    1.9.0release notes

  • The rule checks the class count on each line independently instead of counting classes across the whole multiline block.

    1.8.0release notes

  • The fixer preserves each surviving line's class grouping when collapsing a shorthand pair, transferring a line break forward when needed.

    1.8.0release notes

  • The fixer preserves each surviving line's class grouping when removing duplicates, transferring a line break forward when the class that opened a line is removed.

    1.8.0release notes

  • Whitespace-only lines before an indented closing backtick are preserved, while a genuine single-line trailing space is still stripped.

    1.8.0release notes

  • In strict mode, off-scale percentage classes now receive order information instead of being pushed to the front of the attribute.

    1.7.1release notes

  • Custom utilities with open value types are no longer reported when Tailwind accepts their classes, while values the type refuses still report.

    1.7.1release notes

  • Off-scale percentages accepted by Tailwind are no longer reported as typos; percentages unsupported by a prefix, such as p-4%, still report.

    1.7.1release notes

  • A prefix quick-fix is no longer offered when adding the prefix cannot make a class valid; the class reports as unknown with a spelling suggestion instead.

    1.7.1release notes

  • Named markers under a project prefix now report as needing the prefix rather than receiving a spelling suggestion that could delete the marker name.

    1.7.1release notes

  • The rule recognizes named group and peer markers as required classes, preventing false diagnostics and quick-fixes that drop marker names.

    1.7.0release notes

  • The rule now scans resolved CSS imports when checking whether a variable is defined, preventing token suggestions that could change the design.

    1.6.0release notes

  • Skips v3 renames handled by no-deprecated-classes, avoiding duplicate diagnostics; keep both rules enabled to report those renames.

    1.5.0release notes

  • Adds the shipped logical/physical pairs, verifies suggested classes exist when a design system is available, and converts inset-s-* and inset-e-* spellings.

    1.5.0release notes

  • With an entry point, matches base and dark variants by declared CSS property, reducing false positives for pairs that use different spellings.

    1.5.0release notes

  • Only reports canonicalizations that emit byte-identical CSS, preventing literal arbitrary values from being rewritten to variable-backed tokens that can resolve differently.

    1.4.0release notes

  • Determines conflicts from emitted CSS declarations and cascade order, avoiding composition false positives and recognizing conflicts in classes with user-written values or previously missing precomputed properties.

    1.4.0release notes

  • With an entry point configured, classifies project-defined variants by their actual selectors, avoiding incorrect redundancy reports for variants targeting generated boxes.

    1.4.0release notes

  • Recognizes Tailwind v4 typed CSS-variable shorthand classes instead of flagging them as unknown.

    1.4.0release notes

  • Only proposes or autofixes a token rewrite when the token resolves back to the variable written, or that variable is undefined, preventing design-changing rewrites.

    1.4.0release notes

  • Bundled into the published package instead of being a peer dependency, so installing oxlint-tailwindcss no longer requires installing @oxlint/plugins separately.

    1.3.3release notesrelease notes

  • Relative string entryPoint values now resolve from the nearest enclosing .oxlintrc.json directory instead of the current working directory, so CLI and editor use the same package-local CSS.

    1.3.2release notes

  • Valid Tailwind v4 classes that getClassList() does not enumerate are no longer reported as typos.

    1.3.1release notes

  • Variants that change the selector target, including * and **, are now reordering barriers.

    1.3.0release notes

  • Prefix and variant order are now resolved per entry point, fixing monorepos with differing package settings.

    1.3.0release notes

  • Failed design-system loads are retried once per process instead of paying the initialization cost on every call.

    1.3.0release notes

  • The worker path now rounds rem/em/px floats so autofixes do not write imprecise values into source.

    1.3.0release notes

  • Autofixes now negate only plain numeric dimensions, avoiding invalid rewrites of calc() and var() values.

    1.3.0release notes

  • The rule no longer treats attribute order as determining CSS precedence or flags an exact duplicate as conflicting with itself.

    1.3.0release notes

  • The rule no longer reports idiomatic display or position pairs that set the same property under different names.

    1.3.0release notes

  • Invalid user regexes in patterns are skipped instead of crashing lint with a raw SyntaxError.

    1.3.0release notes

  • Suggestions now preserve the ! modifier and work behind variants.

    1.3.0release notes

  • Cache keys now include locally imported CSS so changes to an @import file do not serve a stale design system.

    1.3.0release notes

  • Stale precompute locks are reclaimed by exclusive rename to avoid a coordination race.

    1.3.0release notes

  • Synchronous worker failures now report their real cause instead of a misleading timeout.

    1.3.0release notes

  • Invalid user regexes are skipped instead of crashing lint with a raw SyntaxError.

    1.3.0release notes

  • Workers now propagate load-failure causes and guard against oversized responses.

    1.3.0release notes

  • The rule no longer reorders the project prefix out of first position, which could produce no CSS.

    1.2.0release notes

  • Precompute runs in a worker thread instead of forking the oxlint host, avoiding cold-cache ENOMEM failures on memory-constrained CI runners.

    1.0.1release notes

  • Design-system load failures are memoized, so repeated rule attempts no longer produce thousands of errors; failures are invalidated when the CSS changes.

    1.0.1release notes

  • Memory-related load errors now receive a memory-specific hint pointing to memory pressure, oxlint concurrency, or runner memory.

    1.0.1release notes

  • Class extraction now scans array values in tv(), cva(), and cn(), including nested arrays, strings, and ternaries, so rules no longer ignore those classes.

    1.0.0release notes

  • A content-hash-scoped file lock serializes cold-cache precomputation across parallel isolates, avoiding simultaneous Node forks that could exhaust memory.

    1.0.0release notes

oxlint-tailwindcss 0.87 changes

Behavior and default changes 2

  • Utilities from this plugin are recognized across all DS-dependent rules when the plugin is imported into the CSS entry point.

    0.8.0release notes

  • Utilities from this plugin are recognized across all DS-dependent rules when the plugin is imported into the CSS entry point.

    0.8.0release notes

Fixes and other changes 5

  • Same-prefix class pairs such as duration-300 and duration-500 now correctly report instead of silently passing.

    0.8.0release notes

  • Recognizes later classes that refine one property of a shorthand as composition, while preserving direction-sensitive conflicts.

    0.8.0release notes

  • Mask gradient combinations now compose correctly, while conflicts in the same gradient slot still report.

    0.8.0release notes

  • Stops flagging arbitrary color values that wrap CSS variables in color functions or fallbacks.

    0.8.0release notes

  • Handles multi-segment utilities so values such as bg-[var(--color-red-500)] autofix to bg-red-500.

    0.8.0release notes

oxlint-tailwindcss 0.75 changes

Breaking changes 1

  • The rule now checks legacy v3 class spellings that produce valid CSS in v4 and canonicalizes them instead of silently skipping them.

    0.7.1release notes

Fixes and other changes 4

  • Legacy v3 class spellings that produce valid CSS in v4 are added to the valid set, so this rule no longer flags them.

    0.7.1release notes

  • Autofix rules preserve whitespace separators when rebuilding multiline class strings, avoiding collapsing indentation into a single space.

    0.7.0release notes

  • When collapsing whitespace, the rule now preserves newlines and following indentation, preventing autofix oscillation with enforce-consistent-line-wrapping.

    0.7.0release notes

  • Fixes precompute child-process module resolution under pnpm strict hoisting by resolving the module from the plugin's install location.

    0.7.0release notes

oxlint-tailwindcss 0.66 changes

New APIs and options 1

  • Adds a setting, defaulting to 16, that controls px→named class conversion in enforce-canonical.

    0.6.0release notes

Performance 1

  • Linting is about 5x faster: named classes avoid a worker-thread round-trip, and remaining worker requests are deduplicated.

    0.6.3release notes

Behavior and default changes 1

  • enforce-canonical now dynamically canonicalizes arbitrary user classes using Tailwind's API, falling back to the precomputed cache if the worker is unavailable.

    0.6.0release notes

Fixes and other changes 3

  • Canonicalization now processes each class separately, preserving output order and length when inputs contain duplicate classes.

    0.6.3release notes

  • The plugin no longer emits this warning when running in multiple oxlint worker threads because the redundant exit listener was removed.

    0.6.2release notes

  • The rule now keeps pseudo-element variants innermost in both static and design system ordering modes, preventing broken CSS in Tailwind v4.

    0.6.1release notes

oxlint-tailwindcss 0.55 changes

New APIs and options 3

  • Set to oxlint-tailwindcss to see which design system is loaded for each file.

    0.5.0release notes

  • Set to true to log which design system is loaded for each file; logging is disabled by default.

    0.5.0release notes

  • Accepts an array of entry points; for each file, the plugin selects the entry point whose directory is closest in the filesystem tree, enabling monorepo configuration.

    0.5.0release notes

Tooling 2

  • Six rules now declare their default options in the rule schema, making defaults visible to tooling.

    0.5.0release notes

  • Ten rules now provide IDE quick-fixes for additional errors, including replacing unknown classes with a Levenshtein suggestion.

    0.5.0release notes