Biome is the right choice for new projects and teams tired of ESLint/Prettier configuration complexity. It is written in Rust, runs about 100x faster than the JavaScript equivalents, and requires a single JSON config file. The tradeoff is that ESLint's plugin ecosystem does not carry over, which matters for teams using plugins like eslint-plugin-tailwindcss or highly customized rule sets.
What Biome Is
Biome is a toolchain for web development written in Rust. It provides a linter and formatter in a single binary. The formatter is Prettier-compatible: it produces the same output as Prettier for most code, so switching from Prettier to Biome should not change your codebase's formatting style.
Biome was originally called Rome. When the Rome project stalled, a fork called Biome continued development under a community organization. Biome has been actively maintained and is used in production by teams at large companies.
The speed advantage. Biome's Rust implementation is significantly faster than running ESLint and Prettier separately via Node.js. On a large TypeScript codebase (100,000+ lines), ESLint might take 30-60 seconds. Biome takes 1-2 seconds. In a tight feedback loop (run on file save, run in a pre-commit hook, run in CI), this speed difference is noticeable every day.
A single configuration file. ESLint and Prettier each have their own configuration file, and keeping them consistent (not conflicting) requires installing eslint-config-prettier to disable ESLint formatting rules. Biome collapses this into one biome.json.
Installation and Setup
npm install --save-dev --save-exact @biomejs/biome
npx @biomejs/biome init
The init command generates a biome.json with sensible defaults:
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"trailingCommas": "es5"
}
}
}
Add scripts to package.json:
{
"scripts": {
"lint": "biome lint ./src",
"format": "biome format --write ./src",
"check": "biome check --write ./src"
}
}
The check command runs both linting and formatting in one pass, which is the most common command to use.
VS Code Integration
Install the Biome VS Code extension:
{
"recommendations": ["biomejs.biome"]
}
Configure VS Code to use Biome as the default formatter for JavaScript, TypeScript, and JSON:
{
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}
Migrating from ESLint and Prettier
Biome provides a migration command that reads your existing ESLint and Prettier configurations and generates an equivalent biome.json:
npx @biomejs/biome migrate eslint --write
npx @biomejs/biome migrate prettier --write
These commands do not guarantee 100% feature parity. Some ESLint rules have no Biome equivalent. The migration output tells you which rules were not migrated and you decide whether to keep ESLint for those rules or accept the coverage gap.
After migration, run biome check --write on your entire codebase. Review the diff carefully: Biome may reformat code that ESLint/Prettier left alone, and some auto-fixes may be different.
Rule Coverage
Biome includes over 300 lint rules ported from ESLint core rules, typescript-eslint, eslint-plugin-react, eslint-plugin-react-hooks, and others. The recommended rule set enables the most commonly agreed-upon subset. Individual rules can be enabled, disabled, or configured to warn vs error.
The Plugin Gap: What You Lose
The most significant limitation of Biome is the lack of third-party plugin support. ESLint has thousands of plugins that extend its rule set. Important ones that do not have Biome equivalents:
eslint-plugin-tailwindcss sorts Tailwind utility classes in a consistent order and warns about invalid class names. If you use Tailwind (especially on a large team), this plugin is genuinely valuable. Biome has no equivalent. This is the single most common reason developers stay on ESLint.
eslint-import-resolvers and eslint-plugin-import provide rules about import ordering, unused imports, and import resolution. Biome's organizeImports sorts and removes unused imports, which covers most of the use cases.
eslint-plugin-jsx-a11y adds accessibility rules for JSX. Biome includes some a11y rules but not the full set from eslint-plugin-jsx-a11y.
When to Switch to Biome
New projects (clear win). Zero migration cost, better DX from day one, faster feedback loops.
Existing projects without heavy ESLint plugins. If your ESLint config uses only the recommended rule set and maybe typescript-eslint, migration is straightforward and the speed gain is immediate.
Existing projects with eslint-plugin-tailwindcss. Evaluate carefully. You can run Biome for linting and formatting and keep eslint-plugin-tailwindcss for class sorting only. This hybrid approach is common during the transition period until Biome adds Tailwind support.
Teams with highly customized ESLint configs. Migration cost is higher. Run the migration command, evaluate the coverage gaps, and decide if the speed gain justifies the lost rules.
Keep Reading
- Tailwind CSS Advanced Guide — what you lose in Tailwind class sorting when switching to Biome
- TypeScript for React Developers — TypeScript configuration that pairs well with Biome's linting
- CI/CD for Small Engineering Teams — integrating Biome checks into your CI pipeline
Pristren builds AI-powered software for teams. Zlyqor is our all-in-one workspace — chat, projects, time tracking, AI meeting summaries, and invoicing — in one tool. Try it free.