Messy formatting, inconsistent styles, unused variables, unsafe
any types, unnecessary !important in CSS, and
avoidable runtime errors make code reviews painful and long-term maintenance exhausting. Linters and formatters exist
precisely to prevent this, but ironically, the tooling ecosystem around them has grown increasingly complex.
Tools like ESLint, Prettier, and Stylelint are excellent and battle-tested. I’ve used them extensively. But in many teams, configurations are either missing, too lenient, or so complicated that people quietly ignore them.
This is where Biome.js entered the picture for me.
The Problem with the ESLint + Prettier Setup
ESLint and Prettier were never designed to solve the same problem:- ESLint focuses on code correctness and best practices
- Prettier focuses purely on formatting
eslint-config-prettiereslint-plugin-prettier
- Conflicting rules - ESLint complains, Prettier rewrites
- Performance issues - linting slows down on large repos or weaker machines
- Configuration sprawl - rules spread across ESLint, Prettier, and multiple plugins
- Dependency fatigue - managing versions and compatibility becomes a chore
Why Biome.js Felt Different
I came across Biome.js while looking for ways to simplify this setup, not replace it blindly, but reduce the overhead.Biome is written in Rust and uses a custom parser and AST, which is why it’s noticeably faster than the typical Node-based toolchain. More importantly, it treats linting, formatting, and import organization as one cohesive problem, not three separate ones.
What stood out to me:
- One tool, one config, one CLI
- No formatting vs linting conflicts
- Very fast feedback loops
- Sensible defaults that actually work
- Clear, contextual diagnostics
- Git-aware by default (respects
.gitignoreautomatically)
Getting Started (Quickly)
I’ll usenpm here, but yarn, pnpm, or bun work just as well.
Install
bash
npm i -D -E @biomejs/biome-E flag is intentional. Formatters should be version-pinned. You don’t want a minor update reformatting half your codebase unexpectedly.
Initialize
bash
npx @biomejs/biome initbiome.json file with a solid default setup.
The one command you’ll use most
bash
biome check --writejson
{
"scripts": {
"hygiene": "biome check --write"
}
}Git Awareness (A Small but Huge Win)
One feature I didn’t fully appreciate until I used it: Biome is Git-aware out of the box.json
{
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true,
"defaultBranch": "main"
}
}.gitignoreis respected automatically- You can lint only what changed
- No need for extra tools like
lint-staged
bash
biome check --changed
biome check --staged
Editor Integration (VS Code)
Install the Biome extension from the VS Code Marketplace and configure it per workspace:json
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}"explicit" keeps things predictable for teams. Some prefer "always", but I’ve found explicit actions safer in shared codebases.
How I Think About biome.json
I won’t deep-dive into the config here, that’s documentation territory, but conceptually:
- Formatter → how code looks
- Linter → what’s wrong with the code
- Assist actions → optional automations (like sorting imports)
CI Command: biome check vs biome ci
| Feature | biome check | biome ci |
|---|---|---|
Auto-fix (--write) | ✅ Yes | ❌ No |
| Uses changed files | ❌ Optional | ✅ Default |
| Staged files | ✅ Yes | ❌ No |
| CI-friendly output | ❌ | ✅ |
- Use
biome checklocally - Use
biome ciin pipelines
Migrating Existing Projects
If you already run ESLint and Prettier in production, Biome doesn’t force a big-bang rewrite.bash
biome migrate eslint --write
biome migrate prettier --write- Migrate config first
- Suppress violations where needed
- Enable Biome in CI
- Gradually remove suppressions over time
biome.json files, which makes it practical for monorepos with different rules per workspace.
What Biome Still Doesn’t Cover (Yet)
Biome is promising, but it’s not magic.- Smaller rule ecosystem compared to ESLint
- JSON-only configuration (no dynamic JS configs)
- Some frameworks and languages are still evolving
So… Should You Switch?
I’d recommend Biome if:
- Performance matters (especially in CI)
- You’re tired of ESLint + Prettier coordination issues
- You’re starting a new project
- You want simpler tooling and faster onboarding
I’d stick with ESLint + Prettier if:
- You rely heavily on niche plugins (accessibility, security, etc.)
- Your org has deeply customized ESLint rules
- You need language support Biome doesn’t offer yet
My Take
For new projects, I’d start with Biome today without hesitation.For existing projects, migration is realistic and the payoff - simpler config, faster CI, better DX, usually shows up within a sprint or two.
The broader trend is clear: JavaScript tooling is moving toward unified, opinionated, and performant solutions. Biome fits squarely into that future.
The days of juggling ESLint, Prettier, and half a dozen plugins feel numbered, and honestly, I’m okay with that.