ADR-0002: Adopt Bun + Biome for JS/TS Services

Profile picture of David Flanagan
David Flanagan @rawkode
Adopted on May 9, 2025

Context

Currently, Rawkode Academy utilizes Deno and Bun for its JavaScript/TypeScript services. While Deno has served its purpose, several factors have led us to reconsider this choice and aim for a single runtime:

  • Sustainability Concerns: We have more confidence in the long-term sustainability and development trajectory of Bun compared to Deno.
  • Deno Deploy Issues: We have encountered operational issues with Deno Deploy.
  • Lack of Transparency: The Deno team’s roadmap has not been consistently transparent, and their responsiveness to GitHub issues has been lacking.

This ADR proposes migrating to Bun as the primary JavaScript/TypeScript runtime and Biome as the linter/formatter.

Bun offers several advantages:

  • Performance: Bun is designed for speed, offering faster startup times and execution.
  • Compatibility: It aims for broad Node.js compatibility, which can ease migration and integration with existing tools.
  • All-in-one Toolkit: Bun includes a test runner, bundler, and package manager, potentially simplifying our development toolchain.

Biome provides:

  • Integrated Tooling: It combines linting, formatting, and other development tools into a single, cohesive package.
  • Performance: Biome is also built with performance in mind.
  • Opinionated Defaults: While configurable, Biome’s strong defaults can help maintain code consistency across projects.

Goals / Non-Goals

Goals

  • Standardize on a single, modern JavaScript/TypeScript runtime (Bun) for all services.
  • Adopt a unified, performant linting and formatting tool (Biome).
  • Improve developer experience through faster tooling and a simplified toolchain.
  • Enhance long-term maintainability and confidence in our core JavaScript/TypeScript stack.
  • Reduce operational friction encountered with previous solutions (e.g., Deno Deploy).

Non-Goals

  • Achieving 100% feature parity with Deno if it compromises the adoption of Bun’s strengths.
  • Immediately migrating all existing services in a “big bang” approach (a phased approach is preferred).
  • Replacing other established backend languages or runtimes used within Rawkode Academy (e.g., Go, Rust) where they are a better fit. This ADR is specific to JS/TS services.
  • Exhaustively evaluating every possible JS/TS runtime and tooling combination. The focus is on the identified benefits of Bun and Biome.

Decision

We will adopt Bun as the standard runtime for all new and existing JavaScript/TypeScript services within Rawkode Academy. We will adopt Biome as the standard linter and formatter for all JavaScript/TypeScript projects.

A phased migration plan will be developed for existing services currently running on Deno. New services should be initiated using Bun and Biome from the outset.

Consequences

Positive

  • Improved Performance: Potentially faster build times, test execution, and application performance.
  • Simplified Tooling: Bun’s built-in features and Biome’s integrated nature may reduce the number of discrete development tools we need to manage.
  • Increased Developer Confidence: Aligning with a project (Bun) that we perceive as having a more robust and transparent future.
  • Enhanced Code Quality and Consistency: Biome’s strong linting and formatting capabilities will help maintain high standards.

Negative

  • Migration Effort: Existing Deno services will require time and effort to migrate to Bun. This includes adapting code, build scripts, and deployment processes.
  • Learning Curve: Developers will need to familiarize themselves with Bun and Biome, although the transition from Deno/other JS tools should be relatively smooth.
  • Ecosystem Maturity: While Bun is rapidly developing, its ecosystem might not be as mature as Node.js in all areas. This could present challenges for specific libraries or integrations. Biome is also a newer tool compared to established linters/formatters like ESLint and Prettier.
  • Potential Unknowns: As with any technology shift, there may be unforeseen challenges or incompatibilities that arise during implementation.

Alternatives Considered

  • Sticking with Deno: This was rejected due to the concerns outlined in the Context section (sustainability, Deno Deploy issues, lack of transparency).
  • Migrating to Node.js with ESLint/Prettier: While Node.js is a mature and stable platform, Bun offers potential performance benefits and a more integrated toolchain. Biome also offers a more unified approach compared to managing ESLint and Prettier separately.