Biome: Replace ESLint + Prettier with One Lightning-Fast Tool (2026)
Biome unifies linting and formatting into one blazing-fast tool. Learn how to set up Biome, migrate from ESLint + Prettier, integrate with CI, and use the VS Code extension.
Every JavaScript project eventually accumulates the same set of dev dependencies: ESLint for linting, Prettier for formatting, a pile of ESLint plugins, a shared config package, and a lint-staged setup that takes 10 seconds to run on pre-commit. It works. It’s also slow, complex, and requires constant maintenance.
Biome offers a different approach: one tool, one config file, sub-millisecond performance, and zero plugin dependencies. In 2026, it’s stable enough to replace ESLint + Prettier entirely in most TypeScript and JavaScript projects.
What Is Biome?
Biome (formerly Rome) is a high-performance toolchain for JavaScript and TypeScript written in Rust. It provides:
- A formatter that produces Prettier-compatible output
- A linter with 200+ rules covering correctness, style, and performance
- An import organizer that sorts and deduplicates imports
- A language server for editor integration (VS Code, Neovim, etc.)
Everything runs in a single binary with no npm dependencies at runtime. A full lint + format pass on a 100,000-line codebase takes under 1 second.
Installation
# npm
npm install --save-dev --save-exact @biomejs/biome
# pnpm
pnpm add --save-dev --save-exact @biomejs/biome
# yarn
yarn add --dev --exact @biomejs/biome
Using --save-exact pins the version—Biome treats its output as deterministic, so unexpected upgrades shouldn’t change formatting.
Initialize a config file:
npx @biomejs/biome init
This creates biome.json:
{
"$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
}
}
Running Biome
# Format files
npx biome format --write .
# Lint files
npx biome lint .
# Lint + format in one pass
npx biome check --apply .
# Check without writing (for CI)
npx biome check .
The check command runs the linter, formatter, and import organizer together—one command does everything.
Configuration Reference
Biome’s biome.json handles everything that previously required .eslintrc, .prettierrc, and .editorconfig:
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": {
"enabled": true
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100,
"attributePosition": "auto"
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"trailingCommas": "all",
"semicolons": "always",
"arrowParentheses": "always"
}
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"noUnusedVariables": "error",
"useExhaustiveDependencies": "warn"
},
"style": {
"noVar": "error",
"useConst": "error",
"useTemplate": "error"
},
"suspicious": {
"noConsoleLog": "warn",
"noExplicitAny": "warn"
},
"performance": {
"noAccumulatingSpread": "error"
}
}
},
"files": {
"ignore": ["node_modules", "dist", ".next", "coverage"]
}
}
Formatter Options
| Option | Default | Description |
|---|---|---|
indentStyle | "tab" | "tab" or "space" |
indentWidth | 2 | Spaces per indent level |
lineWidth | 80 | Max line length |
quoteStyle | "double" | "single" or "double" |
trailingCommas | "all" | "all", "es5", "none" |
semicolons | "always" | "always" or "asNeeded" |
Linting Rules
Biome ships with 200+ rules organized into categories. The recommended preset enables the most useful ones.
Key rule categories
Correctness — catches bugs:
{
"correctness": {
"noUnusedVariables": "error",
"noUnusedImports": "error",
"useExhaustiveDependencies": "warn",
"noConstantCondition": "error",
"noInvalidUseBeforeDeclaration": "error"
}
}
Style — enforces patterns:
{
"style": {
"noVar": "error",
"useConst": "error",
"useTemplate": "error",
"useShorthandFunctionType": "error",
"useSingleVarDeclarator": "error"
}
}
Suspicious — flags potentially problematic code:
{
"suspicious": {
"noExplicitAny": "warn",
"noDoubleEquals": "error",
"noConsoleLog": "warn",
"noArrayIndexKey": "warn"
}
}
Performance — prevents common performance anti-patterns:
{
"performance": {
"noAccumulatingSpread": "error",
"noDelete": "warn"
}
}
Inline rule suppression
// biome-ignore lint/suspicious/noExplicitAny: legacy API response
function parseResponse(data: any) {
return data;
}
// biome-ignore format: intentional alignment
const matrix = [
1, 0, 0,
0, 1, 0,
0, 0, 1,
];
Migration from ESLint + Prettier
Step 1: Remove ESLint and Prettier
npm uninstall eslint prettier \
eslint-config-prettier \
eslint-plugin-prettier \
@typescript-eslint/eslint-plugin \
@typescript-eslint/parser \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-import
# Remove config files
rm .eslintrc.js .eslintrc.json .prettierrc .eslintignore .prettierignore
Step 2: Install Biome
npm install --save-dev --save-exact @biomejs/biome
npx biome init
Step 3: Migrate your ESLint rules
Biome covers most common ESLint rules natively. Use the Biome migration tool:
npx @biomejs/biome migrate eslint --write
npx @biomejs/biome migrate prettier --write
This reads your existing .eslintrc and .prettierrc and generates equivalent biome.json configuration automatically.
Step 4: Update package.json scripts
{
"scripts": {
"lint": "biome check .",
"lint:fix": "biome check --apply .",
"format": "biome format --write ."
}
}
Step 5: Update lint-staged (if using)
{
"lint-staged": {
"*.{js,ts,jsx,tsx,json}": "biome check --apply --no-errors-on-unmatched"
}
}
CI Integration
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npx biome ci .
biome ci is identical to biome check but exits with a non-zero code if any issues are found and outputs JSON-compatible logs for CI systems.
VS Code Extension
Install the Biome VS Code extension.
Configure VS Code to use Biome as the default formatter:
// .vscode/settings.json
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
}
}
The extension supports:
- Format on save
- Inline diagnostics for lint errors
- Quick fixes and auto-fix on save
- Import organization
- Code actions for rule suppression
Performance Comparison
The performance difference between Biome and ESLint + Prettier is significant:
| Task | ESLint + Prettier | Biome |
|---|---|---|
| Lint 1,000 files | ~8s | ~0.2s |
| Format 1,000 files | ~5s | ~0.15s |
| Full check pass | ~13s | ~0.3s |
| Pre-commit hook (staged files) | 2–5s | <100ms |
| CI lint job | 30–60s | 3–8s |
Biome’s Rust implementation processes files in parallel without spawning Node processes, which accounts for most of the speedup.
What Biome Doesn’t Replace
Biome is not a complete replacement for every ESLint use case:
Still needs ESLint (or alternatives):
- Framework-specific rules (Next.js, Astro, SvelteKit)
- Accessibility rules (
eslint-plugin-jsx-a11y) - Complex custom rules written in JavaScript
- Storybook-specific linting
Biome’s current gaps:
- No support for
.vuefiles (use ESLint for Vue projects) - No CSS/SCSS linting (use Stylelint)
- No GraphQL linting
- Some TypeScript-specific ESLint rules aren’t ported yet
For most TypeScript/React/Next.js projects, these gaps won’t matter. For projects with heavy accessibility requirements, consider running both Biome (for performance) and eslint-plugin-jsx-a11y (for a11y rules).
Real-World Example: Next.js Project
Complete setup for a Next.js 14 project:
// biome.json
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": { "enabled": true },
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"trailingCommas": "es5",
"semicolons": "always"
}
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"useExhaustiveDependencies": "warn",
"noUnusedVariables": "error",
"noUnusedImports": "error"
},
"suspicious": {
"noExplicitAny": "warn"
}
}
},
"files": {
"ignore": [
".next",
"node_modules",
"public",
"*.config.js",
"*.config.ts"
]
}
}
// package.json
{
"scripts": {
"lint": "biome check .",
"lint:fix": "biome check --apply .",
"format": "biome format --write ."
},
"devDependencies": {
"@biomejs/biome": "1.9.4"
}
}
Summary
Biome is the best choice for most TypeScript and JavaScript projects in 2026:
- Faster: 10-50x faster than ESLint + Prettier
- Simpler: One tool, one config, zero plugin dependencies
- Comprehensive: Linting, formatting, import organization in one pass
- Compatible: Prettier-compatible formatting, supports most ESLint rules
- Editor support: First-class VS Code extension with format-on-save
The migration from ESLint + Prettier takes under an hour with biome migrate. The performance gain in local development and CI is immediate.
Use Biome as your primary tool. If you need framework-specific rules that Biome doesn’t cover, keep a minimal ESLint config for just those rules.
Check out the Biome documentation and explore related tools in the DevPlaybook toolbox.
50 CLI Commands That Save Hours Every Week
The exact Git shortcuts, file search tricks, Docker commands, and productivity hacks that senior developers use daily. Compiled from 5+ years of shipping production code.
- Git mastery (10 cmds)
- File & search wizardry
- Docker & DevOps tricks
- Process & network tools
- Productivity boosters
- macOS & Linux install guide
No spam. 1 email/week max. Unsubscribe anytime.
Found this guide useful? Check out our free developer tools.
Affiliate disclosure: Some links below are affiliate links — we may earn a small commission at no extra cost to you. Learn more.
Recommended Tools & Resources
DigitalOcean
$200 credit for new users. Simple, affordable cloud hosting for developers.
GitHub Student Pack
Free access to 100+ developer tools. Perfect for students and new devs.
Vercel
Deploy frontend apps instantly. Free tier is generous for side projects.
DevPlaybook Products
Boilerplates, scripts & AI toolkits to 10x your dev workflow.