Skip to content

ADR 0014: Biome over ESLint + Prettier

  • Status: Accepted
  • Date: 2026-04-14
  • Deciders: Ideony team

Ideony is a TypeScript monorepo. Lint and format tooling runs on every commit (Husky + lint-staged) and in CI. The classic ESLint + Prettier combination requires two config files, two dependency trees, plugin versioning conflicts, and noticeable slowness on large diffs. A simpler, faster alternative was evaluated.

Use Biome as the single lint and format tool across the monorepo. Biome replaces both ESLint and Prettier: one binary, one config file (biome.json), sub-second lint+format on full repo. Husky pre-commit hook runs biome check --write via lint-staged. useImportType is disabled globally (NestJS DI needs runtime class references). unsafeParameterDecoratorsEnabled is set for NestJS parameter decorators.

  • Single tool replaces two; eliminates ESLint/Prettier version conflict surface.
  • Biome written in Rust — lint+format on full monorepo in <1s vs 5–15s for ESLint+Prettier.
  • Zero-warning policy enforced: Biome errors block commit via lint-staged.
  • biome.json checked in — deterministic formatting across all contributors and CI.
  • Biome rule coverage lags ESLint ecosystem (no eslint-plugin-react-hooks equivalent at full parity — some rules absent).
  • useImportType OFF means some import type opportunities are missed; acceptable tradeoff for NestJS DI compatibility.
  • Developers coming from ESLint must learn Biome rule names and override syntax.
  • ESLint + Prettier — rejected: slow, two-config maintenance overhead, frequent peer-dep conflicts, especially painful in monorepo with mixed NestJS + Expo packages.
  • oxlint — rejected: format support immature at decision date; Biome more complete.
  • dprint — rejected: formatter only, no lint; would still require ESLint.