DEV Community

@lukeocodes 🕹👨‍💻
@lukeocodes 🕹👨‍💻

Posted on Originally published at lukeocodes.dev on

Biome Replaced ESLint and Prettier in My Setup

Biome replaced ESLint and Prettier in my setup, and the config went from three files and a stack of dev dependencies to one biome.json. Biome is a Rust toolchain that lints and formats JavaScript, TypeScript, JSX, CSS, JSON and now Markdown, doing in a single binary what the biome eslint prettier split usually spreads across two tools with a plugin to keep them from fighting. The 2.5 line, 2.5.13 current in September 2026, crossed 500 lint rules and added cross-file linting.

I did not expect to switch. I had a working ESLint config I had tuned for years. Then I timed a lint-and-format run on a mid-size repo and the numbers were not close.

What replacing ESLint and Prettier looks like

One file does both jobs. Here is roughly what I run:

{
  "$schema": "https://biomejs.dev/schemas/2.5.13/schema.json",
  "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
  "formatter": {
    "enabled": true,
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 100
  },
  "linter": {
    "enabled": true,
    "rules": { "recommended": true }
  },
  "javascript": {
    "formatter": { "quoteStyle": "single", "semicolons": "asNeeded" }
  },
  "assist": {
    "actions": { "source": { "organizeImports": "on" } }
  }
}

Enter fullscreen mode Exit fullscreen mode

That replaces .eslintrc, .prettierrc, and the eslint-config-prettier plumbing that stops the two from disagreeing on style. The assist block even covers import organising, which used to be a third plugin. Then biome check --write . lints, formats, and organises imports in one pass.

You do not have to hand-write it either. biome migrate eslint and biome migrate prettier read your existing configs and port what they can map, so the starting point is your old rules, not a blank file.

Biome against ESLint and Prettier

The 2.5 release is where this stopped being a toy. It crossed 500 lint rules, promoted more than 70 from nursery to stable, and added cross-file linting that uses a module graph to catch things a per-file linter cannot, like a CSS class defined nowhere or imported and never used. There is a watch mode, a concise reporter that cuts token noise, and code fixes you can write into GritQL plugins.

Speed is the part you feel. A Rust binary formatting and linting in one pass, with no Node process startup per tool, changed how often I run it. I lint on save now without thinking about it.

The gaps I hit

This is not a clean sweep, and pretending otherwise would waste your afternoon.

Rule coverage is the real one. Biome has a lot of rules, but the ESLint ecosystem has thousands across plugins, and if you lean on a niche plugin, framework-specific or accessibility-heavy, you may not find an equivalent. Check your actual rule list against Biome's before you commit.

Type-aware linting is arriving but younger than typescript-eslint. 2.5.13 improved type-inference performance on libraries like Zod, so it is moving, but if your lint depends heavily on type information you will notice the difference. Markdown linting is the same story: GitHub Flavored Markdown parsing and a linter landed in the 2.5 line, and they work, but they are new. YAML and HTML parsers are still in development.

For most JavaScript and TypeScript projects, though, the answer is now boring in a good way. One tool, one config, faster runs, and I stopped maintaining the glue that kept ESLint and Prettier from arguing. That glue not existing anymore is most of the win.

Top comments (0)