Skip to content

Biome v2.3—Let's bring the ecosystem closer

The image, on the right, shows the mascot of the Biome project named Cookie, which is the Biome logo with eyes. On the left, the Vue, Svelte and Astro logos. The mascot has hearts on her, which shows that is in love with the three frameworks. The image, on the right, shows the mascot of the Biome project named Cookie, which is the Biome logo with eyes. On the left, the Vue, Svelte and Astro logos. The mascot has hearts on her, which shows that is in love with the three frameworks.

We’re excited to announce the release of Biome 2.3, bringing several features that have been highly requested by the community. This release marks a significant milestone in our journey to support the broader web ecosystem.

Once you have upgraded to Biome v2.3.0, migrate your Biome configuration to the new version by running the migrate command:

Terminal window
biome migrate --write

Biome 2.3 introduces full support for Vue, Svelte, and Astro files. This means you can now format and lint the JavaScript and TypeScript code inside <script> tags, as well as the CSS inside <style> tags in these frameworks. The HTML/template portions of these files are also parsed and formatted according to Biome’s HTML formatting rules.

This achievement wouldn’t have been possible without the great efforts of Core Contributor Member @ematipico @ematipico and Core Contributor Member @dyc3 @dyc3 .

This is a feature that many developers have been asking for, and we’re thrilled to finally deliver it. Achieving this has had its challenges, and it required extensive trials to get the architecture right based on the constraints of the toolchain.

However, this feature is marked as experimental for several important reasons. First, these frameworks have their own specific syntaxes and idioms that extend beyond standard HTML, CSS, and JavaScript. While we’ve done extensive work to handle many patterns, there are cases and framework-specific syntaxes that may not yet be fully supported (for example Svelte control-flow syntax, or Astro JSX-like syntax). We encourage you to avail of this new feature, and fine-tune it based on your needs and possible limitations found.

Please open a discussion if you find something that hasn’t been implemented, or an issue if there’s a parsing error that should be handled correctly.

To enable the feature, you’ll have to opt in the new html.experimentalFullSupportEnabled option:

biome.json
{
"html": {
"experimentalFullSupportEnabled": true
}
}

Additionally, you can configure specific formatting options for HTML content, such as whether to indent the content of <script> and <style> tags:

biome.json
{
"html": {
"formatter": {
"indentScriptAndStyle": true
}
}
}
file.vue
<script setup lang="ts">
const foo = "bar";
const foo = "bar";
</script>
file.svelte
<script lang="ts">
const foo = "bar";
const foo = "bar";
</script>
file.astro
---
const foo = "bar";
const foo = "bar";
---

By default, indentScriptAndStyle is set to false to match Prettier’s behavior.

With this release, we step into something new that needs to be addressed and discussed. In Biome you can configure each language as you see fit, which means that a project might end up with different formatting (as example).

In the following configuration file, JavaScript files are formatted using double quotes, while CSS files are formatted using single quotes.

{
"html": {
"format": { "enabled": true },
"experimentalFullSupportEnabled": true
},
"javascript" : {
"formatter": {
"quoteStyle": "double"
}
},
"css": {
"formatter": {
"quoteStyle": "single"
}
}
}

Why would someone want that? That’s not for us to answer, however with a configuration like this you would end with different quotes inside your HTML-ish files. This could cause inconsistencies inside the same. We created a GitHub discussion to understand if this is a problem, and if so, how Biome should solve it. Please let us know what do you think.

Biome 2.3 introduces a refined syntax for ignoring paths in your project, addressing important problems that arose since the introduction of multi file analysis and TypeScript inference.

When Biome 2.0 came out, we internally introduced the concept of “paths being indexed”. When a path is indexed, Biome parses it and updates the module graph and the type inference, if enabled.

However, we slowly came to the realization that multi-file analysis and type inference are very complex problems that can get out of hand easily.

For example, type inference can enter a very nasty loop where tons of types are recursively indexed, consuming a lot of memory.

As for multi-file analysis, the node_modules/ folder can be a rabbit hole, full of symbolic links with high depths and path names that exceed the maximum allowed characters.

Solving these complex problems takes time, a lot of testing and patience from us and the community. With this new syntax, users have now more control over what Biome can and can’t do.

With this release, two syntaxes are now available:

  • ! (single exclamation mark): Ignores the path from linting and formatting, but still allows it to be indexed by the type system. This is useful for generated files or third-party code that you don’t want to format or lint, but still need for type inference and imports.
  • !! (double exclamation mark): Completely ignores the path from all Biome operations, including type indexing. This is useful for files that should be entirely excluded from Biome’s analysis, such as dist/ folders.

This distinction is particularly important when working with TypeScript projects that rely on type inference from dependencies or generated code. By using !, you can exclude these files from formatting and linting while still maintaining correct type information across your project.

Here’s an example configuration:

biome.json
{
"files": {
"ignore": [
"!**/generated",
"!!**/dist"
]
}
}

In this configuration, files in the generated/ directory are ignored for formatting and linting but remain indexed for types and module graph, while files in dist/ directory are completely excluded from all Biome operations.

This is an important tool at your disposal that allows you to control Biome, and avoid possible slowness and memory leaks.

As result, the option files.experimentalScannerIgnores has been deprecated. We plan to remove this option in the next releases. Run the biome migrate command update your configuration file.

Great shoutout to Core Contributor Member @arendjr @arendjr for implementing this new feature.

Core Contributor Member @dyc3 @dyc3 worked really hard, and he shipped for us native support of tailwind files!

This is a opt-in feature of the CSS parser, and you can enable it using the new css.parser.tailwindDirectives option:

biome.json
{
"css": {
"parser": {
"tailwindDirectives": true
}
}
}
tailwind.css
@utility container {
margin-inline: auto;
padding-inline: 2rem;
}
@theme {
--color-*: intial;
}
  • Promoted noNonNullAssertedOptionalChain to the suspicious group
  • Promoted useReactFunctionComponents to the style group
  • Promoted useImageSize to the correctness group
  • Promoted useConsistentTypeDefinitions to the style group
  • Promoted useQwikClasslist to the correctness group
  • Promoted noSecrets to the security group

Removed nursery lint rule useAnchorHref, because its use case is covered by useValidAnchor.

The following rules are now a part of the react domain, and they won’t be enabled automatically unless you enabled the domain, or Biome detects react as a dependency of your closest package.json:

The flags --skip and --only have been enhanced, and they can accept lint domains too.

In the following example, the lint command runs only the rules that belong to the project domain:

Terminal window
biome lint --only=project

In the following example, the lint command runs all the rules that you configured, expect for the rules that belong to the test domain:

Terminal window
biome lint --skip=test

The init command now checks if the project contains ignore files and dist/ folders. If supported ignore files are found, Biome will enable the VCS integration, and if dist/ folder is found, it will exclude it using the new ignore syntax. This should help reducing the friction when starting with Biome:

{
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
}
}

Two new CLI reporters have been added:

We added the new CLI flags to better control Biome without relying on the configuration file. Here’s the list:

  • --format-with-errors: CLI flag that allows to format code that contains parse errors.
  • --css-parse-css-modules: CLI flag to control whether CSS Modules syntax is enabled.
  • --css-parse-tailwind-directives: CLI flag to control whether Tailwind CSS 4.0 directives and functions are enabled.
  • --json-parse-allow-comments: CLI flag to control whether comments are allowed in JSON files.
  • --json-parse-allow-trailing-commas: CLI flag to control whether trailing commas are allowed in JSON files.

The option lineEnding now has a variant called auto to match the operating system’s expected line-ending style: on Windows, this will be CRLF (\r\n), and on macOS / Linux, this will be LF (\n).

This allows for cross-platform projects that use Biome not to have to force one option or the other, which aligns better with Git’s default behavior on these platforms.

biome.json
{
"formatter": {
"lineEnding": "auto"
}
}
Terminal window
biome format --line-ending auto

More features and fixes have been shipped, like React v19 support, baseUrl support inside tsconfig.json, and moore. Refer to the changelog page for a detailed breakdown of the features.

I like where this is going, how can I help?

Section titled “I like where this is going, how can I help?”

I want to remind you that Biome is a project led by volunteers who like programming, open-source, and embrace the Biome philosophy, so any help is welcome 😁

If you are familiar with Biome and would like to contribute to its outreach, you can assist us by translating the website into your native language. In this dashboard, you can check the supported languages and if they are up to date.

Join our Discord server, and engage with the community. Chatting with the community and being part of the community is a form of contribution.

If you like the technical aspects of the project, and you want to make your way into the Rust language, or practice your knowledge around parsers, compilers, analysers, etc., Biome is the project that does for you!

There are numerous aspects to explore; I assure you that you won’t get bored. Here is a small list of the things you can start with:

If you believe in the future of the project, you can also help with a financial contribution, via Open Collective or GitHub Sponsors.

Additionally, the project provides an enterprise support program where a company you can employ one of the core contributors to work a specific aspect of the Biome toolchain.