Providers
One standard, three engines
Ultracite is a preset, not a linter. It sets up the toolchain you pick with the same strict rules, editor settings and agent instructions, and you can switch engines with one command.
RecommendedOxlint + OxfmtThe Oxc project’s Rust linter and formatter, with ESLint’s rule names and an API for ESLint plugins.474core rules344 msto check 420 filesUltracite for Oxlint
BiomeOne Rust binary that lints and formats from a single config file, with its own rule set.331core rules379 msto check 420 filesUltracite for Biome
ESLint + Prettier + StylelintThe JavaScript toolchain most projects started on, with every plugin ever written for it.918core rules15.5 sto check 420 filesUltracite for ESLint
Side by side
The same project, the same machine, each engine through Ultracite’s core preset.
| Property | |||
|---|---|---|---|
| Runs on | Native Rust binaries | One native Rust binary | Node.js |
| Rules on in the core preset | 474 | 331 | 918 |
ultracite check, 42 files | 340 ms | 257 ms | 3.91 s |
ultracite check, 420 files | 344 ms | 379 ms | 15.5 s |
| Rules that read types | 56, opt-in at setup | 7 project-wide rules, opt-in at setup | 132, opt-in at setup |
| ESLint plugins | Opt-in, through JS plugins | No | Any of them |
| Formatter | Oxfmt | Biome | Prettier, with its plugins |
Files init writes | oxlint.config.ts, oxfmt.config.ts | biome.jsonc | eslint.config.mjs, prettier.config.mjs, stylelint.config.mjs |
| Pick it for | Speed and breadth together: the default for new projects | One tool and one config file that lints, formats and sorts | Template linting in Vue and Svelte, Prettier plugins, niche ESLint plugins |
Ultracite 8.0.0. Times are medians of five runs of ultracite check on an Apple M1 Pro over the repo’s benchmark fixture, withOxlint 1.87.0 and Oxfmt 0.71.0; Biome 2.5.15; andESLint 10.12.0, Prettier 3.9.10 and Stylelint 17.16.0. They include starting Node and the CLI.
Choosing an engine
- Which engine should I pick?
- Start with Oxlint. It’s what
initrecommends: native speed, 474 rules in the core preset, ESLint’s rule names and type-aware rules on typescript-go. Pick Biome if you want one tool and one config file that lints, formats and sorts. Pick ESLint if you depend on an ESLint or Prettier plugin, or need Vue and Svelte templates linted. - Can I switch engines later?
- Yes. Run
npx ultracite init --linter biome(oroxlint, oreslint).initremoves the packages and config files it installed for the old engine, writes the new engine’s config, and merges into your.vscode/settings.jsoninstead of replacing it. - Do all three enforce the same rules?
- They aim at the same standard: type safety, React and hooks, accessibility, async code and imports. Names differ by engine (
noExplicitAnyin Biome,no-explicit-anyin Oxlint and ESLint), and ESLint turns on the most rules because the most plugins exist for it. - Is Biome faster than Oxlint?
- On a small project, yes: Biome checked 42 files in 257 ms and Oxlint with Oxfmt in 340 ms, because Biome lints and formats in one process while
ultracite checkon Oxlint runs Oxlint and then Oxfmt. At 420 files Oxlint was slightly ahead, 344 ms to Biome’s 379 ms. The ESLint toolchain went from 3.91 s to 15.5 s.
Ship less slop
One command sets up your linter, formatter, editor and agents. Works with Oxlint, Biome and ESLint.