Your CI pipeline spends 45 seconds on linting and formatting. Your IDE freezes for 2 seconds every time you save because ESLint is parsing your entire project. You maintain .eslintrc, .prettierrc, .editorconfig, and somehow they still conflict.
What if one tool handled linting AND formatting, ran in milliseconds, and needed zero configuration?
That's Biome. Written in Rust, designed to replace ESLint and Prettier simultaneously.
Performance: Biome vs ESLint + Prettier
| Operation | ESLint + Prettier | Biome | Speedup |
|---|---|---|---|
| Lint 1,000 files | 12.4s | 0.12s | 103x |
| Format 1,000 files | 3.8s | 0.05s | 76x |
| IDE save hook | 800ms | 8ms | 100x |
These aren't synthetic benchmarks — this is a real-world React project with TypeScript.
Quick Start
npm install --save-dev --save-exact @biomejs/biome
npx @biomejs/biome init
That creates a biome.json. You're done. No plugins, no presets, no extends chains.
One Command, Two Jobs
# Lint AND format — one command
npx biome check --write .
# Or separately:
npx biome lint .
npx biome format --write .
Configuration (When You Need It)
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": { "enabled": true },
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"complexity": {
"noForEach": "warn"
},
"suspicious": {
"noExplicitAny": "error"
}
}
},
"formatter": {
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
}
}
One file. No plugin installation. No peer dependency hell.
Migration From ESLint + Prettier
npx @biomejs/biome migrate eslint --write
npx @biomejs/biome migrate prettier --write
Biome reads your existing ESLint and Prettier configs and converts them. Most rules have direct equivalents.
200+ Lint Rules — No Plugins Needed
Biome includes rules from:
-
ESLint core —
no-unused-vars,no-console,eqeqeq -
typescript-eslint —
no-explicit-any,prefer-optional-chain -
eslint-plugin-react —
no-array-index-key,jsx-no-target-blank -
eslint-plugin-react-hooks —
rules-of-hooks,exhaustive-deps - eslint-plugin-import — organize imports, no duplicates
- eslint-plugin-a11y — accessibility checks
All built in. No npm install eslint-plugin-*.
IDE Integration
// .vscode/settings.json
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}
CI Setup
# .github/workflows/ci.yml
- name: Lint & Format Check
run: npx biome ci .
biome ci runs both lint and format checks in CI mode — exits with non-zero if anything fails.
When to Choose Biome
Choose Biome when:
- CI time matters — linting in <1s instead of 30s+
- You want one config file instead of three
- Plugin dependency management is draining your team
- You're starting a new project and want minimal tooling setup
Skip Biome when:
- You rely on highly specific ESLint plugins with no Biome equivalent
- Your team has extensive custom ESLint rules
- You need CSS/SCSS linting (Biome focuses on JS/TS/JSX/JSON)
The Bottom Line
Biome proves that "fast" and "correct" aren't tradeoffs. It's faster than ESLint, more consistent than Prettier, and simpler than both combined.
Start here: biomejs.dev
Need custom data extraction, scraping, or automation? I build tools that collect and process data at scale — 78 actors on Apify Store and 265+ open-source repos. Email me: Spinov001@gmail.com | My Apify Actors
Top comments (0)