Overview
Use Biome for new TypeScript and JavaScript projects that want one tool and one config; keep ESLint plus Prettier when the lint rules you depend on live in ESLint plugins. As of 2026-10-01 Biome is at 2.5 (561 lint rules, type-aware rules, GritQL plugins) and ESLint is at 10.x (flat config only). The old gap in rule coverage has narrowed but not closed.
Comparison
| Dimension | Biome 2.5 | ESLint 10 + Prettier |
|---|---|---|
| Tools and config | One binary, biome.json | Two tools, eslint.config.* and a Prettier config |
| Speed | Rust; one pass for lint and format | Slower; type-aware typescript-eslint rules cost the most |
| Rules | 561 built in, including React, a11y, and type-aware project rules (noFloatingPromises, noImportCycles) | Core plus thousands of plugins |
| Custom rules | GritQL plugins (can attach fixes) | JavaScript plugin API, any AST logic |
| Formatter | JS, TS, JSX, JSON, CSS, GraphQL; HTML, Vue, Svelte, and Astro are experimental opt-in; tabs by default | Prettier: broadest language and plugin support (Markdown, YAML, Tailwind class sorting) |
| Framework presets | Smaller catalog | eslint-config-next, Vue, Angular, Astro, and others |
Pick Biome when
Pick Biome when one fast tool beats a deep plugin catalog.
- Greenfield TypeScript, React, or Node projects and monorepos where one root
biome.jsonreplaces per-package glue. - You want to drop
eslint-config-prettierandeslint-plugin-prettierand the version matrix around them. - Type-aware rules are enabled through Biome’s project domain. This runs an opt-in scanner that builds the module graph; expect added cost on large repos.
- Next.js 16 removed
next lint; run Biome or ESLint directly.
Pick ESLint plus Prettier when
Pick ESLint when a rule, preset, or custom plugin has no Biome equivalent.
- Rules from
eslint-plugin-react-hooks,eslint-plugin-boundaries, or an internaleslint-plugin-company-*package. Biome shipsuseExhaustiveDependenciesanduseHookAtTopLevel, but its behavior differs from the ESLint originals. - Accessibility linting with
eslint-plugin-jsx-a11ywhere compliance matters; Biome’s a11y rules cover a subset. - Framework presets such as
eslint-config-next, or Prettier plugins for Markdown, YAML, and Tailwind class sorting. - A codebase with a tuned ESLint config where lint speed is not a daily cost.
- Hybrid is valid: set
"linter": { "enabled": false }and use Biome only as the formatter, or keep ESLint for the few plugin rules and Biome for the rest.
Migrate from ESLint and Prettier
Run the migration commands, then review the diff and the dropped rules.
npx @biomejs/biome migrate eslint --write # reads legacy or flat config
npx @biomejs/biome migrate prettier --write
npx @biomejs/biome check --write . # apply safe fixes and formattingmigrate eslinthandles typescript-eslint, jsx-a11y, React, and Unicorn plugin rules. Rules that Biome only “inspired” are skipped unless you pass--include-inspired. Behavior differs slightly from ESLint even for migrated rules.- Biome defaults to tabs; set
formatter.indentStyleto"space"to match a Prettier config, or the first run rewrites every file. - Remove
eslint,prettier, and their plugins; updatelint-stagedand CI to callbiome check.
FAQ
Can Biome replace ESLint and Prettier?
For new projects, yes: Biome 2.5 lints and formats in one binary with 561 built-in rules. Keep ESLint when a rule, preset, or custom plugin you depend on has no Biome equivalent.
Is Biome faster than ESLint?
Yes; Biome is a Rust binary that lints and formats in one pass, while ESLint with Prettier is slower and its type-aware typescript-eslint rules cost the most. Biome’s own type-aware rules run an opt-in scanner that adds cost on large repos.
Why did Biome reformat every file after migrating?
Biome defaults to tabs. Set formatter.indentStyle to "space" to match a Prettier config before the first run.
Can I use Biome and ESLint together?
Yes; use Biome only as the formatter with "linter": { "enabled": false }, or keep ESLint for the few plugin rules and Biome for the rest.