Open-source project
postcss/postcss avatar
postcss/postcss

postcss ships three syntax plugins whose own names promise a compile they refuse to do

Transforming styles with JS plugins

28,966 stars1,661 forksTypeScriptMIT

At a glance

What is it?
postcss is a tool for transforming styles with JS plugins, parsing CSS into an abstract syntax tree and handing that tree to plugins. It lints nothing, prefixes nothing, and minifies nothing on its own, and the plugin list includes three whose names imply compilation while their descriptions explicitly deny it, which is the sharpest edge in an otherwise predictable runtime.
Who is it for?
postcss suits a build that wants one transform pipeline with plugins chosen explicitly, and a team willing to read the plugin's own description rather than infer behavior from its name. It is a poor fit if you want SCSS or Less compiled, since the plugins with those names do not compile and only the Less engine variant does, and a poor fit if your bundler ignores the browser field and your code reaches for fs, path, or url.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • postcss/postcss28,966 ★ · -11
Star history
Repository2026-09-282026-11-13
postcss/postcss29k29k

-11 Stars in the last 46 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Three syntax plugins named for a preprocessor do not compile to CSS

The syntax section contains the trap. It lists postcss-scss as allowing you to work with SCSS, with a parenthetical that says but does not compile SCSS to CSS. It does the same for postcss-sass and postcss-less, each stated as working with the language and explicitly not compiling it to CSS. One entry does compile: postcss-less-engine, which is described as working with Less and DOES compile Less to CSS using true Less.js evaluation, and the capitalisation of DOES is doing the work. So the naming implies a preprocessor and the descriptions correct it, line by line. The consequence is concrete for anyone wiring a build: point the pipeline at an .scss file expecting compiled output and you get a syntax-aware pass, so the file still has to go through a real Sass compiler afterwards.

The browser field switches off five modules, including fs, path, and url

The manifest ships a browser map that replaces specific modules with false:

code
  "browser": {
    "./lib/terminal-highlight": false,
    "source-map-js": false,
    "path": false,
    "url": false,
    "fs": false
  },

The intent is that a browser bundle should not pull in Node's filesystem, path, or url implementations, nor source map generation, nor the terminal colour helper. Two consequences follow. The field is a bundler hint, so a tool that resolves modules through the exports map without reading browser entries can still pull those in and fail at build time rather than at runtime. And anything that reaches fs or path through a path not listed here is not covered, because the stubs are keyed by exact specifier. For a library that plugins extend, that is the boundary worth knowing before a plugin reaches for a file.

The exports map publishes lib/ internals and ships both module formats

The package entry provides two files, one per module system:

code
  "exports": {
    ".": {
      "import": "./lib/postcss.mjs",
      "require": "./lib/postcss.js"
    },

Below that, the map lists deep subpaths including ./lib/at-rule, ./lib/comment, ./lib/container, ./lib/css-syntax-error, ./lib/declaration, ./lib/fromJSON, ./lib/input, ./lib/lazy-result, ./lib/no-work-result, ./lib/list, ./lib/map-generator, ./lib/node, ./lib/parse, ./lib/parser, and ./lib/previous-map. Those look like internals, and they are reachable on purpose, which makes them a compatibility surface the project has to keep stable whether or not the names say internal. The other half is the format split: a consumer that bypasses the exports map and deep-requires a lib path directly gets whichever file that path names, not the one the conditions would have chosen.

One author in the manifest, a consultancy in the readme, three funding rails

The maintenance picture is split across three files and they do not say the same thing. The manifest author field names a single person, Andrey Sitnik. The README says PostCSS is built by Evil Martians, described as an American design and engineering consultancy for developer tools, AI, and cybersecurity startups. The funding array has three entries: Open Collective, Tidelift at tidelift.com/funding/github/npm/postcss, and GitHub Sponsors. The consequence for anyone asking who maintains this is that the answer is a company with commercial customers, not a volunteer list, and that a Tidelift entry means there is a paid maintenance channel aimed at companies using the package commercially, sitting beside community funding. That is a healthier answer than a single maintainer, and it is a different one.

The sponsorship block still contains an unfinished editing note

Between the funding links and the plugins list there is a sponsor block, and it reads as if it were pasted in and not finished. The promotional line says CodeRabbit: agentic change management, with Review, prioritize, understand and secure your PRs, and then the trailing sentence let me know if this text is good. That is a note to a collaborator, left in the published file. It is a small thing and it has no effect on the code, but it is worth reading for what it says about the page: the sponsorship and advertising sections are hand-maintained copy rather than something generated, and the project's own funding links are the Open Collective and GitHub Sponsors entries. If you are deciding where to send money, the manifest is the more reliable of the two sources.

Two hundred plugins, and postcss itself does none of the work they do

The plugin categories are the real feature list, and they make the division of labour clear. Solve Global CSS Problem covers postcss-use for scoping plugins to one file, postcss-modules and react-css-modules for selector isolation, postcss-autoreset, postcss-initial, and cq-prolyfill. Use Future CSS Today covers autoprefixer, which pulls its data from Can I Use, and postcss-preset-env. Better CSS Readability covers postcss-nested, postcss-sorting, postcss-utilities, and short. Images and Fonts covers postcss-url, postcss-sprites, font-magician, postcss-inline-svg, postcss-write-svg, webp-in-css, and avif-in-css. Linters and Other cover stylelint, stylefmt, doiuse, colorguard, cssnano, lost, and rtlcss. So the claim that Wikipedia, Twitter, Alibaba, and JetBrains use postcss is a claim about the runtime being present, not about a feature set, and every behaviour is a plugin you select and configure yourself.

Two patches on one day, a three-week gap, and both inside 8.5.x

The release trail is 8.5.30 on 2026-10-12, 8.5.31 on 2026-10-18 and 8.5.32 on 2026-10-26, and the manifest version matches the newest tag at 8.5.32, so here the package metadata and the tags agree. The cadence is still worth noting: fixes land on the 8.5 line, so an older minor is not receiving them. The repository layout explains the rest of the workflow. Linting is eslint.config.mjs, formatting is oxfmt.config.ts, the lockfile is pnpm-lock.yaml with a pnpm-workspace.yaml beside it, and the plugin catalogue and the plugin authoring guide are both in the repository under docs/, as plugins.md and writing-a-plugin.md. That is where you go when you want to write a plugin rather than choose one.

Editorial conclusion

postcss suits a build that wants one transform pipeline with plugins chosen explicitly, and a team willing to read the plugin's own description rather than infer behavior from its name. It is a poor fit if you want SCSS or Less compiled, since the plugins with those names do not compile and only the Less engine variant does, and a poor fit if your bundler ignores the browser field and your code reaches for fs, path, or url. Before you commit, read the parenthetical in each syntax plugin's description, check that your bundler honors the browser stubs, pin the 8.5 line rather than an older minor, and treat the deep exports under lib/ as public API because the package map publishes them.

Frequently asked questions

What is PostCSS used for?

It transforms styles with JS plugins. Those plugins can lint CSS, support variables and mixins, transpile future CSS syntax, and inline images, working by taking a CSS file and exposing an API that analyzes and modifies its rules after they are parsed into an abstract syntax tree.

What is the difference between PostCSS and CSS?

CSS is the stylesheet language. PostCSS is a tool that takes a CSS file, parses it into an abstract syntax tree, and hands that tree to plugins for analysis and modification, which is why it can do things a plain stylesheet cannot do by itself.

What is the latest version of PostCSS?

8.5.32, published 2026-10-26, with 8.5.31 on 2026-10-18 and 8.5.30 on 2026-10-12. The version field in the package manifest also reads 8.5.32, so the published metadata and the newest tag agree.

What is PostCSS in SCSS?

There is a postcss-scss plugin, and its own description says it allows you to work with SCSS but does not compile SCSS to CSS. The same holds for postcss-sass and postcss-less, while postcss-less-engine does compile Less to CSS using true Less.js evaluation.

how to add postcss plugin

A plugin works against the API postcss exposes for analyzing and modifying rules after they are parsed into an abstract syntax tree. The authoring guide lives in the repository at docs/writing-a-plugin.md, and the catalogue of more than 200 existing plugins is at docs/plugins.md.

how to install postcss

The package is published to npm as postcss, at version 8.5.32, with its main entry at ./lib/postcss.js and separate import and require conditions pointing at an .mjs and a .js file.

Official sources

  1. License: MIT
  2. postcss/postcss on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/postcss-postcss.svg)](https://hysenlabs.com/projects/postcss-postcss)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/postcss-postcss.svg)](https://hysenlabs.com/projects/postcss-postcss)

Was this useful?