Tailwind CSS: the README is 85 words and the build is Rust
Tailwind CSS scans project files for utility classes and generates the corresponding stylesheet without a runtime dependency.
At a glance
- What is it?
- The framework gets one centred line in the README, followed by three links. The repository documents none of it: no install command, no configuration example, no plugin list. What the tree does show is the shape of the build, a Rust workspace of crates wrapped in a pnpm monorepo with turbo, vitest and playwright.
- Who is it for?
- Use the Tailwind CSS repository when you want to read the implementation or contribute to it, not when you want to install the framework: the README carries no install command, no PostCSS snippet and no configuration reference, and the documentation site is what it points to. Check two things before you clone it.
- 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 4 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 September 29, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The README is 85 words, three headings and a badge row
Take away the logo, the centred tagline and the four badge links and very little is left. The framework is introduced in one line as a utility-first CSS framework for rapidly building custom user interfaces, and three headings follow. Documentation points at tailwindcss.com for full documentation, community points at the GitHub discussions for help, discussion and feature ideas, and contributing asks you to read the contributing docs before submitting a pull request.
Consequence: nothing operational lives here. There is no install command, no configuration example, no list of plugins and no migration note, so the repository cannot answer a single setup question. For a package with a registry entry and a documentation site that is a deliberate split rather than an oversight, but it does mean the source is the second place you look, never the first.
Utility classes are found by scanning files, so nothing runs in the browser
The whole mechanism fits in a sentence: Tailwind CSS scans project files for utility classes and generates the corresponding stylesheet, without a runtime dependency. What reaches the browser is a finished stylesheet produced before the page loaded, not a library that reads your markup at runtime and decides what to do with it.
Consequence: a class name has to exist as literal text in a file the scanner reads. A name written straight into a template is the supported case, and a name assembled at runtime out of fragments is not in the file when the scan happens, so the rule generates nothing. There is no error for that case, which means the failure reaches you as an element with no styling rather than as a build message naming the class.
The build is a Rust workspace of crates wrapped in a pnpm monorepo
Both toolchains sit at the top level and neither is hidden. The Rust side is Cargo.toml, Cargo.lock and rust-toolchain.toml, and the workspace itself is only this:
[workspace]
resolver = "2"
members = ["crates/*"]The JavaScript side is pnpm-workspace.yaml, pnpm-lock.yaml, turbo.json and vitest.config.mts, with directories for packages, integrations, playgrounds and patches. The release profile turns on lto.
Consequence: link time optimisation applies workspace-wide, so every crate under crates/ is compiled with it and a release build of any one of them costs more time than an ordinary one. The larger cost is for contributors: a change to JavaScript-facing behaviour still needs a Rust toolchain present, because the two halves are built and tested as one repository.
The root package is private and versioned 1.0.0, which is not what you install
The package.json at the root is named @tailwindcss/root, is marked private, and carries version 1.0.0. It also pins packageManager to [email protected] and declares the license as MIT, matching the LICENSE file. That version field is the only number in the repository that could be mistaken for a release number, and it is the one number that is not one.
Consequence: reading the manifest tells you nothing about which Tailwind CSS version a registry would hand you. The published line is only visible in the tags, where v4.3.1, v4.3.2 and v4.3.3 are dated 2026-06-12, 2026-06-29 and 2026-07-16. Anyone pinning a version for a build should read the tag list rather than the manifest.
cargo test runs before vitest, so a Rust failure hides the JavaScript results
Three scripts carry the day-to-day work:
"lint": "prettier --check . && turbo lint",
"build": "turbo build --filter=!./playgrounds/*",
"test": "cargo test && vitest run --hideSkippedTests",The test line is a shell and-and, so vitest runs only when cargo test exits clean. Separate entries exist for the integrations directory, for the browser package's UI tests, for a watch mode, and for benchmarks, and a vite script starts the vite-playground on its own.
Consequence: a contributor with no Rust toolchain installed cannot reach the JavaScript suite by running the test script, and a compile error in any crate suppresses every JavaScript result instead of appearing next to them. That is a slower first contribution than the package layout suggests.
Prettier is a gate, and two overrides make the diff wider than your change
The root package configures prettier rather than leaving defaults in place: `semi` off, `singleQuote` on, a `printWidth` of 100, and prettier-plugin-organize-imports in the plugin list. Two overrides widen it. tsconfig.json is parsed with the jsonc parser, and every file under integrations/ gets prettier-plugin-embed alongside the import organiser. Because lint runs `prettier --check .` before turbo lint, formatting is a gate rather than a preference.
Consequence: a contributor whose editor is not wired to those options gets reformatting diffs on files they never opened, and the check fails before any real linting happens. Running the format script once fixes it, but the short README never points a new contributor at that script, so the first pull request is where people find out.
The newest tag is two months older than the last push on main
The last push to main is dated 2026-09-25. The newest release, v4.3.3, is dated 2026-07-16, and the two before it sit a fortnight and a month earlier. Between those dates the default branch has moved past the tag, and nothing in the repository states which of the two a given build corresponds to.
Consequence: a registry install is a July build of the framework, so a bug reproduced on a clone is not automatically a bug in the installed version, and a fix you read in the source may not be in anyone's hands yet. The build script also excludes the playgrounds directory, so the example applications in the tree are not part of a normal build and have to be started through their own dev scripts.
Editorial conclusion
Use the Tailwind CSS repository when you want to read the implementation or contribute to it, not when you want to install the framework: the README carries no install command, no PostCSS snippet and no configuration reference, and the documentation site is what it points to. Check two things before you clone it. The root package.json is a private workspace package versioned 1.0.0, so it tells you nothing about the release a registry would hand you, where the newest tag is v4.3.3 from 2026-07-16 against a last push on 2026-09-25. And the test script runs cargo test before vitest, so a contributor without a Rust toolchain never reaches the JavaScript suite at all.
Frequently asked questions
What is Tailwind CSS used for?
It is a utility-first CSS framework for rapidly building custom user interfaces. It scans your project files for utility classes and generates the corresponding stylesheet, with no runtime dependency in the browser.
How do I install Tailwind CSS?
The README carries no install command. It points at tailwindcss.com for full documentation, and the published package is the one linked from the npm badge at the top of the README. The repository itself is where you read the implementation, not the setup.
How do I use Tailwind CSS with Vite?
The repository ships a playground for it rather than a guide. The root package.json defines a vite script that runs pnpm run --filter=vite-playground dev, and the build script filters the playgrounds directory out, so those example apps are excluded from a normal build.
How do I use Tailwind CSS v4?
The tags show the v4 line, with v4.3.1 released on 2026-06-12, v4.3.2 on 2026-06-29 and v4.3.3 on 2026-07-16. The README itself carries no v4-specific guidance and sends that question to tailwindcss.com.
How do I use Tailwind CSS with PostCSS?
postcss and postcss-import appear in the repository's development dependencies rather than in its published instructions, and no PostCSS configuration example appears anywhere in the README. The documentation at tailwindcss.com is what the README points to for setup.
Official sources
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.
[](https://hysenlabs.com/projects/tailwindlabs-tailwindcss)
Community notes