Why We Migrated from ESLint + Prettier to Biome — 40% Faster CI, Zero Config Drift
Biome's Rust-based lint+format in one tool cut our CI lint time from 82s to 48s and eliminated Prettier/ESLint config sync issues — but the rule parity gap means some custom ESLint plugins have no Biome equivalent yet.
Published 2026-06-17
Why We Migrated from ESLint + Prettier to Biome — 40% Faster CI, Zero Config Drift
TL;DR: Biome 1.9 replaced ESLint + Prettier + eslint-config-prettier in our monorepo — CI lint stage dropped from 82s to 48s, config files went from 12 to 1, and zero format-on-save disagreements. But eslint-plugin-import and eslint-plugin-jsx-a11y rules have no Biome equivalents; we keep a minimal ESLint pass for those. Full comparison →
The Context
Three-dev team, TypeScript/React/Next.js monorepo (4 apps, 6 shared packages). ESLint 8 + Prettier 3 + 12 config files (.eslintrc.js, .prettierrc, per-package overrides). CI runners: GitHub Actions ubuntu-latest, 2 vCPUs, 7GB RAM. Pain points: CI lint stage 82s avg, Prettier/ESLint format conflicts on PRs, eslint-config-prettier version drift, 3 devs with different editor format-on-save behavior.
What We Tested
| Tool | Use Case | Verdict | Why |
|---|---|---|---|
| Biome 1.9 (Rust) | Full repo lint + format (CI + local) | ✅ | Single tool, single config, 48s CI (40% faster), zero format conflicts |
| ESLint 9 + Prettier 3 (flat config) | Same repo, migrated config | ⚠️ | 78s CI, still 2 tools, flat config migration effort high |
| Biome + Minimal ESLint | Production: Biome for 95%, ESLint for a11y/imports | ✅ | Best of both: Biome speed + ESLint plugin coverage for gaps |
| Oxlint + Prettier | Speed-only alternative | ⚠️ | Oxlint 12s but no formatter; still need Prettier + config sync |
The Pivot Point
May 2026: PR #347 — Prettier formatted a ternary one way, ESLint prefer-arrow-callback wanted another. Three devs, three different editor outcomes. Merge blocked. Tried Biome 1.8 locally: biome check --apply fixed both lint + format in one pass, consistent across all editors. Migrated monorepo June 3–5: deleted 12 config files, added biome.json at root with extends: ["recommended"], per-package overrides for test files. CI: biome check --files-ignore-unknown=true replaced eslint . && prettier --check .. Result: 48s avg (was 82s), zero format conflicts since.
What We Use Now
Biome 1.9 as primary lint + format:
- Config:
biome.jsonat monorepo root,formatter: {enabled: true, indentStyle: "space", lineWidth: 100},linter: {enabled: true, rules: {recommended: true, suspicious: {noExplicitAny: "warn"}}} - Editor: Zed
formatter: "biome", VS Codebiomeextension,editor.formatOnSave: true - CI:
pnpm biome ci(fail on warning),pnpm biome format --write(auto-fix in dependabot PRs)
ESLint 9 (flat config, minimal) for plugin gaps only:
- Config:
eslint.config.mjswithplugin:@typescript-eslint/recommended,plugin:jsx-a11y/recommended,plugin:import/recommended - Runs:
pnpm eslint:pluginsin CI (separate job, 12s) — onlyjsx-a11yandimportrules - Rules disabled in Biome:
no-restricted-imports,jsx-a11y/*,import/*
When You’d Choose Differently
- ESLint + Prettier if you rely heavily on
eslint-plugin-import(alias resolution, cycle detection),eslint-plugin-jsx-a11y(comprehensive a11y), or custom internal plugins — Biome’s rule set covers ~70% ofeslint:recommendedbut plugin ecosystem is young. - Oxlint + Prettier if raw lint speed is the only metric — Oxlint is 4× faster than Biome lint but has no formatter, no autofix, no LSP.
- Rome (Biome’s predecessor) — deprecated, don’t use.
Tool Crucible Rating
| Dimension | Rating (1–5) | Notes |
|---|---|---|
| Overall | 4 | Single-tool DX win; plugin gaps prevent full migration for some teams |
| Ease of Use | 5 | One config, one CLI, one LSP, VS Code/Zed/Neovim support — drop-in for most |
| Value | 5 | Free, open-source, MIT, no telemetry, replaces 2 paid-tool-equivalents |
| Support | 4 | Active Discord, weekly releases, Biome 2.0 (2026 H2) promises plugin API |
This is part of our Toolchain Migration series. See full comparison: Biome vs ESLint + Prettier: Migration Guide for TypeScript Monorepos
Last reviewed 2026-06-17. See our methodology and affiliate policy.