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

DimensionBiome 2.5ESLint 10 + Prettier
Tools and configOne binary, biome.jsonTwo tools, eslint.config.* and a Prettier config
SpeedRust; one pass for lint and formatSlower; type-aware typescript-eslint rules cost the most
Rules561 built in, including React, a11y, and type-aware project rules (noFloatingPromises, noImportCycles)Core plus thousands of plugins
Custom rulesGritQL plugins (can attach fixes)JavaScript plugin API, any AST logic
FormatterJS, TS, JSX, JSON, CSS, GraphQL; HTML, Vue, Svelte, and Astro are experimental opt-in; tabs by defaultPrettier: broadest language and plugin support (Markdown, YAML, Tailwind class sorting)
Framework presetsSmaller catalogeslint-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.json replaces per-package glue.
  • You want to drop eslint-config-prettier and eslint-plugin-prettier and 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 internal eslint-plugin-company-* package. Biome ships useExhaustiveDependencies and useHookAtTopLevel, but its behavior differs from the ESLint originals.
  • Accessibility linting with eslint-plugin-jsx-a11y where 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 formatting
  • migrate eslint handles 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.indentStyle to "space" to match a Prettier config, or the first run rewrites every file.
  • Remove eslint, prettier, and their plugins; update lint-staged and CI to call biome 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.