Unifying Lint and Format with Biome: A Practical Migration Guide
Learn how Biome replaces ESLint and Prettier with a single Rust‑based binary, see a concrete migration example, and understand the trade‑offs before adopting it in your JS/TS projects.
20 Mar 2026, 17:10 UTC

The Problem: Juggling ESLint and Prettier
Many JavaScript and TypeScript projects rely on two separate tools: ESLint for code quality rules and Prettier for code formatting. Keeping both in sync requires maintaining separate configuration files, ensuring that lint rules do not clash with formatting preferences, and running two commands (or a composite script) on every commit. This duplication adds cognitive overhead and can slow down CI pipelines, especially in large codebases where each tool spawns its own Node.js process.
Why Biome Solves It
Biome is a single binary written in Rust that combines linting and formatting into one cohesive toolchain. Its "formatter‑first" philosophy means the built‑in formatter is considered the source of truth; lint rules are written to avoid conflicts with that formatter, eliminating the need for eslint‑prettier‑style integration packages. Configuration lives in a single biome.json file, and because the core is compiled to native code, execution times are often significantly faster than the combined Node.js‑based tools.
Worked Example: Migrating a Small TypeScript Project
- Install Biome (run in the project root):
npm i -D @biomejs/biome - Initialize a basic configuration:
This creates anpx biome initbiome.jsonwith sensible defaults for formatting and a core set of lint rules. - Apply linting and formatting fixes:
Thenpx biome check --apply --write--applyflag tells Biome to fix lint‑auto‑fixable issues, while--writewrites formatting changes directly to the source files. No separate Prettier step is needed. - Verify the result: run
npx biome checkagain; it should report zero errors if the codebase conforms to the active rules.
Note: Replace npm with yarn or pnpm if your workflow uses those managers; the command structure stays the same.
Trade‑offs and Limitations
- Plugin ecosystem: Biome’s plugin system is still growing. While it covers many common rules, highly specialized ESLint plugins may not have direct equivalents yet.
- Parser strictness: The Rust‑based parser follows the latest ECMAScript specification closely. Some legacy JavaScript patterns (e.g., certain older decorators or non‑standard JSX extensions) might need minor code adjustments before Biome can process them.
- Migration effort: Moving from Prettier may introduce subtle formatting differences (e.g., trailing commas in object literals). Running
biome migratehelps surface those changes, but a visual diff review is recommended.
Actionable Next Steps
- Run
npx biome migrateon a project that already uses ESLint and Prettier to see what changes Biome would propose. - Benchmark performance: time
npx biome checkversus the combinednpm run lint && npm run formaton a representative slice of your codebase. - If the results are satisfactory, add Biome to your CI pipeline (e.g.,
biome check --ci) and remove the separate ESLint/Prettier steps.
By consolidating linting and formatting into one fast, Rust‑powered tool, Biome reduces configuration friction and can shorten feedback loops during development. Evaluate it against your project’s specific rule set and plugin needs, and you’ll likely find a simpler, quicker workflow.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.