npm / @biomejs/biome
@biomejs/biome
What changed in @biomejs/biome 2, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.
10 breaking4 security40 new APIs and options17 performance13 behavior and defaults18 tooling143 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli init@biomejs/biome 2245 changes
Breaking changes 10
The CLI now emits an error when the configuration has errors.
Configuration file errors are no longer silently ignored and are checked before any command executes.
Now reports mismatched closing tags and top-level closing tags without openings; tag names are matched case-insensitively.
The rule now reports directives inside Astro template expressions.
Reports React Compiler diagnostics regardless of the React version declared in package.json.
Removes special HTML formatter handling for the obsolete listing element.
Combining readonly and accessor modifiers in either order now reports that they cannot be used together.
Biome now reports HTML comments between Svelte tag attributes as parse errors.
Braces inside Astro
<math>elements no longer open expressions, so LaTeX such asR^{2x}survives as text;<svg>is unaffected.HTML
styleattribute values are parsed as CSS, and all Biome CSS lint rules are applied to them.
Security 4
Restricts access to the Unix daemon socket to the Biome user; it is stored in a user-accessible cache directory and uses mode 0600.
Unix daemon socket permissions are now restricted.
Biome reports a diagnostic for excessively deep syntax instead of overflowing the native stack while releasing the parsed tree.
A new nursery rule disallows Astro's set:html directive because untrusted content can introduce cross-site scripting vulnerabilities.
New APIs and options 40
Markdown now supports suppressions.
Added the noAstroConflictingSetDirectives rule for .astro files.
Added the noMeaninglessVoidOperator lint rule.
Added the noMisplacedListElements lint rule.
Added the noSelfImport lint rule.
Added the noSvelteExportLet lint rule.
Added the noTailwindRawColors lint rule.
Added the useLogicalProperties lint rule.
Added the usePromiseRejectErrors lint rule.
Added the useStrictBooleanExpressions lint rule.
Added the useSvelteKitRuneImports lint rule.
YAML formatting now supports suppression comments.
GritQL plugins can use contains on import-clause metavariables in import patterns.
Adds the Markdownlint MD040 rule for fenced code language declarations.
Implements the noJsonUnsafeValues JSON lint rule.
Adds the noObsoleteTags lint rule.
Adds the noReturnInFinally lint rule.
Adds the noSvelteAtDebugTags lint rule.
Adds the noSvelteAtDebugTags lint rule.
Adds @shadcn/lint as a lint rule source.
Adds the useConsistentFunctionStyle lint rule.
Implements the useConsistentObjectKeys JSON lint rule.
Adds the requireExplicitCase option to useExhaustiveSwitchCases.
Implements the useValidTestTitle lint rule.
Adds parsing support for GitHub Flavored Markdown.
Adds code fix mutation support for plugins.
Adds rule context support for plugins.
Adds semantic model support for plugins.
Adds JavaScript traversal methods for plugins.
Adds the Markdown MD025 single top-level heading rule.
JavaScript plugins now support TypeScript.
JavaScript plugins can query AST nodes by their kind.
JavaScript plugins gain runtime AST bindings.
Markdown frontmatter parsing support was added.
JavaScript plugins can be enabled in WASM through the
unstablefeature.biome rage now includes BIOME_BINARY in its environment variable metadata.
biome rage now includes BIOME_LOG_FILE in its environment variable metadata.
A new nursery rule reports Astro client:only directives without an initializer.
Added support for the SCSS nesting combinator.
Added the
useTopLevelHeadingrule.
Performance 17
The HTML formatter is up to 4x faster.
Indexing and analysis of big files are up to 2x faster, especially in projects using project and types lint rules.
Type inference is significantly faster, with benchmark speedups of about 2–240x for some popular libraries, affecting all rules that use type information.
Improves formatting performance for documents containing many HTML-native or SVG-native tags.
Formatting and checking large parenthesized object expressions no longer exhibit quadratic slowdowns.
Improves formatter performance by up to approximately 50% in some cases.
Improves linting performance for large CSS and JSON files.
Improves type inference performance by avoiding resolution of unused members in object arguments.
Calls to non-Promise methods on third-party TypeScript classes are classified using targeted type information instead of expensive full type inference.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Rule performance was improved.
Behavior and default changes 13
Type lowering now handles computed members and infers symbol-keyed access.
Watched-file patterns are scoped to each workspace folder, with deprecated rootUri fallback and compatible absolute glob patterns for clients without relative-pattern support.
When plugins fail to load, Biome prints each failing plugin's path on its own line instead of concatenating error messages.
Type lowering now handles readonly types and infers const generics.
SCSS now supports interpolation in containers, layers, property names, and the attr function.
SCSS now allows nested declarations.
Can now match TypeScript interface snippets.
Expands the cases supported by the useIncludes lint rule.
Adds support for interpolated SCSS URL values.
Interpolation delimiters stay attached to whitespace-sensitive boundaries and adjacent inline siblings, wrapping expressions when needed to fit the configured line width.
Template literal attribute values are now supported in Astro.
The Tailwind parser now understands container-query variants, child and descendant variants, combinator selectors in arbitrary variants, variant modifiers, and arbitrary container-query sizes.
Added ordering of variants in
sort_v4.
Tooling 18
Type lowering now handles array type syntax.
Multiline Astro expressions are indented at the surrounding markup column, and biome format now formats Astro expressions too.
Type lowering now handles generic type constraints.
Type lowering now includes global functions from source declarations.
Type lowering now handles indexed access types.
Type inference now lowers Intl namespace declarations.
Type lowering now handles keyof type operators.
Added a lint rule that detects React object types used as default props.
Type lowering now handles Symbol call signatures.
Type lowering now handles Symbol static members.
Adds suite() as an alias of describe() across test analysis rules and formatter; rules also recognize fsuite, xsuite, and test.suite blocks.
Test rules accept suite() as an alias of describe().
Adds detection of undeclared custom Vue directives.
Can capture and inspect multiple named import specifiers and match captured JSX component names against snippets such as React.Fragment.
Astro fragment shorthand is now supported.
A JavaScript transform can erase type annotations in TypeScript code.
biome rage now includes RUST_BACKTRACE in its environment variable metadata.
Added a Markdown linter.
Fixes and other changes 143
Fixed Astro formatting of embedded content.
No longer adds invalid parentheses around Svelte {@const} declarations when experimental HTML support and formatting are enabled.
Biome no longer crashes when output is piped to a program that exits early; output to the closed pipe is discarded and Biome exits normally.
The CLI no longer crashes when output is piped to a closed pipe.
Type inference now fully lowers Date constructor members.
Disabling one domain no longer disables rules that also belong to another enabled domain; explicitly configured rules also remain enabled.
Fixed incorrect type inference when generic parameters are reused across inherited types or swapped in recursive types.
No longer inserts a space after a within pattern without an until clause.
No longer duplicates comments around Svelte blocks, including comments after blocks and comments before branch or closing tags.
No longer removes the space between text and an inline element on the next line when joining lines.
Regex literals beginning with > no longer terminate self-closing tags; regex literals after keywords such as return are recognized too.
The parser now compares complete opening and closing tag names.
The HTML lexer now treats a regex beginning with > as a regex.
The parser no longer misparses << as type arguments when the closing > is missing.
Long-running workspaces now reflect package manifest and TypeScript path-mapping changes without requiring the importing file to be edited.
No longer reports chained method calls such as builder.image(url).fit("max") as focused tests.
The rule now ignores chained .fit() method calls.
The fix now preserves the string value for octal escapes with a leading digit 4–7.
No longer reports view transition names inside view transition pseudo-elements.
The rule now ignores view transition names in pseudo-elements.
No longer offers a safe fix for return; as the body of an unbraced if, else, or label; safe fixes also preserve surrounding comments.
The rule skips fixes for unbraced bodies and keeps comments.
String concatenation fixes now escape quotes.
Rules enabled by overlapping domains are now preserved.
VCS checks now account for parent ignore files.
The language server now handles relative glob patterns correctly.
The SCSS parser now accepts if inside a url function.
SCSS query values now support unary expressions.
Suppression comments now work on affected parts of HTML-like files and on snippets embedded in JavaScript files.
Comments at the end of a Svelte block's contents are now indented with the contents rather than the following tag.
Formatting now preserves const tag assignment syntax and fixes duplicate or incorrectly indented comments around Svelte blocks.
Tailwind classes in class expressions are now detected.
Tailwind classes are now detected in Svelte, Vue, and Astro class attribute expressions that do not use a class merging function.
Test rules no longer mistake regular method calls named test, it, or describe for tests.
More global types, including Array, Map, and Set, are fully defined, which should decrease false positives on typed rules.
Type-aware rules now resolve members through generic type aliases that instantiate another generic type with a nested generic argument.
Parses f<T> << f<T> as a left shift of two instantiation expressions, matching TypeScript instead of reporting a parse error.
A << expression followed by a later >>> is no longer misparsed as TypeScript type arguments.
The rule now preserves negative index expressions.
The rule now ignores loops that update the index in the loop body.
Removed the React 19 version requirement from the rule.
The rule no longer escapes a slash that is already escaped.
No longer reports boolean literals on the right side of || and && outside boolean contexts, where removing them can change the expression result.
Now evaluates parent directory patterns when matching child paths, preserving re-included directories while ignoring excluded siblings.
Linting now recognizes Vue slot bindings.
Typed slot props no longer produce a parse error, and types in slot prop annotations are recognized as used by noUnusedVariables.
Suppression comments targeting the entire assist category, including biome-ignore-all assist, are respected when running check.
Correctly writes fixes for code inside HTML attribute expressions instead of reporting fixable diagnostics without applying them.
No longer fails with conflicting rule fixes when multiple diagnostics target a declaration preceded by a multiline comment.
Correctly writes fixes for code inside HTML attribute expressions instead of reporting fixable diagnostics without applying them.
No longer modify the wrong part of Vue, Svelte, or Astro files when experimental full HTML support is disabled.
Fixes are now written back to attribute-expression embeds in HTML.
Associates annotations with the correct files when Biome runs from a nested directory.
Files re-included by negation patterns in a nested .gitignore are processed when vcs.useIgnoreFile is enabled, even if the ignore file contains *.
Grit plugin code fixes are now available as editor code actions.
Plugins that use sequential no longer panic when Biome processes files.
Import patterns now match namespace imports, including type-only imports; explicit import type patterns also match type-only named and namespace imports.
Preserves authored segment breaks between CJK characters and next to CJK punctuation instead of replacing them with spaces.
No longer applies native HTML element formatting to PascalCase component names in Vue, Svelte, and Astro files.
No longer applies SVG block formatting to unknown elements whose names match SVG element names.
Fixes redundant parentheses around binary and logical unary operands with leading line comments.
Inserts a newline before the closing angle bracket when a leading comment forces type arguments onto multiple lines.
Avoids extra parentheses and comment movement when formatting multiline expressions after operators such as !.
With operatorLinebreak set to before, own-line comments before binary operators stay above the operator.
Nested gitignore files now honor negation patterns.
Nested gitignore files now honor negation patterns.
Recognizes aliased named imports in single-file components under their local name.
Recognizes React 19.3 DOM properties instead of treating them as unknown attributes.
TypeScript class members using override accessor now parse correctly; accessor override reports that override must precede accessor.
The SCSS parser now allows omitting the final semicolon in at-rules.
The CSS parser now parses SCSS module variables in media queries.
Applies safe fixes without formatting files that have parse errors when formatter.formatWithErrors is disabled.
Correctly handles dashed utility base names and parses arbitrary values separately while preserving the complete base name.
Multiline template interpolations preserve the closing brace's indentation when source indentation is not a multiple of tabWidth.
Suppression comments now suppress matching HTML lint diagnostics on the following line when full HTML support is enabled.
Fixes parsing of unquoted URLs beginning with @ or ! and preserves escaped and non-ASCII whitespace in raw URLs during formatting.
No longer inserts whitespace between adjacent Svelte expressions when their combined length exceeds the line width.
Infers unannotated callback parameter types from the passed function's signature, honors explicit call type arguments, and avoids unnecessary inference of imported generics and namespace members.
The formatter no longer crashes on multiline expressions in files with CRLF line endings.
Astro expressions now parse TypeScript and JSX syntax, attribute values, comments, text, and embedded script and style contents according to Astro syntax.
Fixes handling of format suppression comments on TypeScript declared class properties with string literal names.
The Language Server no longer starts with debug logging enabled, preventing logs from growing exponentially in long sessions.
Fixes repeated dependency analysis that could lead to long and unresponsive sessions.
The formatter prints declare before accessibility modifiers on class properties, matching Prettier and TypeScript's canonical modifier order.
Biome no longer crashes while parsing malformed delete expressions.
Vanilla HTML no longer reports unsupported text expression diagnostics for double-curly text, and the formatter preserves adjacent curly-brace text.
Biome no longer crashes when linting malformed for...of statements.
Grit plugins can use function = ... as a node argument.
The formatter no longer moves comments next to the < of a generic, avoiding invalid TypeScript syntax.
Biome now parses legacy Internet Explorer filter and -ms-filter values such as progid:DXImageTransform... and alpha(opacity=40).
The configuration schema now correctly provides auto-completion for linter domains.
Recognizes unhandled Promise chains when an imported function's module belongs to an import cycle; cyclic modules preserve types for exports outside recursive type dependencies.
No longer reports Bun runtime built-in modules as unresolved imports.
Exempts any variable whose initializer references props, preventing false duplicate-key reports for derived script setup variables.
Biome preserves Unicode characters when writing source received through standard input to standard output.
Formatting a Svelte render tag followed by an HTML comment no longer duplicates the comment.
Whitespace now always allows the parser to recover from parsing failures and start parsing a new class.
Adjacent elements inside an Astro expression now parse as an implicit fragment instead of raising an error.
Astro templates now accept unclosed HTML void elements.
Re-export patterns now match named re-exports with aliases, inline type modifiers, and multiple specifiers.
The rule no longer reports template assignments to Vue <script setup> bindings whose names match built-in globals.
Biome now parses parenthesized object literals returned from arrow functions when they contain a conditional expression and a nested arrow function.
Files passed through this option now use full HTML support for Astro, Svelte, and Vue when it is enabled.
Variables and imports used as custom Vue directives are no longer reported as unused.
Astro now accepts JavaScript comments between attributes.
Astro now accepts attribute names that start with a colon, such as
:href.An Astro expression containing only a comment is no longer reported as a parse error, allowing the whole file to be formatted.
Empty Astro expressions such as
<div>{}</div>now parse; Astro renders{}as nothing.Astro expressions containing comments now parse, including expressions with a comment followed by a value.
A closing tag inside a string or comment no longer cuts an Astro frontmatter block short.
An Astro frontmatter block no longer ends on a line that merely starts with a dash.
Astro frontmatter is recognized only at the very start of a file; later
---lines are content.The Astro parser recovers from malformed closing tags so later mistakes are reported where they occur rather than cascading.
{{at the start of an Astro expression is parsed as an object literal rather than an interpolation.Astro parses markup and interpolations in
<pre>and<textarea>as ordinary elements, preventing variables used only inside them from being reported as unused.A
<that cannot open a tag is treated as text and needs no escaping.Astro now accepts HTML5 unquoted attribute values containing backticks, equals signs, or quotes.
The migration command detects rules from
@eslint/cssin ESLint configurations more reliably.GritQL plugins now match and rewrite metavariables embedded in quoted strings.
Children of Astro elements carrying
is:raware parsed as raw text;<script>and<style>contents are no longer linted as JavaScript or CSS.Fixed a memory leak that caused memory usage to grow over long editor sessions.
Svelte block openings are now recognized only in Svelte files; sequences such as
{#if x}are ordinary text in HTML, Vue, and Angular files.Biome no longer crashes when parsing incomplete
{let}or{const}declarations in Svelte files.The rule no longer reports Vue event handlers such as
@click="count++".Variables and imports used by Vue same-name bindings such as
:disabledorv-bind:disabledare no longer reported as unused.TypeScript path mapping targets without ./ are now resolved relative to their configured path base.
The CSS parser recovers at declaration boundaries after bogus declarations, allowing subsequent valid declarations to be parsed.
The CSS parser accepts Tailwind container-query variant names such as @xl and @max-xl in @variant.
Whitespace handling is corrected for marquee, noscript, video, audio, and object elements.
The formatter preserves meaningful blank lines, including spacing after elements with trailing spaces and blank lines between comment groups.
Parent tag wrapping is corrected when an HTML element starts or ends with a block-like or hidden child such as source, track, or param.
Invalid CSS declarations in HTML style attributes now produce parser diagnostics instead of causing a panic.
Wrapping accounts for the width of an adjacent closing tag, avoiding lines that exceed the configured width.
The rule now recognizes Vitest Browser Mode expect.element() calls as assertions.
SVG parsing now works for files with an XML declaration followed by a PUBLIC doctype.
The Tailwind parser now understands modifiers on bare utilities, including @container/sidebar and shadow/50.
The Tailwind parser now accepts the legacy leading ! important marker.
Biome no longer crashes with an access violation when analysing files on Windows ARM64.
CSS block comments between a declaration colon and value now preserve their source indentation.
CSS formatting keeps comments inside functional pseudo-classes and pseudo-elements instead of moving them before the function name.
Patterns with multiple metavariables now match snippets consistently in WebAssembly.
CSS parsing of registered custom properties now correctly validates the
syntaxdescriptor.Svelte files now parse correctly when an expression begins with an object literal.