CSS Tooling in 2026: A Parser Grew 130× and a Linter Grew 2.4×
Most writing about tool adoption rests on surveys asking developers what they use. This page uses a different instrument: the npm downloads API, which records what build machines installed.
The window is 2024-10-01 to 2026-10-10, pulled 2026-10-12. "First" is the first 30 days, "last" the final 30. Swap the package name at the end of that URL to check any figure here — it takes about a minute, and I would rather be checked than trusted.
The table
| Package | First 30 days | Last 30 days | Change |
|---|---|---|---|
lightningcss | 5.795M | 751.5M | +130× |
tailwindcss | 46.27M | 596.2M | +12.9× |
postcss | 323.0M | 1342.0M | +315% |
cssnano | 47.61M | 84.77M | +78% |
stylelint | 20.65M | 50.47M | +144% |
Installs, not people. All five numbers are my own pulls, not quoted from anywhere.
Read the ordering, not the extremes
Something installing 5.795M times a month installing 751.5M times a month is a 130× increase. postcss grew 4.2×. stylelint grew 2.4×. cssnano grew 1.8×.
The ordering is informative but not clean, and I would rather show the wrinkle than smooth it out: the two packages that parse and rewrite CSS take the top of the table, and the two at the bottom are the linter (+144%) and the minifier (+78%). The minifier being below the linter is what breaks the tidy version of my argument, and it stays in this page for exactly that reason.
What I think it means
Parsers are being vendored, not chosen. A 130× rise in one npm package is not 130× more developers deciding to adopt a CSS library by hand. It is a dependency that other tools now ship inside themselves — bundlers, build tools, and CSS frameworks compiling the parser in rather than exposing it. When a low-level dependency outruns everything built above it, the tools above are swapping internals underneath their own users.
The linter is the sharpest signal, even though it is no longer the slowest row. stylelint at +144% is the only tool here whose job is to judge your CSS rather than transform it. It grows roughly with the number of projects. The parser grew 130× against that — roughly fifty times faster. My reading: CSS is increasingly written by something that is not a person with opinions about your formatting, and that thing consumes parsers, not linters. A generator does not read your Stylelint config.
cssnano at +78% is the counter-example I cannot explain away. It is a minifier — a transformation, so it should have ridden the same wave, and it grew the least of any transform here, landing below the linter. The likeliest answer is substitution rather than disuse: minification is moving into tools that do it natively (often via the very parser at the top of this table) instead of as a PostCSS plugin. If that is right, cssnano's flat line is not declining interest in minified CSS; it is minification leaving the plugin ecosystem. I hold that loosely — it is consistent with the data, and the data does not test it.
What these numbers cannot tell you
- A framework's adoption can inflate a dependency's number past recognition.
tailwindcssat +12.9× andlightningcssat +130× in overlapping windows should make you suspicious of any clean story. I checked whether thelightningcssnpm package is what a Tailwind install pulls:npm view [email protected] dependenciesis empty, and the published npm package only ships optional platform binaries. So the npmlightningcssdownload is not, on that evidence, a proxy for Tailwind installs — but I could not reach the Rust crate manifest to check the deeper dependency edge, so I cannot rule the confound out. Treat the 130× as a ceiling on vendoring, not a measurement of independent adoption. - Downloads are not users. CI runners re-download. One developer on a monorepo with 40 packages can generate 40 download events.
cssnanoandstylelintsit in pipelines that are being replaced, not emptied, so their slopes describe plugin-era survival more than CSS health.
What to do with it
- If you choose a minifier in 2026: pick one built on a parser. A minifier that tokenises strings cannot eat
content: "x/*y*/z". This site's own minifier is textual and can — see About for the exact case, which I measured rather than imagined. - If you run Stylelint in CI, keep it. It is the slowest-growing tool in this table precisely because it protects the thing that is getting rarer: a human whose CSS is reviewed.
- Do not read any row as "CSS is dying."
postcssat 1.34B installs in a single month is the opposite of dying. What is changing is who writes the input. - Expect a format war you cannot win. When most CSS is machine-written, style conventions become tool contracts. Pin one formatter and stop arguing.
Numbers pulled from the npm downloads API on 2026-10-11, 30-day windows, from this machine. If your conclusion depends on one of these, re-pull it — the window slides, and these figures have a shelf life.