Skip to main content
Software Engineering Daily

Biome and the Future of JavaScript Tooling

62 min episode · 2 min read
·
Emmanuel Stopa

Episode

62 min

Read time

2 min

Topics

Software Development, Product & Tech Trends, Crypto & Web3

AI-Generated Summary

Key Takeaways

  • Unified toolchain migration: Teams switching from ESLint plus Prettier to Biome can run `biome migrate eslint` and `biome migrate prettier` to auto-generate a Biome config matching prior settings. Running `biome lint --suppress` with a reason like "migration" suppresses all existing violations immediately, letting teams adopt Biome without fixing legacy issues first, then address lint errors progressively over time.
  • Type-aware linting without TypeScript compiler: Biome ships type inference that resolves types across files and dependencies without invoking the TypeScript compiler. This enables rules equivalent to TypeScript-ESLint's `no-floating-promises` and `no-unnecessary-conditions` with lower overhead. The engine uses a semantic model per file combined with the module graph to flatten expressions and infer value changes across scopes.
  • Module graph enables cross-file analysis: Biome's language-agnostic module graph collects all project files — HTML, CSS, JavaScript, Vue, Svelte, Astro — into a dependency tree before linting begins. This powers rules like no-import-cycles and a CSS class validator that checks whether every class referenced in component files is actually defined somewhere in the project's stylesheet assets.
  • Plugin system scope should stay narrow: Biome's GritQL-based plugin DSL is intentionally scoped to project-specific rules involving sensitive or codebase-specific logic. Broad plugin ecosystems, as seen with Webpack and ESLint, degrade performance and block innovation because maintainers cannot change internals without breaking third-party plugins. An upcoming minor release adds auto-fix code actions to GritQL plugins, enabling lightweight codemods inside the same tool.
  • Static, predictable configuration reduces maintenance burden: ESLint's v9 flat config rewrite addressed years of recursive, hard-to-debug configuration caused by dynamic plugin layering. Biome applies this lesson from the start: one config file with sensible defaults, no required plugins for basic use, and `biome init` to scaffold explicit defaults locally. Editor behavior via LSP matches CLI output exactly, eliminating environment-specific formatting discrepancies.

What It Covers

Emanuele Stopa, creator of Biome and senior systems engineer at Cloudflare, joins TypeScript-ESLint author Josh Goldberg to trace Biome's origins from the defunct Rome project, explain how Rust-based unified toolchains outperform JavaScript-based predecessors, and detail Biome's module graph architecture enabling cross-file lint analysis without the TypeScript compiler.

Key Questions Answered

  • Unified toolchain migration: Teams switching from ESLint plus Prettier to Biome can run `biome migrate eslint` and `biome migrate prettier` to auto-generate a Biome config matching prior settings. Running `biome lint --suppress` with a reason like "migration" suppresses all existing violations immediately, letting teams adopt Biome without fixing legacy issues first, then address lint errors progressively over time.
  • Type-aware linting without TypeScript compiler: Biome ships type inference that resolves types across files and dependencies without invoking the TypeScript compiler. This enables rules equivalent to TypeScript-ESLint's `no-floating-promises` and `no-unnecessary-conditions` with lower overhead. The engine uses a semantic model per file combined with the module graph to flatten expressions and infer value changes across scopes.
  • Module graph enables cross-file analysis: Biome's language-agnostic module graph collects all project files — HTML, CSS, JavaScript, Vue, Svelte, Astro — into a dependency tree before linting begins. This powers rules like no-import-cycles and a CSS class validator that checks whether every class referenced in component files is actually defined somewhere in the project's stylesheet assets.
  • Plugin system scope should stay narrow: Biome's GritQL-based plugin DSL is intentionally scoped to project-specific rules involving sensitive or codebase-specific logic. Broad plugin ecosystems, as seen with Webpack and ESLint, degrade performance and block innovation because maintainers cannot change internals without breaking third-party plugins. An upcoming minor release adds auto-fix code actions to GritQL plugins, enabling lightweight codemods inside the same tool.
  • Static, predictable configuration reduces maintenance burden: ESLint's v9 flat config rewrite addressed years of recursive, hard-to-debug configuration caused by dynamic plugin layering. Biome applies this lesson from the start: one config file with sensible defaults, no required plugins for basic use, and `biome init` to scaffold explicit defaults locally. Editor behavior via LSP matches CLI output exactly, eliminating environment-specific formatting discrepancies.
  • Rust selection driven by memory and WASM portability: Rome's TypeScript implementation consumed roughly eight gigabytes of memory bundling itself, hitting Node.js limits. Rust's ownership model manages memory without a garbage collector, resolving that ceiling. Rust also compiles to WASM via `wasm-bindgen` with minimal friction, enabling Biome's browser-based playground and potential embedding in other runtimes without maintaining a separate codebase.

Notable Moment

Stopa reveals that Biome's forced rebranding from Rome happened not by strategic choice but because the NPM publish tokens expired after the company shut down, making it impossible to release new versions. The team had resisted renaming due to the overhead involved, but an infrastructure failure made the move unavoidable.

Know someone who'd find this useful?

You just read a 3-minute summary of a 59-minute episode.

Get Software Engineering Daily summarized like this every Monday — plus up to 2 more podcasts, free.

Pick Your Podcasts — Free

Keep Reading

Books, tools, and gear mentioned in this episode

SignalCast may earn commission on purchases via these links. As an Amazon Associate, SignalCast earns from qualifying purchases.

Tools

  • BiomeBy guest
    Emanuele Stopa, creator of Biome and senior systems engineer at Cloudflare, joins TypeScript-ESLint author Josh Goldberg to trace Biome's origins from the defunct Rome project, explain how Rust-based unified toolchains outperform JavaScript-based predecessors, and detail Biome's module graph architecture enabling cross-file lint analysis without the TypeScript compiler.
  • Teams switching from ESLint plus Prettier to Biome can run `biome migrate eslint` and `biome migrate prettier` to auto-generate a Biome config matching prior settings.
  • Teams switching from ESLint plus Prettier to Biome can run `biome migrate eslint` and `biome migrate prettier` to auto-generate a Biome config matching prior settings.
  • Emanuele Stopa, creator of Biome and senior systems engineer at Cloudflare, joins TypeScript-ESLint author Josh Goldberg to trace Biome's origins from the defunct Rome project, explain how Rust-based unified toolchains outperform JavaScript-based predecessors, and detail Biome's module graph architecture enabling cross-file lint analysis without the TypeScript compiler.
  • Emanuele Stopa, creator of Biome and senior systems engineer at Cloudflare, joins TypeScript-ESLint author Josh Goldberg to trace Biome's origins from the defunct Rome project, explain how Rust-based unified toolchains outperform JavaScript-based predecessors, and detail Biome's module graph architecture enabling cross-file lint analysis without the TypeScript compiler.
  • Biome's GritQL-based plugin DSL is intentionally scoped to project-specific rules involving sensitive or codebase-specific logic.
  • Rust also compiles to WASM via `wasm-bindgen` with minimal friction, enabling Biome's browser-based playground and potential embedding in other runtimes without maintaining a separate codebase.
  • Broad plugin ecosystems, as seen with Webpack and ESLint, degrade performance and block innovation because maintainers cannot change internals without breaking third-party plugins.

More from Software Engineering Daily

We summarize every new episode. Want them in your inbox?

Similar Episodes

Related episodes from other podcasts

Explore Related Topics

This podcast is featured in Best Cybersecurity Podcasts (2026) — ranked and reviewed with AI summaries.

Read this week's Software Engineering Podcast Insights — cross-podcast analysis updated weekly.

You're clearly into Software Engineering Daily.

Every Monday, we deliver AI summaries of the latest episodes from Software Engineering Daily and 192+ other podcasts. Free for up to 3 shows.

Start My Monday Digest

No credit card · Unsubscribe anytime