chore(deps): update non-major dependencies #22
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "renovate/all-minor-patch"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
2.4.10→2.5.51.3.0→1.25.7^0.7.6→^0.9.0^0.9.18→^0.11.04.1.18→4.3.325.2.0→25.9.522.19.10→22.20.119.2.14→19.2.1710.4.24→10.5.43.0.2→3.1.09.2.1→9.2.41.39.1→1.42.314.25.1→14.27.07.1.0→7.5.01.6.0→1.6.1^0.563.0→^0.577.012.38.0→12.42.27.1.0→7.2.01.364.6→1.407.019.2.4→19.2.85.6.1→5.8.019.2.4→19.2.83.4.0→3.6.04.1.18→4.3.34.21.0→4.23.16.0.2→6.0.34.1.2→4.1.104.3.6→4.4.3Release Notes
biomejs/biome (@biomejs/biome)
v2.5.5Compare Source
Patch Changes
#10972
ab8c21bThanks @ematipico! - FixeduseExhaustiveSwitchCasesfor unions of bigint literals. The rule now reports missing bigint cases and compares bigint literals by value, including binary, octal, hexadecimal, and separator-containing spellings. For example, this switch now reports the missing2ncase:#10972
ab8c21bThanks @ematipico! - Fixed false positives innoBaseToStringanduseNullishCoalescingwhen member, stringification, or nullish inference cannot complete. These rules now suppress diagnostics instead of reporting from partial type information. For example, neither expression is reported when a recursive type cannot be fully resolved:#10977
0bf7486Thanks @ematipico! - Fixed #10922: the actionuseSortedAttributesno longer triggers for HTML instructions.#10957
cf263c4Thanks @dyc3! - FixednoThenPropertyfailing to detectObject.fromEntries,Object.defineProperty, andReflect.definePropertycalls with comments between their tokens.#10983
edc0ed7Thanks @ayaangazali! - Fixed #10980:useAriaPropsSupportedByRoleno longer reports false positives when the attribute that determines an element's implicit ARIA role is written as a shorthand attribute, such as<a {href} aria-label="...">in Astro and Svelte files.Shorthand attributes are now taken into account when computing the implicit role, so the anchor above correctly resolves to the
linkrole instead ofgeneric.#10889
89526e3Thanks @denbezrukov! - Fixed CSS formatter casing for syntax-owned names while preserving author-defined names, including scoped keyframes and container scroll-state queries.#10964
794ccd0Thanks @denbezrukov! - Fixed CSS formatting for comments between declaration values and!important.#10993
b7a9694Thanks @denbezrukov! - Fixed the CSS formatter to preserve comments on the correct side of selector combinators and before declaration blocks.It now also keeps selectors with escaped newlines in attribute values inline when they fit.
#10978
8ebafe1Thanks @ematipico! - Fixed #10870:noUnresolvedImportsno longer reports false positives such asimport type { NextRequest } from "next/server".#10901
68c10e6Thanks @Socialpranker! - Fixed #10622: the HTML/Vue parser no longer panics on the argument-lessv-bindshorthand (:="props").This syntax is valid Vue and equivalent to
v-bind="props", so the parser now accepts it (along with the longhandv-bind:="props") instead of crashing while building a diagnostic for a missing argument.#10936
7df46f5Thanks @ematipico! - Improved generic tuple inference foruseIncludes. The rule now recognizes specialised tuple element types returned through generic aliases.#10941
f787725Thanks @siketyan! - Fixed#10855: Biome now supports parsing and formatting CSS custom media queries declared with@custom-media.#10969
72d309bThanks @ematipico! - Fixed an issue where Biome logs became too verbose, dumping information not relevant to user's operations.e62f6b6Thanks @ematipico! - Fixed #10963: Biome no longer panics when a type-aware rule such asnoFloatingPromiseschecks a call to a function with multiple call signatures imported from another module.#10931
899c60dThanks @ematipico! - Fixedcheck --writecommand. Now the command reports code frame of the formatted code, if the formatter is enabled.#10904
ceee4f4Thanks @qzwxsaedc! - Fixed #10892:noUnnecessaryConditionsno longer reports a false positive when checking a member of a discriminated union that is accessed through a default type-only namespace import. The following code is no longer flagged:#10962
f0a67f2Thanks @ematipico! - Biome no longer removes embedded styles and scripts in HTML files.#11000
5039a1eThanks @ematipico! - Fixed a bug where closing one editor stopped a shared Biome daemon used by other editors. LSP proxy processes now exit when either the editor or daemon disconnects.#10957
cf263c4Thanks @dyc3! - Improved the performance of thenoThenPropertylint rule by about 50%.#10992
4bf9b21Thanks @ematipico! - FixednoMisusedPromises: The rule now reports Promise-returning callbacks where a synchronous callback is expected when calls use tuple spreads or tuple rest parameters, including generic and deeply nested tuples, and when constructor signatures come from interface or object types. Recursive or excessively nested tuple spreads use a conservative fallback so analysis terminates.For example, the following callback is now reported.
#10915
b3b12b3Thanks @Functionhx! - Added the rulenoNegationInEqualityCheck. The rule flags negated expressions on the left side of strict equality checks like!foo === bar— due to operator precedence this evaluates as(!foo) === barwhich is almost always a mistake forfoo !== bar.The rule provides an unsafe fix that flips the operator.
#10970
bd1038bThanks @ematipico! - Improved overload selection fornoMisusedPromises. Biome now handles overloaded calls, overloaded constructors, rest parameters, union arguments, and generic constraints without selecting an incompatible signature. For example,noMisusedPromisesnow reports the async callback passed to the synchronous overload:#10933
48a4abbThanks @ematipico! - FixeduseArrayFindto recognize bigint zero indexes.#10931
899c60dThanks @ematipico! - Fixed an orchestration issue that could lead to deadlocks when type-aware rules are enabled.#10969
72d309bThanks @ematipico! - Hardened the Biome Language Server by improving its synchronisation logic.#10972
ab8c21bThanks @ematipico! - Fixed false positives innoMisusedPromisesanduseAwaitThenablewhen Promise or thenable inference cannot complete. These rules now suppress diagnostics instead of treating incomplete type information as a definite result. For example,useAwaitThenableno longer reportsawait valuewhen the value's thenability is unknown:v2.5.4Compare Source
Patch Changes
#10665
55ff995Thanks @dyc3! - Improved the performance of the HTML parser slightly in our synthetic benchmarks.#10894
f4fb10eThanks @ematipico! - Fixed #6392: On-type formatting no longer moves comments before anifstatement into its body.#10939
f2799dbThanks @Netail! - Fixed #10930:noLabelWithoutControlnow correctly detects text interpolation in Astro, Svelte & Vue as valid accessible content.#10945
ae15d98Thanks @Netail! - Fixed #10942: Svelte directives don't throw an accidental debug log anymore.#10842
5e1abfeThanks @JamBalaya56562! - Fixed #9196:biome check --write --unsafeno longer hangs forever when applying thenoCommentTextcode fix.The rule's fix now wraps the comment in a real JSX expression container (
{/* comment */}) instead of re-inserting the braces as plain JSX text, so the fixed code is no longer reported again by the same rule.#10891
ecca79eThanks @ematipico! - Fixed#10885: prevented a module-inference regression introduced by a housekeeping change.#10886
60c8043Thanks @dyc3! - Fixed #10727: Biome now breaks the arguments of curriedtest.each,it.each,describe.each, andtest.forcalls when they exceed the configured line width.#10895
01a85f0Thanks @ematipico! - Biome will now remove stale Unix daemon sockets from older Biome versions when starting a newer daemon.v2.5.3Compare Source
Patch Changes
#10815
86613d5Thanks @WaterWhisperer! - Fixed a parser panic reported in #10708: Biome now recovers when unsupported CSS Modules@valuerules or scoped@keyframesnames end at EOF.#10534
da9b403Thanks @Mokto! - FixednoUnusedVariablesfalse positives in Svelte files: Svelte store subscriptions ($storereferences in templates now keep the underlyingstorebinding from being flagged), and$bindable()props that are only written to in the script block (write-only is intentional for bindable props) are no longer reported as unused.#10827
098ba41Thanks @Aqu1bp! - Fixed #10698: ThenoUnsafeOptionalChainingrule now reports unsafe optional chains wrapped in TypeScriptas,satisfies, type assertion, and instantiation expressions, such asnew (value?.constructor as Constructor)().#10773
3c6513dThanks @otkrickey! - Fixed #10772:useVueValidVOnno longer reports a missing handler for v-on directives using a verb modifier (.stop/.prevent) without an expression, e.g.<div @​click.stop></div>. The rule also accepts the arg-less object syntax<div v-on="$listeners"></div>instead of reporting a missing event name.#10721
d83c66bThanks @minseong0324! - Improved type-aware lint rule inference for built-in globals and indexed function calls. Biome now resolvesError(...),new Error(...), optionalError#stack, and calls through indexed function values such ashandlers[0]()more accurately.#10865
6450276Thanks @ematipico! - Fixed #10845. Biome Language Server no longer goes in deadlock when the scanner is enabled.#10853
93d8e53Thanks @Netail! - Fixed #10840: Astro shorthand attribute syntax is now correctly being parsed from embedded nodes.#10820
bba3092Thanks @JamBalaya56562! - Fixed #10619:noProcessEnvnow also reports computed (bracket) member access. Previously only dot access was checked, soprocess["env"]andenv["NODE_ENV"](whereenvis imported fromnode:process) were missed. Both static and computed accesses are now reported.#10835
3447b2fThanks @dyc3! - Fixed #10824:useDomQuerySelectornow supports anignoreoption for receiver identifiers that should not be reported.#10875
b12e486Thanks @dyc3! - Fixed #10795:--profile-rulesnow reports timings for each plugin separately asplugin/<pluginName>, matching the naming used by plugin suppressions, instead of aggregating all plugins under a singleplugin/pluginentry.#10877
d6bc447Thanks @ematipico! - Fixed biome-zed#164: Biome no longer inserts stray whitespace when format-on-type runs after closing delimiters such as),], and}.#10867
a21463eThanks @dyc3! - Fixed #10864: Biome no longer crashes when checking or linting HTML files with unquoted attribute values such as<textarea rows=4></textarea>.v2.5.2Compare Source
Patch Changes
#10595
f458028Thanks @pkallos! - Added the optionignoreBooleanCoercionto useNullishCoalescing. When enabled, Biome ignores||and||=used inside aBoolean()call, where coalescing on falsy values is intentional.#10798
4a32b63Thanks @pkallos! - Added the optionignorePrimitivesto useNullishCoalescing. When enabled, Biome ignores||,||=, and ternary expressions whose non-nullish operands are all primitives the option opts out of. Usetrueto ignore all primitives, or an object selectingstring,number,boolean, orbigint.#10545
f3d4c00Thanks @Mokto! - Added the new nursery rulenoSvelteUnnecessaryStateWrap, which reports unnecessary$state()wrapping of classes fromsvelte/reactivitythat are already reactive.#10752
f62fb8bThanks @ematipico! - Fixed #10739. Now the ruleuseValidAutocompletecorrectly flags theautoCompleteattribute.#10796
f1b3ab2Thanks @ematipico! - Fixed #10768. Improved the performance of the Biome Language Server by cancelling certain in-flight operations when there are fast updates.#10719
aa649b5Thanks @minseong0324! - FixednoMisleadingReturnTypefalse positive on returns that use a widening type assertion:"a" as stringis no longer reported as misleading. The rule now also reports a literal-pinning assertion such asfalse as false, matching the existingas constbehavior.#10678
8f073a7Thanks @PranavAchar01! - Fixed #7718: Biome now correctly parses CSS nesting selectors when&appears as a trailing sub-selector after a type selector, e.g.h1& { color: red; }.#10756
5ec965aThanks @denbezrukov! - Fixed CSS formatter output for selector lists withallowWrongLineCommentsand//comments after a selector comma. Biome now keeps the selector before the line comment inline instead of breaking it across descendant combinators.#10757
6232fcdThanks @PranavAchar01! - Fixed #8269: the CSS parser now accepts Tailwind@variantand@utilitynames that start with a digit, such as the2xlbreakpoint.#10777
575ced6Thanks @WaterWhisperer! - Fixed an issue reported in #10708: the GitLab reporter now handles--verbosediagnostics filtering correctly.#10281
0efe244Thanks @Zelys-DFKH! - Fixed a bug where GritQL patterns rejected positional (unkeyed) arguments.#10758
e36fd8aThanks @henrybrewer00-dotcom! - Fixed #10697: The formatter no longer removes the parentheses around anawaitoryieldexpression used as the target of a TypeScript instantiation expression. For example,(await makeFactory)<Value>is no longer reformatted toawait makeFactory<Value>, which would change the meaning of the code.#10586
3617094Thanks @IxxyDev! - Fixed #9568:noFloatingPromisesno longer reports a false positive when calling an overloaded function and the selected overload does not return a promise.#10766
7aff4c1Thanks @JamBalaya56562! - Fixed #2862:noInteractiveElementToNoninteractiveRoleno longer reports custom elements (a tag name containing a dash, e.g.<my-button role="img" />). Per the W3C HTML-ARIA specification, a custom element may be given any role or none.#10680
771daa4Thanks @WaterWhisperer! - Fixed #10635: Biome now recognizes chainedtable tests such as
test.concurrent.each()andit.concurrent.each()as test calls, fixingnoMisplacedAssertionfalse positives and improving formatting for those test declarations.#10759
34570b5Thanks @henrybrewer00-dotcom! - Fixed #10636: noStaticElementInteractions no longer reports a false positive for event handlers on Svelte special elements such as<svelte:window>,<svelte:document>, and<svelte:body>. These are not real DOM elements, so they are now ignored by the rule.#10741
bd2364eThanks @JamBalaya56562! - Fixed #6686: theragecommand now respects the--config-pathoption and theBIOME_CONFIG_PATHenvironment variable when loading the Biome configuration. Previously it always used the default configuration resolution and reported the configuration asNot setwhen nobiome.jsonexisted in the working directory.#10763
2c3e82dThanks @Aqu1bp! - Fixed #10742:noSolidDestructuredPropsnow reports destructured props in Solid function components and JSX children.#10606
a4cc4abThanks @Mokto! - Fixed false positives innoUnusedImports,noUnusedVariables, anduseImportTypefor Svelte components that use both a<script module>and a<script>block. The two blocks compile to a single module and share a top-level scope, so a binding (import, function, or variable) declared in one block and used only in the other is no longer reported as unused.#10767
36d5aa7Thanks @otkrickey! - Fixed #10754:useVueValidVBindno longer reports the Vue 3.4+ same-name shorthand as missing a value.:fooandv-bind:fooare now accepted as equivalent to:foo="foo", whilev-bind,v-bind:[dynamicArg], and:[dynamicArg]without a value continue to be reported.#10775
a918af0Thanks @WaterWhisperer! - Fixed an issue reported in #10708:biome ragedidn't detect running Biome daemon pipes on Windows.#10730
5a2e65bThanks @dinocosta! - Fixed an issue where Biome was resolving the well-known Zed settings file from the wrong location on macOS and Windows.#10807
d97fffeThanks @ematipico! - Fixed an issue where.scssfiles were incorrectly analyzed when runningbiome check.#10672
53c6efcThanks @ematipico! - Fixed a bug where Biome incorrectly formatted snippets that have parsing errors.#10719
aa649b5Thanks @minseong0324! - FixeduseAwaitThenablefalse positive when awaiting a custom thenable that is not the globalPromise. A value with a callablethenmember is now recognized as awaitable.#10734
4396496Thanks @BangDori! - Fixed #10708:biome migratenow preserves trivia when migrating the deprecatedrecommendedoption topreset.#10683
ae31a00Thanks @Netail! - Fixed #10657 #10671 #10661 #10637 #10718: HTML rules now correctly handle dynamic attributes.#10746
54e8239Thanks @ematipico! - Fixed an issue wherenoUndeclaredClassesdidn't correctly detect styles defined inside the Astro directiveis:global.#10770
dd1429cThanks @ematipico! - Improved the Biome Language Server DX by orchestrating certain operations, so that they won't block the editor during typing. This improvement is more visible in large documents.#10473
d9b5133Thanks @Mokto! - ImprovednoUnusedImports,noUnusedVariables,noUnusedFunctionParameters, anduseImportTypefor Svelte, Vue, and Astro files (withhtml.experimentalFullSupportEnabled). Bindings used only in the template — including component tags, attribute interpolations, directives,bind:shorthand, and snippet parameters — are no longer reported as unused, while genuinely unused ones still are.#10796
f1b3ab2Thanks @ematipico! - Fixed an issue where the Biome Language Server didn't enable project or type-aware lint rules, even when they were explicitly enabled.#10746
54e8239Thanks @ematipico! - Fixed an issue wherenoUndeclaredClassesdidn't detect styles declared inside HTML documents.#10774
bde945bThanks @pattrickrice! - Fixed #10268 where a race condition resulted in internal errors such as:The file biome.json does not exist in the workspace.v2.5.1Compare Source
Patch Changes
#10722
f8a303dThanks @denbezrukov! - Fixed CSS formatter output for comments between import media queries.#10738
9fdc560Thanks @JamBalaya56562! - Fixed #9899: thejsonandjson-prettyreporters now escape backslashes in a diagnostic'slocation.path. Previously, paths containing backslashes (such as Windows-style paths) were emitted unescaped, producing invalid JSON.#10626
5f837dfThanks @tom-groves! - Fixed #10625:biome migrateno longer emits an invalid trailing comma when a renamed rule (such asnoConsoleLog→noConsole) is the last member of its rule group. Previously this produced malformed output that aborted the migration of a strict-JSONbiome.jsonwith a parsing error.#10535
c245f9dThanks @Mokto! - Fixed a false positive innoUnusedVariablesfor Svelte files where variables referenced inside{@​html expr}blocks were incorrectly reported as unused.#10668
a0f197eThanks @Netail! - Thebiome initcommand has been updated to include a more up-to-date URL to the first-party extensions page.#10667
d8c3e87Thanks @Netail! - Fixed #10664: useErrorCause now correctly detects a shorthand property.#10696
ef2373fThanks @ematipico! - Fixed #9566. Improved how the Biome Language Server loads multiple configuration files inside a workspace.#10705
4ccb410Thanks @ematipico! - Fixed #10652. Biome plugins are now properly filtered when using--onlyand--skipflags.#10669
aa0a6ebThanks @Netail! - Fixed #10651: useInlineScriptId now correctly trims trivia to detect if an id attribute has been set.#10689
844b1beThanks @ematipico! - Fixed #10658. The issue was caused by the "Go-to definition" editor feature, which was enabled by default. The feature is now disabled by default. To work, the feature triggers the scanner to build the module graph. This caused memory leak issues in cases where Biome starts in the home directory to modify files.If you relied on this new feature, you must now turn on using the [editor settings] of the extension e.g. Zed and VSCode.
#10695
043fbb5Thanks @ematipico! - Fixed #10674. Biome now throws an error when the fieldlevelis missing from a rule option.#10712
5941df2Thanks @Conaclos! - Improved the diagnostic and the documentation ofuseFlatMap.#10615
23814f1Thanks @qwertycxz! - Improved the DX the JSON schema when it's used by certain code editors like VSCode.#10688
ec69489Thanks @ematipico! - Fixed a bug where the Biome Daemon did not correctly shut down when the editor was closed during an in-progress operation, especially while scanning.#10701
6c2e0d7Thanks @ematipico! - Fixed #10694. The Biome Language Server no longer prints an error when the user hovers a variable imported from node_modules.#10681
888515bThanks @Conaclos! - FixeduseExportTypethat reported useless details in some diagnostics.#10220
3694a13Thanks @theBGuy! - FixeduseAnchorContentfalse positive for<a>elements used as render prop values (e.g.render={<a href="..." />}), a pattern where the receiving component renders its children inside the anchor element.#10702
98823fbThanks @ematipico! - Fixed #10612. The Biome parser now correctly parses processing instructions. The following SVG doesn't throw errors anymore:v2.5.0Compare Source
Minor Changes
#9539
f0615fdThanks @ematipico! - Added a new reporter calledconcise. When--reporter=conciseis passed the commandsformat,lint,checkandci, the diagnostics are printed in a compact manner:#9495
2056b23Thanks @aviraldua93! - Added theuseKeyWithClickEventsa11y lint rule for HTML files (.html,.vue,.svelte,.astro). This is a port of the existing JSX rule. The rule enforces that elements with anonclickhandler also have at least one keyboard event handler (onkeydown,onkeyup, oronkeypress) to ensure keyboard accessibility.Inherently keyboard-accessible elements (
<a>,<button>,<input>,<select>,<textarea>,<option>) are excluded, as are elements hidden from assistive technologies (aria-hidden) or withrole="presentation"/role="none".#9152
9ec8500Thanks @ematipico! - Added new nursery lint rulenoUndeclaredClassesfor HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used inclass="..."(orclassName) attributes that are not defined in any<style>block or linked stylesheet reachable from the file.#9152
9ec8500Thanks @ematipico! - Added new nursery lint rulenoUnusedClassesfor CSS. The rule detects CSS class selectors that are never referenced in any HTML or JSX file that imports the stylesheet. This is a project-domain rule that requires the module graph.#9546
6567efaThanks @nhedger! - Added abiome upgradecommand for standalone installations. It upgrades Homebrew installs withbrew upgrade biome, updates manually installed binaries from the latest GitHub release, and tells npm users to upgrade with their package manager instead.#9716
701767aThanks @faizkhairi! - Added the HTML version of theuseHeadingContentrule. The rule now enforces that heading elements (h1-h6) have content accessible to screen readers in HTML, Vue, Svelte, and Astro files.#9582
f437ef8Thanks @rahuld109! - Added the HTML version of theuseKeyWithMouseEventsrule. The rule now enforces thatonmouseoveris accompanied byonfocusandonmouseoutis accompanied byonblurin HTML, Vue, Svelte, and Astro files.#9275
1fdbceeThanks @ff1451! - Added the new assist actionuseSortedTypeFields, which sorts the fields of GraphQL object types, interface types and input object types alphabetically, e.g.name, age, idbecomesage, id, name.#10561
78075b7Thanks @Conaclos! - Added a newstyleoption to useExportType,which enforces a style for exporting types.
This is the same option as the one provided by
useImportType.#8987
d16e32bThanks @DerTimonius! - Ported theuseValidAnchorrule to HTML. This rule enforces that all anchors are valid and that they are navigable elements.#9533
4d251d4Thanks @ematipico! - Theinitcommand now prints the Biome logo.#10069
0eb9310Thanks @Netail! - Added the HTML lint rulenoStaticElementInteractions, which enforces that static, visible elements (such as<div>) that have click handlers use the valid role attribute.Invalid:
#9134
2a43488Thanks @ematipico! - Added the assist actionuseSortedPackageJson.This action organizes package.json fields according to the same conventions as the popular sort-package-json tool.
#9309
7daa18bThanks @Bertie690! - TheallowDoubleNegationoption has been added tonoImplicitCoercionsto allow ignoring double negations inside code.With the option enabled, the following example is considered valid and is ignored by the rule:
#9700
894f3fbThanks @ematipico! - The Biome Language server now supports the "go-to definition" feature.When the cursor of the mouse is hovering an entity (variable, CSS class, type, etc.), and the command CTRL + click is triggered, the editor jumps to where this entity is defined, if the language server can find it.
Here's what Biome is able to resolve:
#10070
bae0710Thanks @Conaclos! - Added the:STYLE:group matcher fororganizeImportsthat matches style imports.For example, the following configuration...
...places style imports last:
#9170
e3107deThanks @mdrobny! - AddedbundleDependenciesoption to NoUndeclaredDependencies rule.This rule now supports imports of packages that are defined only in
bundleDependenciesandbundledDependenciesarrays.#9547
01f8473Thanks @mujpao! - Added new assist ruleuseSortedAttributesfor HTML, porting the existing JSX rule. This rule enforces sorted HTML attributes.Invalid
#9366
2ca1117Thanks @dyc3! - Added thehtml.parser.vueconfiguration option. When enabled, it adds support for the parsing of Vue in.htmlfiles. Most Vue users don't need to enable this option since Vue files typically use the.vueextension, but it can be useful for projects that embed Vue syntax in regular HTML files.#9073
74b20eeThanks @chocky335! - Added support for applying GritQL plugin rewrites as code actions. GritQL plugins that use the rewrite operator (=>) now produce fixable diagnostics for JavaScript, CSS, and JSON files. By default, plugin rewrites are treated as unsafe fixes and require--write --unsafeto apply. Plugin authors can passfix_kind = "safe"toregister_diagnostic()to mark a fix as safe, allowing it to be applied with just--write.Example plugin (
useConsoleInfo.grit):Running
biome check --writeapplies safe rewrites. Unsafe rewrites (the default, orfix_kind = "unsafe") still require--write --unsafe.#9384
f4c9edcThanks @Conaclos! - Added thesortBareImportsoption toorganizeImports,which allows bare imports to be sorted within other imports when set to
false.#8731
e7872bfThanks @siketyan! - Added the watch mode (--watch) to the CLI forcheck/format/lintcommands. By enabling this option, Biome will re-run the check automatically when any file in the workspace has changed after the first run.#10106
9b35f78Thanks @ematipico! - Biome can now format and lint.svgfiles.#9967
e9b6c17Thanks @dyc3! - Added HTML support fornoExcessiveLinesPerFile. Biome now reports HTML files that exceed the configured line limit, including whenskipBlankLinesis enabled.#9491
b3eb63cThanks @IxxyDev! - Added the HTML lint rulenoAriaUnsupportedElements. This rule enforces that elements that do not support ARIA roles, states, and properties (meta,html,script,style) do not haveroleoraria-*attributes.#9306
afd57a6Thanks @viraxslot! - Added thenoNoninteractiveTabindexlint rule for HTML. This rule enforces thattabindexis not used on non-interactive elements, as it can cause usability issues for keyboard users.#9276
6d041d9Thanks @IxxyDev! - Added the HTML lint rulenoRedundantRoles. This rule enforces that explicitroleattributes are not the same as the implicit/default role of an HTML element. It supports HTML, Vue, Svelte, and Astro files.#9813
69aadc2Thanks @ematipico! - Added a new linter configuration calledpreset. With the new option, users can enable different kinds of rules at once.The following presets are available:
"recommended": it enables all Biome-recommended rules, or recommended rules of a group;"all": it enables all Biome rules, or enables all rules of a group;"none": it disables all Biome rules, or disable all rules of a group.You can enable recommended rules:
You can enable all rules at once:
Or enable all rules for a group:
This new option, however, doesn't affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature.
This new option is meant to replace
recommended, so make sure to run themigratecommand.#10022
3422d71Thanks @Netail! - Added the HTML lint rulenoNoninteractiveElementToInteractiveRole, which enforces that interactive ARIA roles are not assigned to non-interactive HTML elements.Invalid:
#8396
13785fcThanks @apple-yagi! - Biome now supports pnpm catalogs (default and named) when resolving dependencies for linting. This behavior is opt-in and requires settingjavascript.resolver.experimentalPnpmCatalogstotrue.#10028
1009414Thanks @Netail! - Added the HTML lint rulenoInteractiveElementToNoninteractiveRole, which enforces that non-interactive ARIA roles are not assigned to interactive HTML elements.Invalid:
#9853
816302fThanks @Netail! - Added the new assist actionuseSortedSelectionSet, which sorts GraphQL selection sets alphabetically, e.g.name, age, idbecomesage, id, name.Invalid:
#10074
9c7c6ebThanks @georgephillips! - Added akindfield to theImportMatcherused by theorganizeImportsassist action. The new field selects imports by their syntactic kind and currently supportsbare(matching side-effect imports such asimport "polyfill") with optional!negation (!bare). The matcher composes with the existingtypeandsourcefields, so users can express patterns such as "only bare imports that import a CSS file" ({ "kind": "bare", "source": "**/*.css" }).For example, with the following configuration:
...the following code:
...is organized as:
#9171
ce65710Thanks @chocky335! - Addedincludesoption for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.#9617
dcb99efThanks @faizkhairi! - PorteduseAriaActivedescendantWithTabindexa11y rule to HTML.#9496
1dfb829Thanks @aviraldua93! - Added HTML support for thenoAriaHiddenOnFocusableaccessibility lint rule, which enforces thataria-hidden="true"is not set on focusable elements. Focusable elements include native interactive elements (<button>,<input>,<select>,<textarea>), elements withhref(<a>,<area>), elements withtabindex >= 0, and editing hosts (contenteditable). Includes an unsafe fix to remove thearia-hiddenattribute.#9792
f516854Thanks @Maximiliano-Zeballos! - Added theuseSemanticElementslint rule for HTML. The rule now detects the use ofroleattributes in HTML elements and suggests using semantic elements instead.For example, the following code is now flagged:
The rule suggests using
<nav>instead.#9761
cbbb7d5Thanks @Maximiliano-Zeballos! - Ported theuseValidAriaPropslint rule to HTML. This rule checks that allaria-*attributes used in HTML elements are valid ARIA attributes as defined by the WAI-ARIA specification.#9928
aa82576Thanks @aviraldua93! - PorteduseValidAriaValuesto HTML. Biome now validates staticaria-*attribute values in HTML elements against WAI-ARIA types, catching invalid values such asaria-hidden="yes".#10562
6642895Thanks @ematipico! - Promoted 73 nursery rules to stable groups.Four rules were renamed as part of the promotion:
noFloatingClassesis nownoUnusedInstantiation, because the rule checks any discardednewexpression, not only classes.noMultiStris nownoMultilineString.useFindis nowuseArrayFind.useSpreadis nowuseSpreadOverApply, because the rule enforces spread call arguments overFunction.apply(), not array or object spread.Correctness
Promoted the following rules to the
correctnessgroup:noBeforeInteractiveScriptOutsideDocumentnoUnusedInstantiationuseInlineScriptId(recommended, Next.js domain)noVueVIfWithVFor(recommended, Vue domain)useVueValidVBind(recommended, Vue domain)useVueValidVElse(recommended, Vue domain)useVueValidVElseIf(recommended, Vue domain)useVueValidVHtml(recommended, Vue domain)useVueValidVIf(recommended, Vue domain)useVueValidVOn(recommended, Vue domain)useVueValidVText(recommended, Vue domain)useVueValidTemplateRoot(recommended, Vue domain)useVueValidVCloak(recommended, Vue domain)useVueValidVOnce(recommended, Vue domain)useVueValidVPre(recommended, Vue domain)useVueVForKey(recommended, Vue domain)noDuplicateAttributes(recommended)noDuplicateArgumentNames(recommended)noDuplicateInputFieldNames(recommended)noDuplicateVariableNames(recommended)noDuplicateEnumValueNames(recommended)useLoneAnonymousOperation(recommended)Suspicious
Promoted the following rules to the
suspiciousgroup:noShadownoUnnecessaryConditionsnoParametersOnlyUsedInRecursionnoUnknownAttributeuseArraySortComparenoForInnoDuplicatedSpreadPropsnoEqualsToNullnoProto(recommended)noUndeclaredEnvVars(recommended, Turborepo domain)noReturnAssign(default severity:error)noDuplicateEnumValues(recommended)noVueArrowFuncInWatch(recommended, Vue domain)noNestedPromisesnoLeakedRendernoDeprecatedMediaType(recommended)noDuplicateGraphqlOperationNameuseRequiredScriptsStyle
Promoted the following rules to the
stylegroup:useVueMultiWordComponentNames(recommended, Vue domain)useVueDefineMacrosOrdernoIncrementDecrementnoContinueuseSpreadOverApplynoTernarynoMultilineStringnoMultiAssignnoExcessiveClassesPerFilenoExcessiveLinesPerFilenoVueOptionsApiuseErrorCauseuseConsistentEnumValueTypeuseConsistentMethodSignaturesuseGlobalThis(default severity:warn)useDestructuringuseVueHyphenatedAttributes(recommended, Vue domain)useVueConsistentVBindStyle(recommended, Vue domain)useVueConsistentVOnStyle(recommended, Vue domain)noHexColorsuseConsistentGraphqlDescriptionsnoRootTypeuseLoneExecutableDefinitionuseInputNameComplexity
Promoted the following rules to the
complexitygroup:useArrayFindnoRedundantDefaultExport(default severity:warn)noUselessReturnnoDivRegexPerformance
Promoted the following rules to the
performancegroup:noSyncScriptsnoJsxPropsBinduseVueVaporSecurity
Promoted the following rules to the
securitygroup:noScriptUrl(recommended)A11y
Promoted the following rules to the
a11ygroup:noAmbiguousAnchorText(recommended)#10121
450f8e1Thanks @jongwan56! - Biome now applies Git's local exclude file when VCS ignore files are enabled. Files listed in.git/info/excludeare skipped the same way as files listed in.gitignore, including in linked worktrees.#9397
d5913c9Thanks @mvarendorff! - Addedignoreoption to the noUnusedVariables rule. The option allows excluding identifiers by providing a list of ignored names. It also allows excluding kinds of identifiers from this rule entirely, which may be useful when loading classes dynamically.For example, unused classes as well as all unused variables, functions, etc. called "unused" may be ignored entirely with the following configuration:
#10089
71a21f0Thanks @Netail! - Added the lint rulenoLabelWithoutControlto HTML, which enforces that a label element or component has a text label and an associated input.#10015
1828261Thanks @Netail! - Added the HTML lint ruleuseAriaPropsSupportedByRole, which enforces that ARIA properties are valid for the roles that are supported by the element.#10234
1a51569Thanks @ematipico! - Added thedelimiterSpacingformatter option. This option inserts spaces inside delimiters (after the opening delimiter and before the closing delimiter) when the content fits on a single line. Empty delimiters are not affected, and no space is added before the opening delimiter. The specific delimiters affected depend on the language. It can be configured globally viaformatter.delimiterSpacingor per-language viajavascript.formatter.delimiterSpacing,json.formatter.delimiterSpacing, andcss.formatter.delimiterSpacing. Defaults tofalse.JavaScript
When enabled, Biome inserts spaces inside parentheses (e.g.,
foo( a, b )), square brackets (e.g.,[ a, b ]), template literal interpolations (e.g.,${ expr }), and the logical NOT operator (e.g.,! x, but in chains only after the last one:!! x). Only applies when the content fits on a single line. Empty delimiters and the space before the opening delimiter are not affected.JSX
When enabled, Biome inserts spaces inside JSX expression braces (e.g.,
attr={ value }) and spread attributes (e.g.,{ ...props }). Only applies when the content fits on a single line. Empty delimiters are not affected.TypeScript
When enabled, Biome inserts spaces inside TypeScript angle brackets (e.g.,
foo< T >()), indexed access types (e.g.,T[ K ]), mapped types, tuple types, type parameters, and index signatures. Only applies when the content fits on a single line. Empty delimiters are not affected.JSON
When enabled, Biome inserts spaces inside square brackets when the content fits on a single line. Empty brackets are not affected.
CSS
When enabled, Biome inserts spaces inside parentheses and square brackets when the content fits on a single line. Empty delimiters are not affected.
#10461
6bac1c3Thanks @TXWSLYF! - Implements #9445. Added theallowImplicitoption touseIterableCallbackReturn. When enabled, callbacks can usereturn;to implicitly returnundefined, matching ESLint'sarray-callback-returnrule.#9571
5a8eb75Thanks @dyc3! - Added configurable options to theuseNumericSeparatorsrule. Users can now customize the minimum number of digits required before adding separators and the group length for each type of numeric literal (binary,octal,decimal,hexadecimal).#10067
6064312Thanks @Netail! - Added the lint ruleuseFocusableInteractiveto HTML, which enforces elements with an interactive role and interaction handler to be focusable.Invalid:
#10026
fb42ac4Thanks @Netail! - Added the HTML lint rulenoNoninteractiveElementInteractions, which disallows use event handlers on non-interactive elements.Invalid:
#10000
2093e3eThanks @Netail! - Added the new assist actionuseSortedEnumMembers, which sorts TypeScript & GraphQL enum members.Invalid:
#10013
ad01d3dThanks @Netail! - Added the HTML lint ruleuseValidAutocomplete, which enforces using valid values for theautocompleteattribute oninputelements.Patch Changes
#10498
995c1ffThanks @citadelgrad! - Added the nursery ruleuseReactFunctionComponentDefinition, which enforces a consistent function type for named React function components.For example, the following snippet triggers the rule by default.
#9974
ff635a9Thanks @pkallos! - AddedignoreMixedLogicalExpressionsto useNullishCoalescing, partially addressing #9232. When enabled, Biome ignores||and||=mixed with&&in the same expression tree.#10503
c656679Thanks @Mokto! - Added the new nursery ruleuseSvelteRequireEachKey, a Svelte lint rule that reports{#each}blocks with item bindings that are missing a key.#10516
0f29b83Thanks @Dotify71! - AddeduseIncludesto the nursery group. This rule flags comparisons ofString.prototype.indexOf()orArray.prototype.indexOf()against-1and suggests replacing them with the clearerincludes()/!includes()form.#10487
0c03ee3Thanks @Mokto! - Fixed a Svelte parser error that incorrectly required a binding variable after{:then}and{:catch}. Biome now correctly accepts{:then}and{:catch}without a binding, as well as the{#await expr then}and{#await expr catch}shorthand forms.#10566
a4a294cThanks @dyc3! - FixeduseVueHyphenatedAttributes: The rule now only reports diagnostics in Vue files and ignores SVG elements.#10565
72ccf3bThanks @dyc3! - FixeduseVueConsistentVBindStyle: The rule no longer reports argument-lessv-binddirectives because they cannot be converted to shorthand syntax.#10591
6e8557bThanks @xsourabhsharma! - Fixed #10563: Biome now parses comma-separated CSS Modulescomposesvalues, such ascomposes: classA from "./a.css", classB from "./b.css";.#10603
174b21bThanks @denbezrukov! - Fixed CSS formatting forgrid-template-areasdeclarations with comments before multiline values. Biome now keeps grid area rows aligned instead of adding an extra declaration-boundary indent.#10542
c3f07f7Thanks @dyc3! - Fixed #10513: Biome no longer rejects literal\usequences in quoted HTML attribute values.#10108
24e51d6Thanks @IxxyDev! - Fixed #6611:noUnnecessaryConditionsnow uses type information to detect more redundant conditions, including?.,??,||,&&, comparisons againstnull/undefinedon non-nullish operands, andcaseclauses that can never match theswitchvalue.#10568
eb1ed0eThanks @harsha-cpp! - Fixed #10564:useAriaPropsForRoleno longer reports false positives for Vue v-bind shorthand bindings (:aria-checked,:aria-level, etc.).#10570
2ceb4feThanks @Conaclos! - ImprovednoTsIgnore.The rule now reports more precisely the range of the
@ts-ignorecomment.#10520
b55d10fThanks @dyc3! - Fixed #10519: Vuev-onevent handlers with multiple inline statements are now parsed consistently with Vue.#10204
ebbf0bdThanks @ematipico! - Improved the performance of the Biome linter. The improvements are more visible in bigger projects that have more than ~1k files. Early tests showed that in a code base with ~2k files, Biome took less than 26% of time to finish the command.#10546
e39bb2cThanks @tim-we! - Fixed#10536: noUnknownFunction no longer flagged CSScontrast-color()as unknown.contrast-color()is Baseline 2026.#8012
2be0264Thanks @denbezrukov! - Improved the performance of the formatter in some cases. The formatter is now up to ~20% faster at formatting files.#10467
9a5855eThanks @Netail! - Added a new nursery rulenoRestrictedDependencies, which flags imports andpackage.jsondependency entries that have better alternatives in e18e's module replacement data.For example, the package
globbyis reported because there's a better alternative:#10470
84b43c5Thanks @ShaharAviram1! - Fixed #10447: now the rulenoProcessEnvdetects the use ofenvwhen it's imported fromprocessandnode:process.#10556
7ff6b16Thanks @ematipico! - Fixed #10492: Biome no longer crashes with a stack overflow on certain code when a type-aware rule such asnoFloatingPromises,noMisusedPromises, ornoUnnecessaryConditionsis enabled. For example, the following code used to crash Biome:#10532
1da3c75Thanks @denbezrukov! - CSS declarations with comments before:or after!importantnow preserve spaces before:and;.#10491
a1b5834Thanks @Mokto! - Fixed the Svelte parser rejecting{#each}blocks where the binding uses object destructuring with property renaming, e.g.{#each items as { id, component: Filter }}. Biome now correctly parses and formats these rename bindings.#10490
99bc7dfThanks @Mokto! - Fixed the CSS parser rejecting comma-separated selector lists inside:global()and:local()pseudo-class functions. Biome now correctly parses:global(.foo, .bar).#10543
c394faeThanks @mangod12! - Fixed #10477: The RDJSON reporter now emits code replacement text for fix suggestions instead of the human-readable fix description.#10530
e8e1e6aThanks @Conaclos! - Fixed #10493:useImportTypenow correctly separates types from a default named import when all imports are types and thestyleoption is set toseparatedType.#10555
263c7ccThanks @Mokto! - Improved Svelte lint rule accuracy for quoted attribute values containing{expression}interpolations.noRedundantAltno longer emits false positives when the alt text contains an interpolation, e.g.alt="image of {person}".useButtonTypeno longer emits false positives for dynamic button types written astype="{dynamicType}".noScriptUrlno longer emits false positives for dynamic hrefs such ashref="{url}".#10489
96ef9a4Thanks @Mokto! - Fixed Svelte{#each}parser incorrectly rejecting TypeScriptas consttype assertions in the iterable expression. Biome now correctly parses{#each arr as const as item}.#10539
935c59aThanks @dyc3! - Improved how diagnostics print long lines of code, for example minified files where the entire source code is printed in one line.v2.4.16Compare Source
Patch Changes
#10329
ef764d5Thanks @Conaclos! - Fixed an issue where diagnostics showed an incorrect location in Astro files.#10363
50aa415Thanks @dyc3! - Fixed HTML formatting for a case where comments could cause the formatter to split up a closing tag, which would cause the resulting HTML to be syntactically invalid.Input:
Output:
#10465
0c718daThanks @dfedoryshchev! - Fixed diagnostics emitted by thenoUntrustedLicensesrule.#10358
05c2617Thanks @dyc3! - Fixed #10356:biome rage --linternow displays rules enabled through linter domains in the enabled rules list.#10300
950247cThanks @dyc3! - Fixed #10265: Svelte function bindings such asbind:value={get, set}are now parsed more precisely, sonoCommaOperatorwon't emit false positives for that syntax anymore.#9786
e71f584Thanks @MeGaNeKoS! - Fixed #8480:useDestructuringnow providesvariableDeclaratorandassignmentExpressionoptions to control which contexts enforce destructuring, matching ESLint'sprefer-destructuringconfiguration. Both default to{array: true, object: true}. The diagnostic for object destructuring in assignment expressions now instructs users to wrap the assignment in parentheses.#10425
1948b72Thanks @sjh9714! - Fixed #10244: TheuseOptionalChainrule now detects negated guard inequality chains like!foo || foo.bar !== "x".#10442
001f94fThanks @ematipico! - Fixed #10411:noMisusedPromisesno longer causes a stack overflow when a nested function returns an object with shorthand properties that shadow destructured variables from an outer scope.#10318
9b1577fThanks @dyc3! - Added support forformatter.trailingCommasin overrides. This option was previously available in the top-level formatter configuration but missing from formatter overrides.#10319
2e37709Thanks @dyc3! - Fixed Vue and Svelte formatting for standalone interpolations in inline elements. Biome now preserves existing newlines in cases like:#10365
0a58eb0Thanks @Netail! - Fixed #10361:noUnusedFunctionParametersnow mentions the parameter name in the diagnostic.#10439
df6b867Thanks @denbezrukov! - Fixed CSS and SCSS formatting for comments around declaration colons so comments between property names, colons, and values stay at the same boundary as Prettier.#10344
b30208cThanks @siketyan! - Fixed#10123: Corrected thenoReactNativeDeepImportssource rule to point to the proper upstream rule, so users can migrate from the original rule correctly.#10328
b59133fThanks @dyc3! - Fixed #10309: Biome no longer adds newlines to Astro frontmatter when linter or assist--writemode is enabled.v2.4.15Compare Source
Patch Changes
#9394
ba3480eThanks @dyc3! - Added the nursery ruleuseTestHooksInOrderin thetestdomain. The rule enforces that Jest/Vitest lifecycle hooks (beforeAll,beforeEach,afterEach,afterAll) are declared in the order they execute, making test setup and teardown easier to reason about.#10254
e0a54ccThanks @dyc3! - Added a new nursery ruleuseVueNextTickPromise, which enforces Promise syntax when using VuenextTick.For example, the following snippet triggers the rule:
#10219
64aee45Thanks @dyc3! - Added a new nursery rulenoVueVOnNumberValues, that disallows deprecated number modifiers on Vuev-ondirectives.For example, the following snippet triggers the rule:
#10195
7b8d4e1Thanks @dyc3! - Added the new nursery ruleuseVueValidVFor, which validates Vuev-fordirectives and reports invalid aliases, missing component keys, and keys that do not use iteration variables.#10238
1110256Thanks @dyc3! - Added the recommended nursery rulenoVueImportCompilerMacros, which disallows importing Vue compiler macros such asdefinePropsfromvuebecause they are automatically available.#10201
1a08f89Thanks @realknove! - Fixed #10193:style/useReadonlyClassPropertiesno longer reports class properties as readonly-able when they are assigned inside arrow callbacks nested in class property initializers.#9574
3bd2b6aThanks @Conaclos! - Fixed #9530. The diagnostics oforganizeImportsare now more detailed and more precise. They are also better at localizing where the issue is.#10205
a704a6cThanks @Conaclos! - Fixed #10185. `organizeImports now errors when it encounters an unknown predefined group.The following configuration is now reported as invalid because
:INEXISTENT:is an unknown predefined group.#10052
b565bedThanks @minseong0324! - ImprovednoMisleadingReturnType: it now flags union annotations whose extra variants are never returned, and suggests the narrower type (e.g.string | null→string).These functions are now reported because
nullandnumberare included in the return annotations but never returned:#10213
ac30057Thanks @dyc3! - Fixed #9450: HTML and Vue element formatting now preserves child line breaks when an element contains another element child on its own line, instead of collapsing the child element onto the same line.#10275
9ee6c03Thanks @solithcy! - Fixed #10274: Svelte templates with missing expressions no longer parsed asHtmlBogusElement#10143
56798a7Thanks @minseong0324! -noMisleadingReturnTypenow detects misleading return type annotations when object literal properties are initialized withas const.This function is now reported because the return annotation widens a property initialized with
as const:#10143
56798a7Thanks @minseong0324! -noUselessTypeConversionnow detects redundant conversions on object literal properties initialized withas const.This conversion is now reported because
message.valueis inferred as a string literal:#9807
0ae5840Thanks @dyc3! - Added the new nursery ruleuseThisInClassMethods, based on ESLint'sclass-methods-use-this.The rule now reports instance methods, getters, setters, and function-valued instance fields that do not use
this, andbiome migrate eslintpreserves the supportedignoreMethods,ignoreOverrideMethods, andignoreClassesWithImplementsoptions.Invalid:
#10258
e7b18f7Thanks @ematipico! - Improved linter performance by narrowing the query nodes for several lint rules, reducing how often they are evaluated.#10273
04e22a1Thanks @dyc3! - Fixed #10271: The HTML parser now correctly parsesofas text content when in text contexts.#9838
83f7385Thanks @dyc3! - Added the nursery rulenoBaseToString, which reports stringification sites that fall back to Object's default"[object Object]"formatting. The rule also supports theignoredTypeNamesoption.#10143
56798a7Thanks @minseong0324! -useExhaustiveSwitchCasesnow checks switch statements over object literal properties initialized withas const.This switch is now reported because
status.kindis inferred as the string literal"ready"but no case handles it:#10143
56798a7Thanks @minseong0324! -useStringStartsEndsWithnow detects string index comparisons on object literal properties initialized withas const.This comparison is now reported because
message.valueis inferred as a string literal:v2.4.14Compare Source
Patch Changes
#9393
491b171Thanks @dyc3! - Added the nursery ruleuseTestHooksOnTopin thetestdomain. The rule flags lifecycle hooks (beforeEach,beforeAll,afterEach,afterAll) that appear after test cases in the same block, enforcing that hooks are defined before any test case.#10157
eefc5abThanks @dyc3! - Fixed #7882: The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as<br></br>. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.#10054
0e9f569Thanks @minseong0324! -noMisleadingReturnTypeno longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to: object.A function annotated
: objectreturning an object literal:#10116
53269ebThanks @jiwon79! - Fixed #6201:noUselessEscapeInRegexno longer flags an escaped backslash followed by-as a useless escape. Patterns like/[\\-]/are now considered valid because the second\is the escaped backslash, not an unnecessary escape of the trailing dash.#10092
33d8543Thanks @Conaclos! - Fixed #9097:organizeImportsno longer adds a blank line between a never-matched group and a matched group.Given the following
organizeImportsoptions:The following code...
...was organized as:
A blank line was added even though the group ':NODE:' doesn't match any imports here.
:BLANK_LINE:between never-matched groups and matched groups are now ignored.The code is now organized as:
#10138
a10b6c1Thanks @dyc3! - Fixed Vuev-forhandling fornoUndeclaredVariablesandnoUnusedVariables. Biome now recognizes variables declared byv-fordirectives and references to iterated values in Vue templates.#10115
d428d76Thanks @minseong0324! -noMisleadingReturnTypeno longer reports false positives when a union return type'sbooleanvariant is covered by bothtrueandfalsereturns.#9922
7acf1e0Thanks @dyc3! - Added the new nursery rulenoReactStringRefs, which disallows legacy React string refs such asref="hello"andthis.refs.hello.Biome also reports template-literal refs such as
ref={`hello`}, so React code can consistently migrate to callback refs,createRef(), oruseRef().#10010
f3e76abThanks @dyc3! - Fixed a bug in the LSP file watcher registration so Biome now watches.biome.jsonand.biome.jsoncconfiguration files and reloads workspace settings when they change.#10176
8a40ef8Thanks @dyc3! - Fixed #10011: ThenoThisInStaticrule no longer reportsthiswhen it is used as the constructor target innew this(...), which is required for inherited static factory methods.#10163
6867e96Thanks @jiwon79! - Fixed #9884: TheuseSortedAttributesauto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.#10079
d29dd19Thanks @Damix48! - Fixed false positive innoAssignInExpressionsfor Svelte{@​const}blocks. Assignments in{@​const name = value}are now correctly recognized as declarations rather than accidental assignments in expressions.#10080
5d8fdacThanks @Damix48! - Fixed parsing of closing parentheses in Svelte{#each}block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.For example, the following snippets are now parsed correctly:
#10140
e7024b9Thanks @solithcy! - Fixed #10135: Biome no longer crashes on missing Svelte template expressions.The following code snippet longer panics:
#10111
7818009Thanks @jiwon79! - Fixed #9997:noDuplicateSelectorsno longer reports false positives for selectors inside@scopequeries. Biome now treats@scopeas a separate at-rule context, like@media,@supports,@container, and@starting-style.The following snippet is no longer flagged as a duplicate:
#9926
d62b331Thanks @dyc3! - Added the nursery lint ruleuseMathMinMax, which prefersMath.min()andMath.max()over equivalent ternary comparisons.For example, this code:
is much more readable when rewritten as:
#10115
d428d76Thanks @minseong0324! -useExhaustiveSwitchCasesnow flags missingtrue/falsecases forbooleandiscriminants, including whenbooleanis a union variant.#10125
a55a0b6Thanks @bmish! - Fixed a resolver bug where packages that define a typed entry point throughpackage.json'smainfield but omittypeswere ignored during type-aware resolution. Type-aware rules such asnoFloatingPromisescan now inspect imports from those packages.#10117
895e809Thanks @denizdogan! - Added support for thecorner-shapefamily of CSS properties and thesuperellipse()/squircle()value functions, sonoUnknownPropertyandnoUnknownFunctionno longer flag them as unknown.New known properties:
corner-shape,corner-block-end-shape,corner-block-start-shape,corner-bottom-left-shape,corner-bottom-right-shape,corner-bottom-shape,corner-end-end-shape,corner-end-start-shape,corner-inline-end-shape,corner-inline-start-shape,corner-left-shape,corner-right-shape,corner-start-end-shape,corner-start-start-shape,corner-top-left-shape,corner-top-right-shape,corner-top-shape.New known value functions:
superellipse(),squircle().#8620
8df8f73Thanks @dyc3! - Fixed #8062: Added support for parsing Vuev-fordirectives more accurately.#10191
aa055cdThanks @guney! - Now the rulenoStaticElementInteractionsdoesn't trigger custom elements.#9757
2c62594Thanks @dyc3! - Fixed #9099: the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.For example, the following Svelte snippet is now preserved instead of being collapsed to
<div>{name}<!-- comment --></div>:Similarly, HTML elements like
<span>inside a<div>are now preserved when written on their own line:#10105
e7c1a6dThanks @jiwon79! - Fixed #10039:useReadonlyClassPropertiesnow detects unreassigned private members in class expressions and export default classes, not only in class declarations.The following patterns are now correctly flagged:
#10141
46a77d0Thanks @minseong0324! - ImprovednoUnnecessaryConditionsto detect conditions that are always truthy because they check built-in global class instances such asDate,Map,Set,WeakMap, andError.#10178
7b05a89Thanks @dyc3! - Fixed #10177: The HTML parser no longer reports lowercasehtmlordoctypetext as invalid after void elements such as<br>.#10155
0d4595dThanks @jiwon79! - Fixed #10045: the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as:not(:where(...)),:is(:where(...)), and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including:nth-child(... of ...),::part(...), and:active-view-transition-type(...).The following snippet is now correctly formatted, matching Prettier.
#10112
6f0251eThanks @dyc3! - Fixed #10110: Biome's parser now accepts surrogate code points in JavaScript string\u{...}escapes.#10141
46a77d0Thanks @minseong0324! - ImprovednoMisleadingReturnTypeto detectobjectreturn annotations that hide built-in global class instances such asDate,Map,Set,WeakMap, andError.#10083
4a664c1Thanks @ematipico! - Added two new options tonoShadow, both defaulting totrueto match typescript-eslint's behavior.Fixed #9482: Added
ignoreFunctionTypeParameterNameValueShadowoption. When enabled, parameter names inside function type annotations (e.g.(options: unknown) => void) are not flagged as shadowing outer variables.Fixed #7812: Added
ignoreTypeValueShadowoption. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.#9286
52695cfThanks @Hugo-Polloli! - Fixed #6316: Biome now resolves Svelte$storereferences to the underlyingstorebinding in semantic analysis, preventing falsenoUndeclaredVariablesdiagnostics when the store is declared.#10188
ae659ddThanks @dyc3! - Added a new nursery rulenoExcessiveNestedCallbacks, which disallows callbacks nested deeper than the configured maximum.#9757
2c62594Thanks @dyc3! - Fixed #9450: the HTML formatter now correctly preserves multiline formatting for nested<template>elements (e.g.<template #body>) when the source has children on separate lines. Previously, the children were collapsed onto a single line.#10118
c6edcb4Thanks @Netail! - Fixed #10024:biome migrate eslintcorrectly migrateseslintrules that belong to multiple Biome rules.v2.4.13Compare Source
Patch Changes
#9969
c5eb92bThanks @officialasishkumar! - Added the nursery rulenoUnnecessaryTemplateExpression, which disallows template literals that only contain string literal expressions. These can be replaced with a simpler string literal.For example, the following code triggers the rule:
#10037
f785e8cThanks @minseong0324! - Fixed #9810:noMisleadingReturnTypeno longer reports false positives on a getter with a matching setter in the same namespace.#10084
5e2f90cThanks @jiwon79! - Fixed #10034:noUselessEscapeInRegexno longer flags escapes ofClassSetReservedPunctuatorcharacters (&,!,#,%,,,:,;,<,=,>,@,`,~) insidev-flag character classes as useless. These characters are reserved as individual code points inv-mode, so the escape is required.The following pattern is now considered valid:
#10063
c9ffa16Thanks @Netail! - Added extra rule sources from ESLint CSS.biome migrate eslintshould do a bit better detecting rules in your eslint configurations.#10035
946b50eThanks @Netail! - Fixed #10032: useIframeSandbox now flags if there's no initializer value.#9865
68fb8d4Thanks @dyc3! - Added the new nursery ruleuseDomNodeTextContent, which preferstextContentoverinnerTextfor DOM node text access and destructuring.For example, the following snippet triggers the rule:
#10023
bd1e74fThanks @ematipico! - Added a new nursery rulenoReactNativeDeepImportsthat disallows deep imports from thereact-nativepackage. Internal paths likereact-native/Libraries/...are not part of the public API and may change between versions.For example, the following code triggers the rule:
#9885
3dce737Thanks @dyc3! - Added a new nursery ruleuseDomQuerySelectorthat prefersquerySelector()andquerySelectorAll()over older DOM query methods such asgetElementById()andgetElementsByClassName().#9995
4da9cafThanks @siketyan! - Fixed #9994: Biome now parses nested CSS rules correctly when declarations follow them inside embedded snippets.#10009
b41cc5aThanks @Jayllyz! - Fixed #10004:noComponentHookFactoriesno longer reports false positives for object methods and class methods.#9988
eabf54aThanks @Netail! - Tweaked the diagnostics range for useAltText, useButtonType, useHtmlLang, useIframeTitle, useValidAriaRole & useIfameSandbox to report on the opening tag instead of the full tag.#10043
fc65902Thanks @mujpao! - Fixed #10003: Biome no longer panics when parsing Svelte files containing{#}.#9815
5cc83b1Thanks @dyc3! - Added the new nursery rulenoLoopFunc. When enabled, it warns when a function declared inside a loop captures outer variables that can change across iterations.#9702
ef470baThanks @ryan-m-walker! - Added the nursery ruleuseRegexpTestthat enforcesRegExp.prototype.test()overString.prototype.match()andRegExp.prototype.exec()in boolean contexts.test()returns a boolean directly, avoiding unnecessary computation of match results.Invalid
Valid
#9743
245307dThanks @leetdavid! - Fixed #2245: Svelte<script>tag language detection when thegenericsattribute contains>characters (e.g.,<script lang="ts" generics="T extends Record<string, unknown>">). Biome now correctly recognizes TypeScript in such script blocks.#10046
0707de7Thanks @Conaclos! - Fixed #10038:organizeImportsnow sorts imports in TypeScript modules and declaration files.#10012
94ccca9Thanks @ematipico! - Added the nursery rulenoReactNativeLiteralColors, which disallows color literals inside React Native styles.The rule belongs to the
reactNativedomain. It reports properties whose name containscolorand whose value is a string literal when they appear inside aStyleSheet.create(...)call or inside a JSX attribute whose name containsstyle.#10005
131019eThanks @ematipico! - Added the nursery rulenoReactNativeRawText, which disallows raw text outside of<Text>components in React Native.The rule belongs to the new
reactNativedomain.Additional components can be allowlisted through the
skipoption:#9911
1603f78Thanks @Netail! - Added the nursery rulenoJsxLeakedDollar, which flags text nodes with a trailing$if the next sibling node is a JSX expression. This could be an unintentional mistake, resulting in a '$' being rendered as text in the output.Invalid:
#9999
f42405fThanks @minseong0324! - FixednoMisleadingReturnTypeincorrectly flagging functions with reassignedletvariables.#10075
295f97fThanks @ematipico! - Fixed#9983: Biome now parses functions declared inside Svelte#snippetblocks without throwing errors.#10006
cf4c1c9Thanks @minseong0324! - Fixed #9810:noMisleadingReturnTypeincorrectly flagging nested object literals with widened properties.#10033
11ddc05Thanks @ematipico! - Added the nursery ruleuseReactNativePlatformComponentsthat ensures platform-specific React Native components (e.g.ProgressBarAndroid,ActivityIndicatorIOS) are only imported in files with a matching platform suffix. It also reports when Android and iOS components are mixed in the same file.The following code triggers the rule when the file does not have an
.android.jssuffix:v2.4.12Compare Source
Patch Changes
#9376
9701a33Thanks @dyc3! - Added thenursery/noIdenticalTestTitlelint rule. This rule disallows using the same title for twodescribeblocks or two test cases at the same nesting level.#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics foruseForOfto better explain the problem, why it matters, and how to fix it.#9916
27dd7b1Thanks @Jayllyz! - Added a new nursery rulenoComponentHookFactories, that disallows defining React components or custom hooks inside other functions.For example, the following snippets trigger the rule:
#9980
098f1ffThanks @ematipico! - Fixed #9941: Biome now emits awarningdiagnostic when a file exceed thefiles.maxSizelimit.#9942
9956f1dThanks @dyc3! - Fixed #9918:useConsistentTestItno longer panics when applying fixes to chained calls such astest.for([])("x", () => {});.#9891
4d9ac51Thanks @dyc3! - Improved thenoGlobalObjectCallsdiagnostic to better explain why calling global objects likeMathorJSONis invalid and how to fix it.#9902
3f4d103Thanks @ematipico! - Fixed #9901: the commandlint --writeis now idempotent when it's run against HTML-ish files that contains scripts and styles.#9891
4d9ac51Thanks @dyc3! - Improved thenoMultiStrdiagnostic to explain why escaped multiline strings are discouraged and what to use instead.#9966
322675eThanks @siketyan! - Fixed #9113: Biome now parses and formats@mediaand other conditional blocks correctly inside embedded CSS snippets.#9835
f8d49d9Thanks @bmish! - ThenoFloatingPromisesrule now detects floating promises through cross-module generic wrapper functions. Previously, patterns likeexport const fn = trace(asyncFn)— wheretracepreserves the function signature via a generic<F>(fn: F): F— were invisible to the rule when the wrapper was defined in a different file.#9981
02bd8ddThanks @siketyan! - Fixed #9975: Biome now parses nested CSS selectors correctly inside embedded snippets without requiring an explicit&.#9949
e0ba71dThanks @Netail! - Added the nursery ruleuseIframeSandbox, which enforces thesandboxattribute foriframetags.Invalid:
#9913
d417803Thanks @Netail! - Added the nursery rulenoJsxNamespace, which disallows JSX namespace syntax.Invalid:
#9892
e75d70eThanks @dyc3! - Improved thenoSelfComparediagnostic to better explain why comparing a value to itself is suspicious and what to use for NaN checks.#9861
2cff700Thanks @dyc3! - Added the new nursery ruleuseVarsOnTop, which requiresvardeclarations to appear at the top of their containing scope.For example, the following code now triggers the rule:
#9892
e75d70eThanks @dyc3! - Improved thenoThenPropertydiagnostic to better explain why exposingthencan create thenable behavior and how to avoid it.#9892
e75d70eThanks @dyc3! - Improved thenoShorthandPropertyOverridesdiagnostic to explain why later shorthand declarations can unintentionally overwrite earlier longhand properties.#9978
4847715Thanks @mdevils! - Fixed #9744:useExhaustiveDependenciesno longer reports false positives for variables obtained via object destructuring with computed keys, e.g.const { [KEY]: key1 } = props.#9892
e75d70eThanks @dyc3! - Improved thenoRootTypediagnostic to better explain that the reported root type is disallowed by project configuration and how to proceed.#9927
7974ab7Thanks @dyc3! - Added eslint-plugin-unicorn'sno-nested-ternaryas a rule source fornoNestedTernary#9873
19ff706Thanks @minseong0324! -noMisleadingReturnTypenow checks class methods, object methods, and getters in addition to functions.#9888
362b638Thanks @dyc3! - Updated metadata forbiome migrate eslintto better reflect which ESLint rules are redundant versus unsupported versus unimplemented.#9892
e75d70eThanks @dyc3! - Improved thenoAutofocusdiagnostic to better explain why autofocus harms accessibility outside allowed modal contexts.#9982
d6bdf4aThanks @dyc3! - Improved performance of noMagicNumbers.Biome now maps ESLint
no-magic-numberssources more accurately duringbiome migrate eslint.#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics fornoConstantConditionto better explain the problem, why it matters, and how to fix it.#9866
40bd180Thanks @dyc3! - Added a new nursery rulenoExcessiveSelectorClasses, which limits how many class selectors can appear in a single CSS selector.#9796
f1c1363Thanks @dyc3! - Added a new nursery ruleuseStringStartsEndsWith, which prefersstartsWith()andendsWith()over verbose string prefix and suffix checks.The rule uses type information, so it only reports on strings and skips array lookups such as
items[0] === "a".#9942
9956f1dThanks @dyc3! - Fixed the safe fix fornoSkippedTestsso it no longer panics when rewriting skipped test function names such asxit(),xtest(), andxdescribe().#9874
9e570d1Thanks @minseong0324! - Type-aware lint rules now resolve members throughPick<T, K>andOmit<T, K>utility types.#9909
0d0e611Thanks @Netail! - Added the nursery ruleuseReactAsyncServerFunction, which requires React server actions to be async.Invalid:
#9925
29accb3Thanks @ematipico! - Fixed #9910: added support for parsing member expressions in Svelte directive properties. Biome now correctly parses directives likein:renderer.in|global,use:obj.action, and deeply nested forms likein:a.b.c|global.#9904
e7775a5Thanks @ematipico! - Fixed #9626:noUnresolvedImportsno longer reports false positives for named imports from packages that have a corresponding@types/*package installed. For example,import { useState } from "react"with@types/reactinstalled is now correctly recognised.#9942
9956f1dThanks @dyc3! - Fixed the safe fix fornoFocusedTestsso it no longer panics when rewriting focused test function names such asfit()andfdescribe().#9577
c499f46Thanks @tt-a1i! - Added the nursery ruleuseReduceTypeParameter. It flags type assertions on the initial value passed toArray#reduceandArray#reduceRightand recommends using a type parameter instead.#9895
1c8e1efThanks @Netail! - Added extra rule sources from react-xyz.biome migrate eslintshould do a bit better detecting rules in your eslint configurations.#9891
4d9ac51Thanks @dyc3! - Improved thenoInvalidUseBeforeDeclarationdiagnostic to better explain why using a declaration too early is problematic and how to fix it.#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics fornoRedeclareto better explain the problem, why it matters, and how to fix it.#9875
a951586Thanks @minseong0324! - Type-aware lint rules now resolve members throughPartial<T>,Required<T>, andReadonly<T>utility types, preserving optional, readonly, and nullable member flags.v2.4.11Compare Source
Patch Changes
#9350
4af4a3aThanks @dyc3! - Added the new nursery rule useConsistentTestIt in thetestdomain. The rule enforces consistent use of eitheritortestfor test functions in Jest/Vitest suites, with separate control for top-level tests and tests insidedescribeblocks.Invalid:
#9429
a2f3f7eThanks @ematipico! - Added the new nursery lint ruleuseExplicitReturnType. It reports TypeScript functions and methods that omit an explicit return type.#9828
9e40844Thanks @ematipico! - Fixed #9484: the formatter no longer panics when formatting files that containgraphqltagged template literals combined with parenthesized expressions.#9886
e7c681eThanks @ematipico! - Fixed an issue where, occasionally, some bindings and references were not properly tracked, causing false positives fromnoUnusedVariablesandnoUndeclaredVariablesin Svelte, Vue, and Astro files.#9760
5b16d18Thanks @myx0m0p! - Fixed #4093: thenoDeleterule no longer triggers fordelete process.env.FOO, sincedeleteis the documented way to remove environment variables in Node.js.#9799
2af8efdThanks @minseong0324! - Added the rulenoMisleadingReturnType. The rule detects when a function's return type annotation is wider than what the implementation actually returns.#9880
7f67749Thanks @dyc3! - Improved the diagnostics foruseFindto better explain the problem, why it matters, and how to fix it.#9755
bff7bdbThanks @ematipico! - Improved performance of fix-all operations (--write). Biome is now smarter when it runs lint rules and assist actions. First, it runs only rules that have code fixes, and then runs the rest of the rules.#8651
aafca2dThanks @siketyan! - Add a new lint ruleuseDisposablesfor JavaScript, which detects disposable objects assigned to variables withoutusingorawait usingsyntax. Disposable objects that implement theDisposableorAsyncDisposableinterface are intended to be disposed of after use. Not disposing them can lead to resource or memory leaks, depending on the implementation.Invalid:
Valid:
#9788
53b8e57Thanks @MeGaNeKoS! - Fixed #7760: Added support for CSS scroll-driven animationtimeline-range-namekeyframe selectors (cover,contain,entry,exit,entry-crossing,exit-crossing). Biome no longer reports parse errors on keyframes likeentry 0% { ... }orexit 100% { ... }.#9728
5085424Thanks @mkosei! - Fixed #9696: Astro frontmatter now correctly parses regular expression literals like/\d{4}/.#9261
16b6c49Thanks @ematipico! - Fixed #8409: CSS formatter now correctly places comments after the colon in property declarations.Previously, comments that appeared after the colon in CSS property values were incorrectly moved before the property name:
#9441
957ea4cThanks @soconnor-seeq! - Fixed #1630: LSP project selection now prefers the most specific project root in nested workspaces.#9878
de6210fThanks @ematipico! - Fixed #9118:noUnusedImportsno longer reports false positives for default imports used inside Svelte, Vue and Astro components.#9879
ce7e2b7Thanks @dyc3! - Fixed a parser diagnostic's message when vue syntax is disabled so that it no longer references the non-existanthtml.parser.vueoption. This option will become available in 2.5.#9880
7f67749Thanks @dyc3! - Improved the diagnostics foruseRegexpExecto better explain the problem, why it matters, and how to fix it.#9846
b7134d9Thanks @ematipico! - Fixed #9140: Biome now parses Astro's attribute shorthand inside.astrofiles. The following snippet no longer reports a parse error:#9790
67df09dThanks @dyc3! - Fixed #9781: Trailing comments after a top-levelbiome-ignore-all formatsuppression are now preserved instead of being dropped. This applies to JavaScript, CSS, HTML, JSONC, GraphQL, and Grit files.#9745
d87073eThanks @ematipico! - Fixed #9741: the LSP server now correctly returns theorganizeImportscode action when the client requests it viasource.organizeImports.biomein theonlyfilter. Previously, editors withcodeAction/resolvesupport (e.g. Zed) received an empty response because the action was serialized with the wrong kind (source.biome.organizeImportsinstead ofsource.organizeImports.biome).#9880
7f67749Thanks @dyc3! - Improved the diagnostics foruseArraySometo better explain the problem, why it matters, and how to fix it.#9795
1d09f0fThanks @dyc3! - RelaxeduseExplicitTypefor trivially inferrable types.Type annotations can now be omitted when types are trivially inferrable from:
const sum = 1 + 1)const isEqual = 'a' === 'b',const isTest = process.env.NODE_ENV === 'test')const and = true && false)const date = new Date())const arr = [1, 2, 3])const val = true ? 'yes' : 'no')const num = Math.random())const fn = (max = MAX_ATTEMPTS) => ...)Comparison expressions always return
boolean, so any operands are now allowed(including property access like
process.env.NODE_ENV).Parameters with default values no longer require type annotations, as TypeScript
can infer the type from the default value (even when referencing variables).
Also removed the redundant
anytype validation from this rule. Theanytypeis now only validated by the dedicated
noExplicitAnyrule, following theSingle Responsibility Principle.
#9809
e8cad58Thanks @Netail! - Added the new nursery ruleuseQwikLoaderLocation, which enforces that Qwik loader functions are declared in the correct location.#9877
fc9d715Thanks @ematipico! - Fixed #9136 and #9653:noUndeclaredVariablesandnoUnusedVariablesno longer report false positives on several Svelte template constructs that declare or reference bindings in the host grammar:{#snippet name(params)}— the snippet name and its parameters (including object, array, rest, and nested destructuring) are now tracked.{@​render name(args)}— the snippet name used at the render site is now resolved against the snippet declaration.{#each items as item, index (key)}— theitembinding (plain identifier or destructured), the optionalindex, and the optionalkeyexpression are now tracked.{@​const name = value}— the declared name is now tracked as a binding and the initializer is analyzed for undeclared references.{@​debug a, b, c}— each debugged identifier is now analyzed and reported if undeclared.<img {src} />— the curly-shorthand attribute is now analyzed as an expression, so undeclared references inside it are reported.For example, the following template no longer triggers either rule:
#9869
78bce77Thanks @Netail! - UpdatednoDuplicateFieldDefinitionNamesto also flag duplicate fields within type extensions, interface extensions & input extensions.#9739
0bc2198Thanks @dyc3! - Fixed Grit queries that use native Biome AST node names with the native field names that are in our.ungramgrammar files. Queries such asJsConditionalExpression(consequent = $cons, alternate = $alt)now compile successfully inbiome searchand grit plugins.#9811
2dddca3Thanks @dyc3! - UpdatednoImpliedEvalto flagnew Function()usages, as its a form of indirecteval, and to includeno-new-funcas a rule source.#9870
ccf9770Thanks @Netail! - Marked eslint-qwik-plugin'sunused-serveras redundant since it was covered bynoUnusedVariables.#9701
1417c3bThanks @dyc3! - Added the new nursery rulenoUselessTypeConversion, which reports redundant primitive conversion patterns such asString(value)whenvalueis already a string.#9248
49f00a3Thanks @pkallos! -useNullishCoalescingnow also detects ternary expressions that check fornullorundefinedand suggests rewriting them with??. A newignoreTernaryTestsoption allows disabling this behavior.#9863
6a44619Thanks @ematipico! - Fixed #9690:biome check --writeis now idempotent on HTML files that contain embedded<style>or<script>blocks. Previously, each run reported "Fixed 1 file" even when the file content did not actually change, because the embedded language formatter's output was not re-indented to match the surrounding HTML block.clerk/javascript (@clerk/ui)
v1.25.7Compare Source
Patch Changes
Ensure the keyless prompt renders above application content by setting an explicit
z-index. (#9211) by @alexcarpenterThe OAuth consent screen now shows a recognizable brand mark for well-known OAuth clients (Claude, ChatGPT) when the requesting application has not uploaded its own logo. (#9158) by @alexcarpenter
v1.25.6Compare Source
Patch Changes
Add an experimental
oidcSelfServeoption to enable the self-serve OIDC configuration flow in<ConfigureSSO />. (#9198) by @NicolasLopes7Updated dependencies [
858a689,c904fb4]:v1.25.5Compare Source
Patch Changes
Fix pressing
Escapewhile aSelectis open inside aDrawer(for example the payment method picker in Checkout) dismissing the entire Drawer.Escapenow closes only the openSelectand leaves the Drawer open. TheSelectnow wires up its floating interaction props so it handlesEscapeitself, and theDrawerroots a floating tree so nested floating elements are recognized as its children. (#9176) by @alexcarpenterImprove
Selectkeyboard and screen reader support by routing navigation through floating-ui's interaction hooks. PressingArrowUp/ArrowDownon a focused, closedSelectnow opens the listbox, and the active option is announced viaaria-activedescendant. The searchable variant (for example thePhoneInputcountry picker) now exposes a proper combobox: its input is markedrole="combobox"witharia-controls,aria-autocomplete="list", andaria-activedescendant, while the plain variant keeps its listbox semantics. (#9179) by @alexcarpenterUpdated dependencies [
bcbdda6]:v1.25.4Compare Source
Patch Changes
Reduce layout shift while loading the organization and billing UI. The domain list, billing subscription section, and payment methods now reserve their loaded height while data is fetched, and the subscription section shows a loading indicator instead of rendering nothing. (#9169) by @alexcarpenter
Improve phone input country selector and menu item styling, refining hover and focus states, spacing, and scroll padding. (#9161) by @alexcarpenter
Fix table row hover styling so the rounded bottom corners are only applied to the last row, matching the table's border radius. Previously any hovered row showed a stray corner radius. (#9170) by @alexcarpenter
Headings now use
text-wrap: balanceand body text usestext-wrap: prettyto reduce widows and orphans when text wraps across lines. This is a progressive enhancement that falls back to normal wrapping in browsers without support. (#9157) by @alexcarpenterUpdated dependencies [
e162b71]:v1.25.3Compare Source
Patch Changes
Fix small actions button border radius to ensure consistency. (#9146) by @alexcarpenter
Reduce the organization avatar's border radius in the
OrganizationSwitchertrigger so it stays proportional at the smaller trigger size. (#9148) by @alexcarpenterSet
box-sizing: border-boxon the spinner so its border no longer changes the rendered size and causes a layout shift. (#9147) by @alexcarpenterUpdated dependencies [
d8fc1d7,1d0e78c]:v1.25.2Patch Changes
Add a clear button to search inputs for quickly resetting the current query. It appears in the
<APIKeys />search and the<OrganizationProfile />members search. (#9098) by @alexcarpenterSearch inputs now expose a shared
searchInputappearance element (layered alongside any existing component-specific element), and the clear button is themeable via the new sharedsearchInputClearButtonelement. The clear button's label can be customized with the new sharedsearchInput.action__clearlocalization key.Fix org invitation and request action descriptions alignment. (#9118) by @alexcarpenter
Polish the
<OrganizationSwitcher />: (#9112) by @maxyingerIncrease the default height of buttons and inputs by 2px for larger, easier-to-tap touch targets, especially on mobile. (#9061) by @alexcarpenter
Updated dependencies [
8dbf343]:v1.25.1Patch Changes
62f6702]:v1.25.0Compare Source
Minor Changes
Add support for Clerk Protect mid-flow SDK challenges (
protect_check) on both sign-up and sign-in. (#8329) by @zourzouvillysWhen the Protect antifraud service issues a challenge, responses now carry a
protectCheckfieldwith
{ status, token, sdkUrl, expiresAt?, uiHints? }. Clients resolve the gate by loading theSDK at
sdkUrl, executing the challenge, and submitting the resulting proof token viasignUp.submitProtectCheck({ proofToken })orsignIn.submitProtectCheck({ proofToken }). Theresponse may carry a chained challenge, which the SDK resolves iteratively.
Sign-in adds a new
'needs_protect_check'value to theSignInStatusunion. Upgrading thispackage is type-only and does not change runtime behavior: the server returns the new status
(and the
protectCheckfield) only for instances where Protect mid-flow challenges have beenexplicitly enabled — the feature is off by default and is not enabled for existing instances by
upgrading. The server additionally only emits the new status value to SDK versions that
understand it, so older clients never receive an unknown status.
If an exhaustive
switchonsignIn.statusflags the new value after upgrading, handle it byrunning the challenge described by
protectCheckand submitting the proof viasubmitProtectCheck(). Clients should treat theprotectCheckfield as the authoritative gatesignal and fall back to the status value for defense in depth.
The pre-built
<SignIn />and<SignUp />components handle the gate automatically by routingto a new
protect-checkroute that runs the challenge SDK and resumes the flow on completion.Patch Changes
Fix the payment method form getting stuck in a loading state after a failed card setup. Non-validation errors such as 3DS authentication failures are now displayed. (#9080) by @aeliox
Fix the organization profile modal close button overlapping the SSO configuration wizard's step header. (#9089) by @iagodahlem
Enlarge the show/hide password toggle button's hit area with added padding and rounded corners, making it easier to tap and giving it a clearer hover/focus target. (#9096) by @alexcarpenter
Polish the Protect check card: the loading spinner now hides while a challenge widget (e.g. Turnstile) is visible instead of spinning alongside it, only appears after a short delay so near-instant checks never flash it, and the card no longer reserves empty space above the spinner before a widget has rendered. (#9099) by @mwickett
Fix standalone
<SignUp />Protect checks so the verification card stays mounted while a solved challenge routes to the next step, while stale direct visits to the protect-check route return to the start of the sign-up flow. (#9082) by @mwickettFix tooltips rendering behind modals (for example on the organization profile Security page). Tooltips now layer above modal content, and pressing Escape or clicking outside while a tooltip is open inside a modal closes only the tooltip instead of also dismissing the modal. (#9093) by @alexcarpenter
Updated dependencies [
6f97ef5,bab1f29,f2d9e4b]:v1.24.2Compare Source
Patch Changes
Fix the checked checkbox appearing as a blank filled box in dark themes. The checkmark now uses the
colorPrimaryForegroundtheme color, so it stays legible against the checkbox background across light, dark, and custom themes. (#9074) by @alexcarpenterOn the Test step of the self-serve SSO configuration flow, clicking Continue now re-checks for a successful test run before blocking, so a successful run completed in a separate browser tab is recognized without first clicking Refresh logs. (#9046) by @iagodahlem
Use locale and currency aware formatting for negative money amounts (#9064) by @dstaley
Fix icon-only social buttons rendering taller than the ones with text. They now size to the same height as the text (block) buttons across all appearance spacing and font-size settings, keeping every social button in a row consistent. (#9058) by @alexcarpenter
Stop
truncateWithEndVisiblefrom splitting characters outside the BMP (such as CJK Extension B kanji and emoji) into a broken replacement character when truncating to a very small width. The short-width fallback now slices by code point, matching the main truncation path. (#9047) by @alexcarpenterUpdated dependencies [
1efc7e5,5028b54,2e1fec7]:v1.24.1Compare Source
Patch Changes
v1.24.0Compare Source
Minor Changes
Patch Changes
Fix
<UserButton />session actions alignment. (#9034) by @andrewtamUpdated dependencies [
4306146,533f0b1]:v1.23.1Compare Source
Patch Changes
UserProfile should show attributes enabled for sign in (#8042) by @dmoerner
Fix missing redirect URL protocol validation for Clerk UI browser navigations, including the multi-session add-account flow. (#8961) by @jacekradko
Internal browser navigations now consistently honor configured redirect protocols and fail closed across mixed ClerkJS/UI bundle versions.
Updated dependencies [
cb76aa2]:v1.23.0Minor Changes
Handle expired organization domains on self-serve SSO flow, allowing to trigger a new verification (#9000) by @LauraBeatris
Add drag-to-upload support in AvatarUploader (#8348) by @alexcarpenter
Patch Changes
Fix the self-serve SSO configuration wizard losing your place when organization data refetches mid-flow. After submitting a Configure step (for example saving an identity provider's metadata), a background refetch on the OrganizationProfile Security page could unmount the open ConfigureSSO wizard and re-render it on an earlier step. The wizard now stays on its current step while data loads in the background. (#8999) by @iagodahlem
Fix focus ring visibility on
Tabelements for keyboard navigation. (#8998) by @alexcarpenterUpdated dependencies [
19ce04a,3e036f4]:v1.22.0Minor Changes
fr-FR, a USD 1000 amount now renders as1 000,00 $US; previously, it rendered as$1,000.00regardless of your application's configured locale. (#8918) by @dstaleyPatch Changes
Fix the
<ConfigureSSO />wizard header on small screens: the back link now stacks above the step indicators and the step separators are hidden, so the steps no longer wrap onto a second line. (#8984) by @iagodahlemUpdated dependencies [
fd7b824,af0eb3f,8024cac]:v1.21.0Compare Source
Minor Changes
Migrate from
:focusto:focus-visibleso focus rings only appear during keyboard navigation (#8595) by @alexcarpenterImprove UserButton and OrganizationSwitcher accessibility. The trigger button now announces itself as a dialog trigger (
aria-haspopup="dialog") and the popover usesrole="dialog"instead ofrole="menu". UserButton and OrganizationSwitcher popovers now receive focus when opened, and actions are logically grouped with labelledrole="group"elements for screen readers. (#8325) by @alexcarpenterPatch Changes
Condense the OrganizationProfile Security page SSO overview to a single summary row (one-line description, domains as chips, status badge, actions under the overflow menu) and remove the now-unused ssoSection provider/sign-on URL/issuer/descriptionLine2 localization keys. (#8915) by @iagodahlem
Updates development mode indicator styling. (#8917) by @alexcarpenter
Add a generic
FLOW_STEP_MOUNTEDtelemetry event (eventFlowStepMounted) for measuring multi-step flow funnels, and wire it into the self-serve SSO flow (#8951) by @LauraBeatrisAdd localization support for OAuth access denied errors. (#8786) by @wobsoriano
Allow changing enterprise connection provider between self-serve SSO steps (#8881) by @LauraBeatris
The Security tab in
<OrganizationProfile />is now hidden for members who lack the manage enterprise connections permission (org:sys_entconns:manage), instead of rendering a permission-denied state. This matches how the Members, Billing, and API keys tabs are gated. (#8971) by @iagodahlemSelf-serve SSO: fix the configuration wizard rendering a blank step when a connection is reset from the first configuration step. Resetting now returns to the provider selection step. (#8970) by @iagodahlem
Self-serve SSO: restore keyboard-accessible provider selection, mark configuration wizard steps complete based on connection state rather than position, and fix the organization Security page loading state. (#8940) by @iagodahlem
Updated dependencies [
c38d853,7e3174a,97039bb,f43071d,0e0ff11,0039618,a536a0d]:v1.20.0Compare Source
Minor Changes
Introduces organization membership feature. (#8933) by @NicolasLopes7
Organizations can enforce exclusive membership, limiting users to a single organization. During the
choose-organizationsession task, members of such an organization are automatically activated instead of seeing the picker.Organization.exclusiveMembershipis now exposed on the Organization resource.Patch Changes
01789b4]:v1.19.0Minor Changes
v1.18.1Patch Changes
Improve the accessible label for identity edit buttons in verification flows. (#8902) by @austincalvelage
Remove hidden password input from accessibility tree when hidden (#8899) by @alexcarpenter
Add support for the
inertattribute usage under React 19. Inert content is now correctly non-interactive on both React 18 and 19. (#8820) by @alexcarpenterFix checkbox default styles when using the simple theme. (#8922) by @alexcarpenter
Improve Menu keyboard navigation and accessibility. Menus now support
Enter/Spaceto open from the trigger,ArrowDown/ArrowUp/Home/Endto move focus,Escapeto close and return focus to the trigger, and skip disabled items during arrow-key navigation. Menus no longer mark the rest of the page asaria-hiddenwhile open, so assistive technologies can still reach surrounding content. (#8333) by @alexcarpenterThe SSO setup flow now ends on an explicit Activate step: after configuring and testing a connection you confirm activation with an Activate SSO action (or skip and activate later) instead of a static confirmation summary. (#8882) by @iagodahlem
Fix the X (formerly Twitter) provider logo being nearly invisible in dark mode by recoloring it to match the foreground color, consistent with other monochrome provider icons. (#8912) by @jordan-bott
Updated dependencies [
c84f8df,53e7b11,e51e22a]:v1.18.0Minor Changes
Introduce organization domains with TXT verification on self-serve SSO flow (#8788) by @LauraBeatris
Improve
OrganizationProfileUI: (#8898) by @LauraBeatrisVerified domainssection when there are no domains and the user lacks permission to add themOrganization profilesection toProfilefor consistency withUserProfilePatch Changes
When inviting organization members requires purchasing additional seats, invitations are now sent automatically after checkout completes successfully. (#8869) by @dstaley
Add confirmation dialog for organization domain deletion as part of self-serve SSO (#8866) by @LauraBeatris
The Security page's SSO wizard now has a back-to-Security control, and Start/Edit open the wizard at the first step (Continue resumes where you left off). (#8864) by @iagodahlem
Updated dependencies [
d5968d0,431e16c,ffbc650]:v1.17.0Compare Source
Minor Changes
Patch Changes
Add an overview to the organization profile Security page. The page now lands on a summary of the SSO connection — a status badge (Unconfigured, In Progress, Active, Inactive), the configuration details framed in a card (provider, domain, sign-on URL, issuer, certificate), and an actions menu with Edit, Activate / Deactivate, and Remove — and switches into the existing configuration flow on Start, Continue, or Edit. (#8813) by @iagodahlem
Rename the
<OrganizationProfile />SSO page to "Security". The navbar entry is now labeled "Security" with a shield icon, its route path changed fromorganization-self-serve-ssotoorganization-security, and a neworganizationProfile.navbar.securitylocalization key replacesorganizationProfile.navbar.selfServeSSO. (#8796) by @iagodahlemUpgrade build tooling to Rspack 2 (No user-facing API changes). (#8382) by @jacekradko
Updated dependencies [
f4167ec,17e4164,ed2cf75,67c04a4,51c8fdc,c2ba971,8744728,d9b5c7d]:v1.16.1Compare Source
Patch Changes
Fix checkout button label showing "Start free trial" when adding seats during a free trial period (#8829) by @mauricioabreu
Migrate the build pipeline to tsdown and TypeScript 6.0. This is an internal tooling change with no intended changes to the public API or runtime behavior. (#8177) by @dstaley
Updated dependencies [
f046c49,b5fa9f6,3d5b2fe]:v1.16.0Compare Source
Minor Changes
orgIdandminSeatsparameters togetPlans().seatsQuantityandpriceIdparameters to checkout creation.totalsfield on payments.availablePricesfield on plans.nextPaymentfield on subscription items.discountsfield on checkouts.nextPaymentfor more granularity.Patch Changes
Display the scope description for
user:org:readorganization access in the OAuth Consent dialog so users understand organization membership information is being shared with the OAuth client. (#8798) by @jfosheeFix alignment of the domain section subtitle in the organization profile to match the button above it. (#8795) by @alexcarpenter
Updated dependencies [
a5c7bc7]:v1.15.1Compare Source
Patch Changes
Fix Chrome-specific scroll jump when toggling the billing period switch on the pricing table. (#8742) by @alexcarpenter
Fix a circular import in the styled-system that could crash module initialization under bundler configurations with tree-shaking disabled. (#8754) by @jacekradko
Internal refactor for self-serve SSO wizard navigation to leverage a guard-based state machine. (#8715) by @iagodahlem
It makes the step navigation more predictable: the step you land on (including after a reload) and which steps you can move to are derived from the connection's state, the connection reset flow lands you on the right step.
Correctly display OAuth consent redirect domains for known multi-label public suffixes. (#8700) by @wobsoriano
Fix modal backdrop appearing light in dark mode (#8743) by @alexcarpenter
Add a "Forgot password?" action on the sign-in start page when the password field is shown. This improves the account recovery UX when strict user enumeration protection is enabled. (#8733) by @Ephem
Add and improve JSDoc comments across public types and methods to support generated reference documentation for the
/objectsdocs section. Exports a few previously-internal types (OnEventListener,OffEventListener,ClerkOptionsNavigation) so they can be referenced from the generated docs. (#8276) by @alexisintechUpdated dependencies [
2d6670c,af706e3,032632c,0fece6f,b295af3,8e1bd48,90bc732]:v1.15.0Compare Source
Minor Changes
<ConfigureSSO />refactor to call new org-scoped enterprise connections FAPI endpoints, replacing the/me/deprecated scope. (#8671) by @iagodahlemPatch Changes
Add support for Google Workspace SAML provider to self-serve SSO (#8690) by @LauraBeatris
Layer architecture for configure steps per IdP and protocol on
<ConfigureSSO />(#8651) by @LauraBeatrisReworks the
<ConfigureSSO />confirmation step and adds a dedicated reset connection dialog: (#8706) by @iagodahlem<ResetConnectionDialog />— a modal-based, type-to-confirm dialog scoped to the wizard container that replaces the inline reset confirmation card. Wraps the destructive delete behinduseReverification, clears the local provider selection, and rewinds the wizard to provider selection on success.Active/Inactivebadge, grouped Enable SSO and Domain rows, two-column configuration details rendered throughProfileSection.ItemList, outlinedConfigure again, destructiveReset connection, and an inactive-state banner inside the step footer.Step.Headernow accepts abadgeprop so a step can render an inline status pill next to its title without crowding the right-aligned children slot.OrganizationProfileforwards the shared content ref to<ConfigureSSO />so the new dialog portals into the wizard chrome when the component is embedded inside the organization profile."Fix rendering issue for free trial badge." (#8712) by @l-armstrong
Fix the legal consent checkbox growing in size when its label wraps to a second line while using the
simpletheme. The checkbox is now aligned to the start of the row so it no longer stretches to match the label height. (#8705) by @dmoernerAvoid sending duplicate verification codes when persisted email or phone code verifications are already pending. (#8548) by @jacekradko
Adds a wizard-wide reset connection entry on the
<ConfigureSSO />step footers: (#8711) by @iagodahlemStep.Footer.Resetcompound part that renders a destructive ghost button on the leading edge of the footer and opens the existingResetConnectionDialog. The slot owns its own open state and gates itself on the current enterprise connection, so it stays hidden on the provider selection step.configureSSOFooterResetButtonelement descriptor so the new button surface can be themed via appearance customizations.Fix stepper chevron wrapping in
<ConfigureSSO />(#8693) by @alexcarpenterAdd support for Microsoft Entra SAML provider to self-serve SSO (#8695) by @LauraBeatris
Add mobile support for
<ConfigureSSO />navbar to display application name, logo and organization name (#8675) by @LauraBeatrisScope the
UserProfileactive-devices fetch cache byuser.idso a session switch or sign-out/sign-in on a shared device no longer renders the previous user's device activity (IP, location, browser/device) from the module-scoped cache. (#8703) by @dominic-clerkUpdated dependencies [
afb75e6,c3df67a,86fd38f,8d6bb56,43dfefa,5fc7b21,c2ba134]:v1.14.0Compare Source
Minor Changes
Migrate to new icon set to create consistency across components. (#8319) by @alexcarpenter
Display "Single Sign-on (SSO)" section in
OrganizationProfileif self-serve SSO is enabled on the current active organization (#8600) by @LauraBeatrisPatch Changes
Simplify ActionCard shadow styling. (#8625) by @alexcarpenter
Add a visible radio indicator to each provider card on the
<ConfigureSSO />Select Provider step. (#8664) by @iagodahlemIntroduce UX improvements for
<ConfigureSSO />such as: (#8601) by @LauraBeatrisUpdated dependencies [
e538525,79cdd1f,0937b5d,48e3f64,4af9389,4d5027b,10d36ab,4e08924,bcf0e77]:v1.13.1Compare Source
Patch Changes
Fix the Manage Subscription button in
<UserProfile />/<OrganizationProfile />and the Cancel / Re-subscribe actions in<SubscriptionDetails />so they are shown for paid seat-based plans that have no base fee. A sharedisManageableSubscriptionItemhelper now drives both places, treating "free / unmanageable" as "the instance's default plan" instead of "the plan has no base fee". (#8375) by @mauricioabreuUpdated dependencies [
a036ce8]:v1.13.0Compare Source
Minor Changes
Remove
<ConfigureSSO />from experimental path (#8588) by @LauraBeatrisAdd
elevationappearance option with'raised'(default) and'flush'values. When set toflush, card-based components render without border, box-shadow, border-radius, outer padding, and footer background, allowing them to sit flat against their container. Applies to<SignIn />,<SignUp />,<Waitlist />,<CreateOrganization />,<OrganizationList />,<OAuthConsent />,<UserVerification />, and session task components. Profile and popover components always render as raised. Modal components always render as raised regardless of this setting. (#8510) by @alexcarpenterThe
cardBoxelement exposes adata-elevation="flush"attribute when flush is active, giving className-based themes a hook to neutralize their card chrome via attribute selectors. Theshadcntheme uses this hook to drop itsshadow-sm borderutilities under flush.Patch Changes
Add
ProfileCard.PageforUserProfileandOrganizationProfilepages (#8602) by @LauraBeatrisFix layout shift when Copy test URL button enters loading state in
<ConfigureSSO />(#8592) by @alexcarpenterImprove ClipboardInput positioning and accessibility by using
readOnlyinstead ofisDisabled(#8593) by @alexcarpenterUpdated dependencies [
6eaf4d6,1aab31e]:v1.12.1Patch Changes
Fix attribute statement section in
<ConfigureSSO />with claim name for Custom SAML provider (#8586) by @LauraBeatrisUpdated dependencies [
95f6c2f]:v1.12.0Minor Changes
autoFocusappearance option to disable automatic input focusing (#8521) by @alexcarpenterPatch Changes
Improve Floating UI usage: fix
arialLabeltypo inMenuTrigger, replace imperative floating ref inMenuListwithuseMergeRefs, remove manual position offset inSelectOptionList, addaria-haspopuptoMenuTrigger, and add missing ARIA attributes (aria-expanded,aria-haspopup,role,aria-selected) toSelectcomponents. (#8328) by @alexcarpenterAdd support for custom SAML provider in
<ConfigureSSO />(#8564) by @LauraBeatrisUpdate
NavBarto receivecontainerSxprop (#8568) by @LauraBeatrisUpdated dependencies [
4fc38a0]:v1.11.0Compare Source
Minor Changes
Add
highlightedPlanprop to PricingTable default layout to render a "Popular" badge on the matching plan (#8554) by @alexcarpenterAdd support for inline
<bold>markup in localization values, rendered as<strong>elements. Translators can now write'Agree to <bold>Terms</bold>'in a single key instead of splitting into prefix/bold/suffix fragments. Token values are substituted only into parsed text leaves, so user-controlled data can never become markup. Also hardensapplyTokensToStringto useObject.prototype.hasOwnProperty.callwhen filtering token names, preventing prototype-chain names like{{hasOwnProperty}}from crashing rendering. (#8539) by @alexcarpenterPatch Changes
Add a two-mode segmented control to the SAML config submission sub-step in
<__experimental_ConfigureSSO />. Users pick between Add via metadata URL (default) and Configure manually. The metadata URL form is unchanged; the manual entry form ships in a follow-up commit. Locale keys added underconfigureSSO.configureStep.samlOkta.modesinen-US. (#8553) by @iagodahlemAdd confirmation step for
<__experimental_ConfigureSSO />(#8531) by @LauraBeatrisAdd test step for
<__experimental_ConfigureSSO />(#8544) by @LauraBeatrisUpdated dependencies [
9fa6642,930047f,b45777c,5a7225e]:v1.10.0Compare Source
Minor Changes
fontFamilyMonoappearance variable for customizing the monospace font used in Clerk components. Defaults toui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospaceand is exposed as the--clerk-font-family-monoCSS variable. (#8546) by @alexcarpenterPatch Changes
Implement the Okta SAML metadata URL submission path in the Configure step of
<__experimental_ConfigureSSO />. Adds a single text input for the IdP metadata URL; Continue posts{ saml: { idpMetadataUrl } }viauser.updateEnterpriseConnectionwrapped inuseReverification, withuseCardStatedriving the loading state andhandleErrorrouting backend errors inline to the field or to the card-level error surface. Locale keys added underconfigureSSO.configureStepinen-US. Manual entry, file upload, SP-side copy rows, and the Okta admin-console walkthrough ship in follow-up PRs. (#8535) by @iagodahlemImplement the provider selection step of
<__experimental_ConfigureSSO />. Renders the two SAML provider tiles (Okta Workforce and Custom SAML Provider) with real icons sourced fromimg.clerk.com, tracks the picked provider in local state, and gatesStep.Footer.Continueon a selection. Includes a warning callout about provider lock-in and a minorStep.Headeralignment tweak. All user-visible strings are wired through@clerk/localizations, with translations for every supported locale. (#8503) by @iagodahlemAlso extends the flow context with
providerandsetProvider, adds thederiveInitialStephelper, and wires the wizard'sinitialStepIdso the configure flow remounts on the right step after a reload. Continue on Select Provider stages the chosen provider and advances to the next step; the enterprise connection is created on Verify Domain once the user's email is verified and primary.Update
<ConfigureSSO />in the context of organizations to only allow managing enterprise connections based on system permission (#8515) by @LauraBeatrisfix(ui): don't treat numeric usernames as phone numbers (#8532) by @thiskevinwang
Fixed custom page icons not rendering in React 19 due to a forwarded ref overwriting the internal node reference. (#8534) by @wobsoriano
Add verify/add email address step to
<__experimental_ConfigureSSO />(#8520) by @LauraBeatrisRefactor
<__experimental_ConfigureSSO />into a layered primitive set: a state-driven Wizard, a UI-only Stepper, aStepcompound, and ProfileCard chrome. No public component API change. Drops the central FooterActionsContext registry — each step now renders its own footer viaStep.Footer.Previous/Step.Footer.Continuepurely-presentational compounds. Adds a SelectProviderStep boilerplate filtered out of the breadcrumb. (#8493) by @iagodahlemUpdated dependencies [
1a4d7d1,a6916b1,1084180,39099b6,18e0a1a]:v1.9.1Compare Source
Patch Changes
Fixed unhandled TypeError when
unsafeMetadatais passed to<SignUp />(#8500) by @wobsorianoUpdated dependencies [
5cda3ee]:v1.9.0Compare Source
Minor Changes
Patch Changes
Add wizard steps for the
<__experimental_ConfigureSSO />component (#8468) by @LauraBeatrisRemove back button on the sign-in password compromised/pwned error screen. (#8280) by @Ephem
These errors are not recoverable by re-entering the password, so the back button led to a confusing dead end that would always take you back to the same error.
Updated dependencies [
7a5892f]:v1.8.0Compare Source
Minor Changes
<ConfigureSSO />component. Not ready for usage yet. (#8427) by @LauraBeatrisPatch Changes
Localize API keys table headers (#8462) by @jebibot
Surface initialization errors and stalled mounts in the component renderer. The internal
ensureMountedpipeline now logs a[Clerk UI]error to the console when the lazy module import rejects, and emits a diagnostic warning if the renderer has not mounted within 10 seconds. Makes silent failures (e.g. failed dev-server chunk loads, unresolved lazy-compilation proxies) surface with an actionable message instead of hanging without feedback. (#8379) by @jacekradkoUpdated dependencies [
9e9230c,68d32df,1c27d4d,1001193]:v1.7.0Compare Source
Minor Changes
Render OAuthConsent organization selector from
user:org:readscope. (#8415) by @wobsorianoExpose
OAuthConsentas a public component export across React-based SDKs. (#8381) by @wobsorianoExample:
Patch Changes
785f057,90beaeb,244920d]:v1.6.9Compare Source
Patch Changes
1bfd8ab,5eec2fe]:v1.6.8Compare Source
Patch Changes
9b57986,00f9ff9,a9f9b29]:v1.6.7Patch Changes
da76490]:v1.6.6Patch Changes
Display web3wallet in UserProfile when added by administrator (#7981) by @dmoerner
Updated dependencies [
083c4c5,dcaf694,4b62ce8]:v1.6.5Patch Changes
redirect_urlforopenSignInmodal. (#8385) by @wobsorianov1.6.4Patch Changes
Default the organization selection in
<OAuthConsent />to the user's last active organization, falling back to the first membership when it is not set or no longer available. (#8362) by @kylemacUpdated dependencies [
d52b311]:v1.6.3Compare Source
Patch Changes
Fix EnableOrganizationsPrompt in keyless mode: show "Claim your application" CTA instead of broken "Sign in to continue" when organizations are enabled on an unclaimed keyless app with no signed-in user. (#8341) by @mwickett
Use
user.organizationMembershipsfrom the already-loaded user object to populate the org select in the OAuth consent screen, avoiding a redundant memberships fetch. (#8350) by @wobsorianoCorrectly display IP redirect URIs in OAuth consent. (#8342) by @wobsoriano
Add scroll-driven fade overlays to
ListGroupContentin the OAuthConsent component so overflowing scope lists visually indicate more content above and below. (#8339) by @alexcarpenterv1.6.2Compare Source
Patch Changes
Add infinite loading to organization selection in
<OAuthConsent />. (#8309) by @wobsorianoFix OAuthConsent always redirecting to sign-in by adopting the
AuthenticatedRoutespattern used by other full-page components (#8327) by @alexcarpenterUpdated dependencies [
c7b0f47,34762e8]:v1.6.1Patch Changes
b0b6675]:v1.6.0Minor Changes
Introduce internal
<OAuthConsent />component for rendering a zero-config OAuth consent screen on an OAuth authorize redirect page. (#8289) by @wobsorianoUsage example:
Patch Changes
dc2de16]:v1.5.1Compare Source
Patch Changes
3fd586d,f9ff9e9]:v1.5.0Compare Source
Minor Changes
Patch Changes
fdac10e,4e3cb0a,aa32bbc]:v1.4.0Compare Source
Minor Changes
<APIKeys />componentuseAPIKeys()hookPatch Changes
Adjust padding and display logo on
OrganizationListheader (#8229) by @LauraBeatrisUpdated dependencies [
2c06a5f]:honojs/middleware (@hono/zod-validator)
v0.9.0Compare Source
Minor Changes
7bc11dffa7dd5b639c614b12c34bd76722d76354Thanks @yusukebe! - UseInferInputfromhono/validatorinstead of a local copy to avoid duplication (requireshono >=4.11.2)v0.8.0Compare Source
Minor Changes
e90e4fb30877f3e3f4b0588bdb2bbfc337efbf67Thanks @T4ko0522! - fix(zod-validator): surface the default400failure response so it propagates to the RPC schema (refs honojs/hono#3746).MiddlewareHandler<E, P, V, TypedResponse<ZodValidatorFailureBody<T>, 400, 'json'>>, so the defaultc.json(result, 400)body reachesMergeMiddlewareResponse<M_k>on the Hono side and shows up inhc<typeof app>as a typed400branch.Response(Response & TypedResponse<...>) in bothZodValidatorFailureResponse<T>andExtractValidationResponse<VF>so azValidator(...)middleware remains assignable to a plainMiddlewareHandler(avoids aTS2322regression caused by bareTypedResponse).undefinedfor the hook parameter together with theoptions.validationFunction, allowingzValidator(target, schema, undefined, { validationFunction })to match the typed-failure path.peerDependencies.honoto>=4.10.0because this PR now relies on the 4-argumentMiddlewareHandler<E, P, I, R>signature introduced in Hono v4.10.0; onhono<4.10.0,MiddlewareHandleronly accepts 3 type arguments and consumers would hitTS2707even though peer ranges currently allow it.scalar/scalar (@scalar/nextjs-api-reference)
v0.11.11Patch Changes
v0.11.10Patch Changes
readmetoscalarReadme: npm treats areadmefield as the readme text itself, so affected packages were published with a literal[object Object]readme on the registry instead of README.md.v0.11.9v0.11.8v0.11.7v0.11.6v0.11.5v0.11.4v0.11.3v0.11.2v0.11.1Patch Changes
v0.11.0Minor Changes
#9422: Add a
nonceoption for Content Security Policy support.When you pass a
nonce, the rendered HTML stamps it onto the inline<script>and the CDN<script>tag (and Scalar's own<style>tags, plus a matching<meta property="csp-nonce">). This lets the API Reference run under a strictscript-srcwith nounsafe-inlineand nounsafe-eval.Note:
style-srcstill needs'unsafe-inline'. The reference renders inlinestyle="…"attributes, which a CSP nonce can never authorize (nonces only apply to<script>,<style>and<link>elements), so a nonce-onlystyle-srcis not possible. The win is a fully strictscript-src.v0.10.20v0.10.19v0.10.18v0.10.17v0.10.16v0.10.14v0.10.13v0.10.12v0.10.11v0.10.10v0.10.9Patch Changes
v0.10.8v0.10.7v0.10.6v0.10.5v0.10.4Patch Changes
v0.10.3Patch Changes
Updated Dependencies
v0.10.2v0.10.1v0.10.0Minor Changes
Patch Changes
Updated Dependencies
tailwindlabs/tailwindcss (@tailwindcss/postcss)
v4.3.3Compare Source
Fixed
--watch --poll[=ms]in@tailwindcss/cliwhen filesystem events are unreliable or unavailable (#20297)bg-[#fff]andbg-[#FFF]→bg-white) (#20298)iframe:focus-visibleoutline styles (#20292)theme('colors.foo')in JS plugins resolves correctly when both--color-fooand--color-foo-barexist (#20299)shadow-sm/12.5,text-shadow-sm/12.5,drop-shadow-sm/12.5, andinset-shadow-sm/12.5(#20302)[data-foo]divas two selectors instead of one (#20303)@tailwindcss/postcssrebuilds when a preprocessor like Sass changes the input CSS without changing the input file on disk (#20310)@tailwindcss/browserand Tailwind Play (#20124)oklch(#20314)--spacing(0)is optimized to0pxinstead of0so it remains a<length>when used incalc(…)(#20319)@parcel/watcheronly when needed in@tailwindcss/cli --watchmode, so one-off builds and--watch --pollwork when@parcel/watchercan't be loaded (#20325)system-uiandui-sans-serifso CJK text respects the page'slangattribute on Windows (#20318)@tailwindcss/upgradefrom rewriting ignored files when run from a subdirectory (#20329)@sourcerules pointing to nested files are scanned when later@sourcerules point to files in parent folders (#20335)@tailwindcss/vitefrom triggering full page reloads when scanned files are processed by Vite but haven't been loaded as modules yet (#20336)v4.3.2Compare Source
Fixed
auto-rows-*andauto-cols-*utilities (e.g.auto-rows-12andauto-cols-16) (#20229)@tailwindcss/cliin--watchmode from crashing on Windows when@sourcepoints to a directory that doesn't exist (#20242)@tailwindcss/vitefrom crashing in Deno v2.8.x whencontext.parentURLis not a valid URL (#20245)@tailwindcss/cliin--watchmode rebuilds when the input CSS file changes in an ignored directory (#20246)@variantrules used inaddBase(…)to use custom variants defined later (#20247)@tailwindcss/vitefrom crashing during HMR when scanned files or directories are deleted (#20259)font-sizeinstead ofcolordeclarations fortext-[--spacing(…)](#20260)@sourcepatterns from scanning unrelated sibling files and folders (#20263)%]…[%in.tt,.tt2, and.txfiles (#20269)p.text-black[condition](#20269)@position-tryrules from triggering unknown at-rule warnings when optimizing CSS (#20277)--opacitytheme values (#20287)@tailwindcss/postcsswhen used with newer PostCSS patch releases (#20289)v4.3.1Compare Source
Added
--silentoption to suppress output in@tailwindcss/cli(#20100)Fixed
Module#registerHooksinstead ofModule#registeron Node 26+ (#20028)@applyto be used with CSS mixins (#19427)not-*correctly negates@containerqueries, includingstyle(…)queries (#20059)drop-shadow-*color utilities work with custom shadow values containingcalc(…)(#20080)@tailwindcss/vite(#20103)@tailwindcss/webpackcan be installed in Rspack projects without requiringwebpackas a peer dependency (#20027)calc(…)expressions (e.g.px-[calc(1rem+0px)]→px-[calc(1rem+0)]) (#20127)left-[99999px]→left-[99999px], notleft-24999.75) (#20130)@tailwindcss/cliin--watchmode recovers when a tracked dependency is deleted and restored (#20137)@tailwindcss/clibinaries are ignored when scanning for class candidates (#20139)addClass(…)andremoveClass(…)calls (#20198)@variantto be used insideaddBase(#19480)@sourceglobs with symlinks are preserved (#20203)@sourcerules can re-include files excluded by earlier@source notrules (#20203)@utilityrules (#20205)inset-shadow-noneand other inset shadows work correctly (#20208)@sourcedirectories are scanned even when ignored by git (#20214)@sourceglobs ending in**/*preserve dynamic path segments to avoid scanning too many files (#20217)calc(…)divisions when the result would require high precision (e.g.w-[calc(100%/3.5)]→w-[calc(100%/3.5)], notw-[28.571428571428573%]) (#20221)@tailwindcss/postcss(#20228)Changed
0instead ofcalc(var(--spacing) * 0)for spacing utilities likem-0andleft-0(#20196)var(--spacing)instead ofcalc(var(--spacing) * 1)for spacing utilities likem-1andleft-1(#20196)v4.3.0Compare Source
Added
@container-sizeutility (#18901)scrollbar-{auto,thin,none}utilities forscrollbar-width, andscrollbar-thumb-*/scrollbar-track-*color utilities forscrollbar-color(#19981, #20019)scrollbar-gutter-*utilities (#20018)zoom-*utilities (#20020)tab-*utilities (#20022)@variantwith stacked variants (e.g.@variant hover:focus { … }) (#19996)@variantwith compound variants (e.g.@variant hover, focus { … }) (#19996)--default(…)in--value(…)and--modifier(…)for functional@utilitydefinitions (#19989)Fixed
@pluginresolves package JavaScript entries instead of browser CSS entries when using@tailwindcss/vite(#19949)@importand@pluginpaths resolving from the wrong directory when using@tailwindcss/vite(#19965)@variantare processed by@tailwindcss/vite(#19966)basewhenresult.opts.fromis not provided when using@tailwindcss/postcss(#19980)_whitespace in arbitrary values (#19986)w-[calc(100%---spacing(60))]→w-[calc(100%-(--spacing(60)))]) (#19986)-mt-[20in]→mt-[-20in], notmt-[-1920px]) (#19988):has()variants from[&:has(…)]tohas-[…](#19991)styleattributes (e.g.style="flex-grow: 1"→style="flex-grow: 1", notstyle="grow: 1") (#19918)@utilitydefinitions with the same name but different value types (#19777)PluginWithConfigtype fromtailwindcss/pluginto fix errors when inferring plugin config types (#19707)startandendlegacy utilities without values do not generate CSS (#20003)--value(…)is required in functional@utilitydefinitions (#20005)-left-[(var(--a)+var(--b))]) (#20011)v4.2.4Compare Source
Fixed
@importand@pluginstill resolve correctly when using Vite aliases in@tailwindcss/vite(#19947)v4.2.3Compare Source
Fixed
tracking-*utilities by preferring non-negative utilities (e.g.-tracking-tighter→tracking-wider) (#19827)@tailwindcss/webpack(#19723)px-[1.2rem] py-[1.2rem]→p-[1.2rem]) (#19837)border-{t,b}-*intoborder-y-*,border-{l,r}-*intoborder-x-*, andborder-{t,r,b,l}-*intoborder-*(#19842)scroll-m{t,b}-*intoscroll-my-*,scroll-m{l,r}-*intoscroll-mx-*, andscroll-m{t,r,b,l}-*intoscroll-m-*(#19842)scroll-p{t,b}-*intoscroll-py-*,scroll-p{l,r}-*intoscroll-px-*, andscroll-p{t,r,b,l}-*intoscroll-p-*(#19842)overflow-{x,y}-*intooverflow-*(#19842)overscroll-{x,y}-*intooverscroll-*(#19842)--placeholder-colorinstead of--background-colorforplaceholder-*utilities (#19843)config.contentwhen migrating from Tailwind CSS v3 to Tailwind CSS v4 (#19846).envand.env.*to default ignored content files (#19846)overflow-ellipsisintotext-ellipsis(#19849)start-full→inset-s-full,start-auto→inset-s-auto,start-px→inset-s-px, andstart-<number>→inset-s-<number>as well as negative versions (#19849)end-full→inset-e-full,end-auto→inset-e-auto,end-px→inset-e-px, andend-<number>→inset-e-<number>as well as negative versions (#19849)-sign inside the arbitrary value-left-[9rem]→left-[-9rem](#19858)-sign outside the arbitrary valueml-[calc(-1*var(--width))]→-ml-(--width)(#19858)NODE_PATHenvironment variable in standalone CLI (#19617)v4.2.2Compare Source
Fixed
row-constructor(#19725)calc(var(--spacing)*…)expressions into--spacing(…)(#19769)@propertyat-rules (e.g.shadow-sm border) (#19727)@tailwindcss/vite(#19745)@tailwindcss/vite(#19790)w-1234 h-1234→size-1234) (#19809)w-5 h-5 size-5→''instead ofsize-5) (#19812)@import '@​/path/to/file';when using@tailwindcss/vite(#19803)v4.2.1Compare Source
Fixed
.characters within curly braces in MDX files (#19711)v4.2.0Compare Source
Added
@tailwindcss/webpackpackage to run Tailwind CSS as a webpack plugin (#19610)pbs-*andpbe-*utilities forpadding-block-startandpadding-block-end(#19601)mbs-*andmbe-*utilities formargin-block-startandmargin-block-end(#19601)scroll-pbs-*andscroll-pbe-*utilities forscroll-padding-block-startandscroll-padding-block-end(#19601)scroll-mbs-*andscroll-mbe-*utilities forscroll-margin-block-startandscroll-margin-block-end(#19601)border-bs-*andborder-be-*utilities forborder-block-startandborder-block-end(#19601)inline-*,min-inline-*,max-inline-*utilities forinline-size,min-inline-size, andmax-inline-size(#19612)block-*,min-block-*,max-block-*utilities forblock-size,min-block-size, andmax-block-size(#19612)inset-s-*,inset-e-*,inset-bs-*,inset-be-*utilities forinset-inline-start,inset-inline-end,inset-block-start, andinset-block-end(#19613)font-features-*utility forfont-feature-settings(#19623)Fixed
@supportswrapper forcolor-mixvalues (#19450)@source inline()argument (#19461)@tailwindcss/cli(#19447)@utilityname validation with Oxide scanner rules (#19524)@variantinside@custom-variant(#19633).25inaspect-*fractions (e.g.aspect-8.5/11) (#19688)@sourcetrigger a full page reload when using@tailwindcss/vite(#19670)@tailwindcss/vite(#19677)@utilitynames to improve support with formatters such as Biome (#19626).jjto default ignored content directories (#19687)Deprecated
start-*andend-*utilities in favor ofinset-s-*andinset-e-*utilities (#19613)postcss/autoprefixer (autoprefixer)
v10.5.4Compare Source
v10.5.3Compare Source
v10.5.2Compare Source
-webkit-fill-availablebefore-moz-available, so Firefoxwill use
-webkit-version which is closer tostretch.v10.5.1Compare Source
grid-areaspan reset for overriding areas (by @puneetdixit200).v10.5.0Compare Source
mask-position-xandmask-position-ysupport (by @toporek).v10.4.27Compare Source
package.json.v10.4.26Compare Source
v10.4.25Compare Source
olragon/binpackingjs (binpackingjs)
v3.1.0Compare Source
Bug Fixes
pruneFreeListbug:i++moved to outer loop so free rectangles are not skipped during pruning (#42, credit to @traaan PR #27)scoreRotationheuristic: use tiling efficiency instead of squared dimension ratios (#37)Other
open-cli-tools/concurrently (concurrently)
v9.2.4Compare Source
Full Changelog: https://github.com/open-cli-tools/concurrently/compare/v9.2.3...v9.2.4
v9.2.3Compare Source
shell-quote- #591, #596get-convex/convex-backend (convex)
v1.42.3an order consistent with other platforms when running
on Windows. This completes a fix that was only partially
applied in 1.42.2.
v1.42.2token used in the request by accessing
authTokeninctx.meta.getRequestMetadata().convex/browserthat caused issueswhen using the
ConvexHttpClientin some JavaScriptenvironments.
ConvexProviderWithClerkthat causedthe Convex client to ignore session changes in some situations.
an order consistent with other platforms when running
on Windows.
npx convex devoutside a Convex project,the CLI now returns an error message immediately instead of
first asking the user to select a project and then failing
later.
v1.42.1tsgobinary innewer versions of
@typescript/native-preview.initialAuthTokenReuseoption toConvexReactClientthatprevents extra function calls when users re-authenticate.
v1.42.0npx convex project createcommand that can be usedto create new projects programmatically.
--names-onlyflag tonpx convex env list(and
npx convex env default list). This flag shows the names ofthe env vars that are set, without the values. It can be useful
to let AI coding agents know the variables that are set on a deployment,
without giving them the actual values.
useStaleSnapshotoption to the arguments forrunQuery.This is an advanced feature that can be used to allow mutations
to avoid optimistic concurrency control (OCC) conflicts in some cases
where they can commit even though they depend on conflicting reads.
This change allows us to improve the performance of some of the
official Convex components, including Workpool.
db.*methods to more clearly explainthe difference between the old APIs without table names
(e.g.
db.get(userId)) and the new APIs with table names(e.g.
db.get("users", userId)).correctly when the user or token doesn’t have permission to do something.
scheduledFunctionIdinctx.meta.getRequestMetadata().npx convex insightshas a new--jsonflag that makes the commandoutput easier to parse programmatically.
convex/serveras@deprecated(
FileMetadata,FileStorageId,StorageId). These types are usedonly by file storage APIs that were deprecated in
convex@1.6.0,so we also marked them as
@deprecatedfor clarity.wspeer dependency to avoid a vulnerable range.v1.41.0with the new
transactionLimitsoption inrunQuery/runMutation.npx convex ai-filesnow installs skills with separate copies ofeach skill for each coding agent instead of using symlinks.
We made this change to avoid known issues with symlinks on Windows.
npx convex devnow starts a different dashboard server for eachdeployment. This ensures the dashboard always connects to the
right deployment when multiple deployments are running at the same time.
v1.40.0npx convex deployment create team-slug:project-slug:local.using
npx convex deployment select team-slug:project-slug:local. This command warnswhen it moves the deployment to another project.
such as
npx convex devandnpx convex deploy.<AuthRefreshing />helper component, used to show indicators whenfunction calls are paused because the authentication token is refreshing.
--localand--cloudflags fromnpx convex dev. The behavior of these flagswas misleading when a deployment was already selected. Instead, use
npx convex deployment select localto use a local deployment, andnpx convex deployment select devto use your personal cloud dev deployment.npx convex logs:--tailis now accepted as an alias for the--historyflag.from the Convex cloud project if you don’t have permission to view the default environment
variables instead of crashing.
discordjs/discord.js (discord.js)
v14.27.0Compare Source
Bug Fixes
clientReadyevent name references (#10632) (9592aea)guildScheduledEvent(#11540) (0aabb6c)Documentation
stringproperty (d646a13)Features
maximumStageBitrate(#11313) (6d2cd99)fetchMemberCounts(#11352) (3b738ee)Refactor
Typings
sharedClientTheme(b816b79)rawDataarg type (#11123) (c4531d4)v14.26.5Compare Source
Bug Fixes
v14.26.4Compare Source
Bug Fixes
v14.26.3Compare Source
Bug Fixes
permissions(dced197)v14.26.2Compare Source
Bug Fixes
v14.26.1Compare Source
Bug Fixes
v14.26.0Compare Source
Bug Fixes
Features
Refactor
this.constructor.name(#11294) (e32f0c1)Typings
krisk/Fuse (fuse.js)
v7.5.0Compare Source
⚠️ Behavior changes
Every change in this release is a bug fix, but each one corrects a scoring or ranking bug. Scores and result ordering will shift for some queries. That is why this ships as a minor rather than a patch: the public API is unchanged and upgrading is a drop-in, but the results you get back can differ, and that should not arrive silently in a patch bump.
If you assert on exact
scorevalues or on a specific result order, expect those assertions to need updating. Re-baseline them against 7.5.0 rather than pinning to 7.4.x, since the 7.4.x behavior was wrong in the cases below.\t,\n, or\rnow score differently (#830).1were applied unnormalised, skewing the relative influence of each key. If yourkeysweights do not already sum to1, your relative ranking changes (#833).limitnow returns the correct top-N when scores tie. A tie at the cutoff boundary could evict a result that should have been kept, solimitcould return the wrong items, not merely the right items in a different order (#835).minMatchCharLengthin the exact-match shortcut. Matches shorter thanminMatchCharLengthwere still reported via the exact-match fast path, so thematchesarray could contain entries it was configured to exclude (#831).Bug Fixes
7.4.2 (2026-06-05)
Bug Fixes
7.4.1 (2026-06-02)
Bug Fixes
v7.4.2Compare Source
v7.4.1Compare Source
v7.4.0Compare Source
v7.3.0Compare Source
Features
Bug Fixes
v7.2.0Compare Source
Features
Fuse.use()for runtime plugin registration (8546a9b)Performance
removeAllfor O(n) bulk removes instead of O(n*k) (8546a9b)limitis set (8546a9b)Bug Fixes
jimp-dev/jimp (jimp)
v1.6.1Compare Source
🎉 This release contains work from new contributors! 🎉
Thanks for all your work!
❤️ Denys Kashkovskyi (@Kashkovsky)
❤️ Viki (@vikiboss)
🐛 Bug Fix
@jimp/core,@jimp/plugin-quantize,@jimp/wasm-avif,@jimp/wasm-jpeg,@jimp/wasm-png,@jimp/wasm-webp⚠️ Pushed to
main@jimp/core📝 Documentation
Authors: 3
lucide-icons/lucide (lucide-react)
v0.577.0: Version 0.577.0Compare Source
What's Changed
ellipseicon by @KISHORE-KUMAR-S in #3749New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.576.0...0.577.0
v0.576.0: Version 0.576.0Compare Source
What's Changed
package-*icons. by @karsa-mistmere in #4074receipticon by @karsa-mistmere in #4075cuboidicon tags and categories by @karsa-mistmere in #4095cuboidicon by @jamiemlaw in #4098fishing-rodicon by @7ender in #3839Full Changelog: https://github.com/lucide-icons/lucide/compare/0.575.0...0.576.0
v0.575.0: Version 0.575.0Compare Source
What's Changed
message-square-checkicon by @karsa-mistmere in #4076metronomeicon by @edwloef in #4063file-pen-lineicon by @jguddas in #3970square-arrow-right-exitandsquare-arrow-right-entericons by @EthanHazel in #3958flip-*tosquare-centerline-dashed-*by @jguddas in #3945New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.573.0...0.575.0
v0.574.0: Version 0.574.0Compare Source
What's Changed
rocking-chairicon by @jamiemlaw in #3445coinsicon by @jguddas in #3158x-line-topicon by @jguddas in #2838mouse-lefticon by @marvfash in #2788mouse-righticon by @marvfash in #2787New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.572.0...0.574.0
v0.573.0: Version 0.573.0Compare Source
What's Changed
rocking-chairicon by @jamiemlaw in #3445coinsicon by @jguddas in #3158x-line-topicon by @jguddas in #2838mouse-lefticon by @marvfash in #2788mouse-righticon by @marvfash in #2787New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.572.0...0.573.0
v0.572.0: Version 0.572.0Compare Source
What's Changed
message-circle-checkicon by @Shrinks99 in #3770New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.571.0...0.572.0
v0.571.0: Version 0.571.0Compare Source
What's Changed
circle-icons path and circle order by @adamlindqvist in #3746shelving-uniticon by @karsa-mistmere in #3041New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.570.0...0.571.0
v0.570.0: Version 0.570.0Compare Source
What's Changed
towel-rackicon by @jguddas in #3350Full Changelog: https://github.com/lucide-icons/lucide/compare/0.569.0...0.570.0
v0.569.0: Version 0.569.0Compare Source
What's Changed
clipboard-penicon by @Spleefies in #4006mirror-roundandmirror-rectangularby @Muhammad-Aqib-Bashir in #3832Full Changelog: https://github.com/lucide-icons/lucide/compare/0.568.0...0.569.0
v0.568.0: Version 0.568.0Compare Source
What's Changed
clapperboardso slash is no longer protruding by @torfmuer in #3764git-merge-conflicticon by @timmy471 in #3008New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.567.0...0.568.0
v0.567.0: Version 0.567.0Compare Source
What's Changed
infoby @jamiemlaw in #4047gifticon by @jguddas in #3977line-dot-right-horizontalicon by @nathan-de-pachtere in #3742Full Changelog: https://github.com/lucide-icons/lucide/compare/0.566.0...0.567.0
v0.566.0: Version 0.566.0Compare Source
What's Changed
forklifticon by @jguddas in #4069rocketicon by @jguddas in #4067globe-officon by @TimNekk in #4051New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.565.0...0.566.0
v0.565.0: Version 0.565.0Compare Source
What's Changed
lens-concaveandlens-convexby @Muhammad-Aqib-Bashir in #3831Full Changelog: https://github.com/lucide-icons/lucide/compare/0.564.0...0.565.0
v0.564.0: Version 0.564.0Compare Source
What's Changed
database-searchicon by @Spleefies in #4003user-lockicon by @jguddas in #3971bug-officon by @jguddas in #3972bell-doticon by @jguddas in #3973bandageicon by @jguddas in #3967hard-driveicon by @jguddas in #3622git-branchicon by @jguddas in #3938file-cogicon by @jguddas in #3965cloud-alertandcloud-checkicon by @jguddas in #3976user-keyanduser-round-key, updates other-keyicons to match by @karsa-mistmere in #4044New Contributors
Full Changelog: https://github.com/lucide-icons/lucide/compare/0.563.1...0.564.0
motiondivision/motion (motion)
v12.42.2Compare Source
Fixed
animateView: Cropped group layers now animateborder-radiusfrom the old to new radius.v12.42.1Compare Source
Fixed
animateView: Old layer fade out now cancelled when defining.new().v12.42.0Compare Source
Changed
animateView: Layers are automatically grouped to match their DOM-hierarchy. New.group(false)method opts-out.Fixed
animateView: Auto-crop is now aspect-ratio aware, disabling crops for matching aspect-ratios.animateView: Disabled automaticborder-radiusanimation.v12.41.0Compare Source
Added
animateView: Moves from Motion+ Early Access and alpha to main library.animateView:.add()resolves a CSS selector orElementto automatically generate, apply and removeview-transition-name.animateView:.new()and.old()configures values to animate on new and old layers.animateView:.layout()can set a custom transition on the size/position animation of the currently selected elements.animateView: Group layers now automatically crop with children set tocover, withborder-radiusanimating from old radius to new..crop(false)disables this behaviour.animateView:.class(name)tags currently selected elements with aview-transition-classas a custom CSS hook.Fixed
AnimatePresence: Prevent stuck exit animations when children interrupt.drag: Childe.stopPropagation()no longer break drag end.motionpackage.animateLayout: Improve handling of parallel/interleaved calls.Changed
animateView:.enter()and.exit()now refer specifically tonewandoldlayers where there are no matchingoldornewlayers.animateView: Interrupted transition setups now return resolved animation rather than throwing.v12.40.0Compare Source
Added
pathoption totransition.arc()for motion along an arc.v12.39.0Compare Source
Added
repeatTypeandrepeatDelayin animation sequences.Fixed
dragSnapToOriginno longer leaves the drag transform stranded after a layout swap.LazyMotion: Share React contexts between theframer-motionandframer-motion/m(and thereforemotion/reactandmotion/react-m) CJS bundles so that<m.div>from the/msubpath picks up features loaded by<LazyMotion>from the main entry point.useScroll: Support hydratingtargetandcontainerrefs from anywhere in the tree.<AnimatePresence initial={false} />.dragConstraints, when set as viewport-relative ref, no longer break on scroll.§visualElementhydration order.useAnimate: Now respectsskipAnimations.AnimatePresence: Fix object-forminitialvalues not applied on re-entry after exit completes.scroll: Fixed callback progress when tracking an element.useScroll: Fix hardware acceleration when tracking an element.mapbox/pixelmatch (pixelmatch)
v7.2.0Compare Source
Add a
checkerboardoption that controls whether to blend semi-transparent pixels against a checkerboard pattern (true, default) or plain white (false, pre-v7 behavior) when comparing images.v7.1.1Compare Source
includeAAis true. #160 (by @mongoose700)PostHog/posthog-js (posthog-js)
v1.407.0Compare Source
1.407.0
Minor Changes
#4222
0f2407bThanks @turnipdabeets! - feat: add a default-value option toisFeatureEnabledisFeatureEnabled(key, { defaultValue: false })now returns the given default when the flag has no value — flags not loaded yet, or no flag with that key — and the return type narrows toboolean. The option name is the same in posthog-js, posthog-js-lite, and posthog-react-native. WithoutdefaultValue, behavior is unchanged:boolean | undefined. (2026-07-22)Patch Changes
#4203
90e7483Thanks @posthog! - fix(conversations): let users start a new conversation while a ticket is still openThe support widget now surfaces the ticket list navigation (and its "New conversation"
button) whenever the user has any ticket, instead of only when they have multiple tickets
or a single resolved one. Previously a user sitting on one open, unresolved ticket was
locked into that conversation with no way to raise a second issue. (2026-07-22)
#4221
da6e082Thanks @posthog! - fix(exception-autocapture): don't throw when the page's onerror handler is non-callableThe wrapped
window.onerror,window.onunhandledrejection, andconsole.errorhandlerschained to the page's original handler using optional chaining, which only guards against
null/undefined. When a page had one of these set to a truthy non-callable value (e.g.via
Object.defineProperty, or clobbered by another script/extension), our wrapper threw aTypeErrorfrom inside its own handler. We now check the original handler is actuallycallable before invoking it and fall back to
falseotherwise. (2026-07-22)#4209
569fc62Thanks @posthog! - Session recording no longer emits an uncaughtTypeError: Illegal invocationfrom the input observer's synchronous native-setter call. The previous fix only guarded the deferred hooked setter; the synchronousoriginal.set.call(this, value)still ran with a non-nativethis(a proxy, custom element, or cross-realm object) and threw inside the host page's own assignment. The recorder now probes the native getter — which fails the same internal-slot brand check as the setter — before forwarding: a non-nativethisis skipped, so the recorder no longer re-throws from its own frame, while genuine elements (including file inputs that legitimately throw on a programmatic value) keep their native behavior. The input event handler andgetInputTypeare similarly guarded against reading native accessors on a non-nativethis.(2026-07-22)
#4068
d5e1188Thanks @posthog! - Fix event-triggered surveys re-displaying in a fresh session without their trigger firing. A non-repeatable event/action-triggered survey that was shown but never dismissed or answered had its activation persisted indefinitely, so it kept being treated as "triggered" on later page loads. The persisted activation is now scoped to the triggering session: it still survives a reload within that session, but a brand-new session drops it until the trigger fires again. Repeatable surveys are unaffected.(2026-07-22)
#4205
de3ad61Thanks @posthog! - Warn when session recording masking options inposthog.initshadow the project-level "Privacy and masking" setting. Client-side masking still intentionally takes precedence, but previously the override was silent — a developer could set masking in the dashboard and see it quietly ignored because their SDK config diverged. The recorder now logs a console warning (in debug mode) naming the diverging fields so the precedence is self-explaining.(2026-07-22)
Updated dependencies [
0f2407b]:v1.406.2Compare Source
1.406.2
Patch Changes
#4206
a3112d9Thanks @posthog! - fix(surveys): stop recurring surveys re-showing off a stale internal targeting flagRecurring surveys could re-display and record a duplicate response when the eligibility
check ran against a cached internal targeting flag before fresh flags had loaded. The
display loop now waits for feature flags to actually load before trusting the internal
targeting flag, and forces a flag reload after a survey is completed so the flag recomputes
promptly. (2026-07-21)
v1.406.1Compare Source
1.406.1
Patch Changes
220fa2cThanks @sarmah-rup! - Don't let save_referrer overwrite a $referrer / $referring_domain that was explicitly set via posthog.register(), so registered attribution values survive pageviews in SPA and iframe contexts(2026-07-21)
v1.406.0Compare Source
1.406.0
Minor Changes
d39b903Thanks @dustinbyrne! - Move shared browser utility implementations into@posthog/browser-commonand consume them directly fromposthog-js.(2026-07-21)
Patch Changes
ba977d0Thanks @turnipdabeets! - Keep autocapture off when a remote config response omitsautocapture_opt_out. The SDK now retains the last known server value for the missing-field case, the same as when the config fetch fails, instead of enabling autocapture. Values persisted by earlier SDK versions are still trusted; a browser holding a stale value corrects itself on the first config response that includes the field.(2026-07-21)
d39b903]:v1.405.3Compare Source
1.405.3
Patch Changes
91505baThanks @pauldambra! - fix: apply the active full snapshot interval as soon as a recording trigger matches(2026-07-21)
v1.405.2Compare Source
1.405.2
Patch Changes
fbfc84fThanks @pauldambra! - feat: make the pending session recording trigger buffer interval configurable(2026-07-20)
fbfc84f]:v1.405.1Compare Source
1.405.1
Patch Changes
dec8fe7Thanks @turnipdabeets! - Internal restructuring of remote config failure handling across SDK extensions; no behavior change.(2026-07-20)
v1.405.0Compare Source
1.405.0
Minor Changes
#4172
9621830Thanks @haacked! - send minimal$feature_flag_calledevents when the server enables itWhen the v2
/flagsresponse carriesminimalFlagCalledEvents: true(or, for posthog-node local evaluation, the flag-definitions payload carriesminimal_flag_called_events: true) and the evaluated flag is not linked to an experiment ($feature_flag_has_experiment === false),$feature_flag_calledevents are rebuilt from a strict allowlist of flag-evaluation, processing-control, and SDK-identity properties. Super properties,$set/$set_once, the$feature/<key>enumeration,$active_feature_flags, and the context envelope are stripped. Any missing signal (no gate on the response, bootstrapped or locally injected flags,has_experimentunknown) falls back to the full event, and experiment-linked flags always send the full envelope. The gate is stored alongside the cached flags (posthog-js persistence, posthog-node poller state) and is server-controlled, with no SDK-side configuration.before_sendruns after the filter and may re-add stripped properties. (2026-07-20)Patch Changes
9621830]:v1.404.1Compare Source
1.404.1
Patch Changes
66c1666Thanks @turnipdabeets! - Honour the project-level autocapture opt-out when the remote config request fails. Previously a failed config fetch (network error, timeout, blocked request) enabled autocapture on opted-out projects and persisted that state for later page loads. Autocapture now keeps the last successfully received server value, and stays off until the first successful config response.(2026-07-17)
v1.404.0Compare Source
1.404.0
Minor Changes
607bf54Thanks @pauldambra! - Add dead swipe detection to dead clicks autocapture. When dead clicks autocapture is enabled, touch swipe gestures that produce no observable screen change (no scroll, mutation, selection or visibility change) are now captured as$dead_swipeevents, surfacing failed navigations on touch devices. Configurable viacapture_dead_swipes(defaulttrue) andswipe_threshold_px(default30) on thecapture_dead_clicksconfig. Swipes over surfaces whose response cannot be observed (canvas, video and other media elements under the finger) are skipped, and captures are limited per page load viamax_dead_swipes_per_page_load(default10).(2026-07-16)
Patch Changes
df17ddcThanks @posthog! - Catch synchronous throws from a monkey-patchedwindow.fetchso they no longer escape as unhandled exceptions. A synchronous throw is now routed through the same handling as an async rejection, so the request queue retries instead of the error leaking into error tracking.(2026-07-16)
607bf54]:v1.403.0Compare Source
1.403.0
Minor Changes
#4159
fad6d9aThanks @haacked! - add$feature_flag_has_experimentto$feature_flag_calledevents$feature_flag_calledevents now carry a$feature_flag_has_experimentboolean sourced from the server'shas_experimentflag metadata (the/flags?v=2response for remote evaluation, the/api/feature_flag/local_evaluationdefinitions for posthog-node local evaluation). The property is only sent when the server explicitly reportshas_experiment; it is omitted entirely when the value is unknown (older servers, missing metadata, bootstrapped or locally injected flags). (2026-07-16)Patch Changes
fad6d9a]:v1.402.3Compare Source
1.402.3
Patch Changes
#4157
4a2ecf5Thanks @posthog! - Session recording no longer emits an uncaughtNotAllowedError("Sharing constructed stylesheets in multiple documents is not allowed") when a page assigns aCSSStyleSheetconstructed in a different document toadoptedStyleSheets. That assignment is the host page's own invalid operation, but the recorder's patched setter sat on the call stack, so the exception was attributed to rrweb and churned fingerprints in error tracking. The recorder now contains this specific rejection (matched by its standardizedNotAllowedErrorname, so it works even when the setter throws from an iframe realm) and skips recording those sheets, while still re-throwing any other native-setter error so host-page behaviour is preserved.(2026-07-15)
#4158
0dc389eThanks @posthog! - fix(replay): session recording no longer throwsTypeError: Converting circular structure to JSONwhen replay event data contains a circular reference. The circular-reference guard now also detects cycles that pass through an array, and affected events are captured with[Circular]markers instead of surfacing an unhandled error and being dropped.(2026-07-15)
Updated dependencies [
fc2cb2e]:v1.402.2Compare Source
1.402.2
Patch Changes
81adbfdThanks @posthog! - Session recording no longer emits an uncaughtTypeError: Illegal invocationwhen a programmatic input-value change happens on an object that is not a genuine native input element (for example a proxy on the element prototype chain). The recorder drops that one replay update instead of throwing.(2026-07-15)
v1.402.1Compare Source
1.402.1
Patch Changes
#4117
1eddff7Thanks @DanielVisca! - add the posthog.metrics API (count, gauge, histogram) to posthog-node — alphaBackend services can now record metrics through the same statsd-style pre-aggregating client the browser SDK ships, with no OpenTelemetry setup:
Samples aggregate in memory and flush as OTLP/JSON to
/i/v1/metrics(one data point per series per window). Pending metrics are flushed onshutdown(). Core gains_sendMetricsBatchonPostHogCoreStateless(same outcome contract as_sendLogsBatch) and a sharedresolveMetricsConfig, so any core-based SDK can hostPostHogMetrics. (2026-07-15)Updated dependencies [
1eddff7]:v1.402.0Compare Source
1.402.0
Minor Changes
0e8ad14Thanks @robbie-c! - Stamp the current hostname as$snapshot_hoston every$snapshotevent the session recorder sends. The value is derived from the page URL after it passes through the existing replay URL masking pipeline (maskCapturedNetworkRequestFn/ deprecatedmaskNetworkRequestFn, hash stripping, personal-data query-param masking), so it cannot bypass a customer's masking config. When masking removes the URL or the masked result doesn't parse as a URL, the property is omitted entirely. This gives ingestion consumers a per-message host signal even for mid-session snapshot batches that contain no URL-bearing events.(2026-07-15)
v1.401.0Compare Source
1.401.0
Minor Changes
800af7cThanks @pauldambra! - feat: addsession_recording.attributeFilteroption that passes an attribute allowlist through to the native MutationObserver, so mutations to unlisted attributes (e.g. animation-driven inlinestylechurn) never cost recording CPU (port of upstream rrweb #1873)(2026-07-15)
Patch Changes
800af7c]:v1.400.1Compare Source
1.400.1
Patch Changes
6dd8827Thanks @lucasheriques! - chore: survey seen-key and repeat-activation helpers now live in @posthog/core, shared by the web and React Native SDKs. Core's survey enums are now const-object literal unions (matching the web SDK's existing pattern), so the same values type-check across both SDKs. No behavior change. Type-level note: enum members no longer work as standalone type annotations (e.g.SurveyType.Popoveras a type); use the exported union types instead. Runtime values are unchanged.(2026-07-14)
6dd8827]:v1.400.0Compare Source
1.400.0
Minor Changes
dc2aa5bThanks @posthog! - Normalize the error tracking rate-limiter config to first-class options. The browser SDK now readsexceptionRateLimiterRefillRate/exceptionRateLimiterBucketSizeonerror_tracking, with the previous double-underscore__exceptionRateLimiterRefillRate/__exceptionRateLimiterBucketSizeoptions deprecated but still honoured as a fallback. The option shape (ExceptionRateLimiterConfig) and default-resolution logic (resolveExceptionRateLimiterConfig) now live in@posthog/coreand are shared between the browser and Node SDKs.(2026-07-14)
Patch Changes
1eabd30Thanks @turnipdabeets! - HandlesendBeaconquota rejections instead of silently dropping events. A beacon rejected by the browser (over the page's shared ~64KiB in-flight keepalive quota) is now split in half and re-sent recursively so the batch delivers as far as the quota allows; a rejected payload that cannot be split falls back to a non-keepalive fetch and logs a warning. Previously the boolean return ofsendBeaconwas ignored and an over-quota unload batch was lost with no signal.(2026-07-14)
dc2aa5b]:v1.399.5Compare Source
1.399.5
Patch Changes
#4134
ab10064Thanks @posthog! - Bound autocapture's DOM ancestor walks against abnormal host-page DOM trees.autocapturePropertiesForElementandshouldCaptureElementnow stop climbing theparentNodechain after 1000 ancestors or if they revisit a node (only possible when a page patchesparentNode, since native DOMs cannot contain cycles), instead of walking indefinitely. WhenshouldCaptureElementcannot finish checking ancestors forph-no-capture/ph-sensitive, it fails closed and reports the element as not capturable. Behavior on normal DOM trees is unchanged.(2026-07-14)
#4141
17d956cThanks @posthog! - Log network-level fetch failures from posthog-js's own request layer (ad blocker, dropped connection, CORS, page teardown) atwarninstead oferror. The browser rejects these with a genericTypeError(Failed to fetch, Firefox'sNetworkError..., or Safari'sLoad failed); they are already caught and retried by the request queue, so they are expected noise rather than SDK errors —_fetchnow gives them the samewarntreatment as our own timeout aborts. Genuine, unexpected errors still log aterror.(2026-07-14)
v1.399.4Compare Source
1.399.4
Patch Changes
7c339beThanks @turnipdabeets! - Encode uncompressedsendBeaconbodies as base64 form data so the beacon keeps a CORS-simple content type. Previously an uncompressed unload beacon was sent asapplication/json, which forces a CORS preflight — a preflight cannot complete while the page unloads, so on cross-origin hosts the browser silently dropped the POST and the final batch of events was lost. Compression is inactive whenever the remote config request fails (flaky network, blocked endpoint), when the config response omitssupportedCompression, or withdisable_compression: true.(2026-07-13)
v1.399.3Compare Source
1.399.3
Patch Changes
4ebb618Thanks @mikenicholls88! - MakejsonStringifycircular-safe so event serialization never throws. Previously a captured property holding a circular value — most commonly a DOM node that retains a React fiber pointing back at the element — madeJSON.stringifythrowConverting circular structure to JSON; withcapture_exceptionsenabled that throw was recaptured as a new$exception, at times in a loop. On a throw we now fall back tosafeJsonStringifyfrom@posthog/core. The fast (non-circular) path is unchanged, and only true cycles become"[Circular]", so shared-but-acyclic references keep their real values.(2026-07-13)
v1.399.2Compare Source
1.399.2
Patch Changes
f630394Thanks @posthog! - Fix aRangeError: Maximum call stack size exceededoriginating from the shared rrwebpatch()helper. It patches shared globals such asElement.prototype.attachShadow(shadow-dom-manager) and the DOM/canvas observers, so multiple recorder instances or repeated start/stop cycles wrap the same global more than once. Previously an out-of-order restore silently no-op'd, leaving the wrapper in the call path; repeated cycles grew the wrapper chain without bound until a real call walked a chain deep enough to overflow the stack. Wrappers now delegate through a mutable per-layer link so any layer can be torn down even when newer wrappers sit on top of it, keeping the chain bounded. Recording behavior is unchanged. This applies the same fix as #4063 (fetch/XHR) to the shared helper so every rrweb-record caller inherits the bounded-chain behavior.(2026-07-10)
v1.399.1Compare Source
1.399.1
Patch Changes
#4122
c915581Thanks @github-actions! - FixTypeError: handlePageUnload is not a functionthrown on page unload when a version-skewed lazy-loaded surveys chunk produces a survey manager whose prototype lackshandlePageUnload. The delegated call inPostHogSurveys.handlePageUnload()now guards the method as well as the receiver.(2026-07-09)
#4124
562ceebThanks @posthog! - Session recording no longer crashes on startup when a CDN-loaded recorder chunk runs against an older bundled core. Calls intoSessionIdManager.on/onSessionIdare now guarded so a core without those methods degrades gracefully instead of throwing aTypeErrorduringstart().(2026-07-09)
v1.399.0Compare Source
1.399.0
Minor Changes
#4115
86bb3a5Thanks @DanielVisca! - add the posthog.metrics API (count, gauge, histogram) — alphaA statsd-style pre-aggregating metrics client for the PostHog Metrics product (alpha). Samples are folded into per-series aggregates in memory (counts sum, gauges keep the last value, histograms accumulate buckets) and flushed periodically as OTLP/JSON to
/i/v1/metrics— one data point per series per flush window, no matter how many calls. No OpenTelemetry SDK setup required:Configure via
metrics: { serviceName, environment, flushIntervalMs, maxSeriesPerFlush, beforeSend, ... }. (2026-07-08)Patch Changes
86bb3a5]:v1.398.7Compare Source
1.398.7
Patch Changes
#4113
45f17eeThanks @TueHaulund! - fix session replay leaking a shadow-root observer when a same-origin iframe is removedFollow-up to the shadow-observer iframe-teardown fix:
takeFullSnapshot'sonSerializeregisters every shadow root with the top-level document, so a root nested in a same-origin iframe was keyed to the wrong document and its observer/buffer were not disconnected when that iframe was removed (they lingered until the next full snapshot).addShadowRootnow derives the owning document from the host element, so per-document teardown matches iframe-nested roots too. (2026-07-08)v1.398.6Compare Source
1.398.6
Patch Changes
c75c0baThanks @hpouillot! - fix: avoid throwing when rrweb recorder cleanup cannot remove a listener(2026-07-08)
v1.398.5Compare Source
1.398.5
Patch Changes
be8242aThanks @rafaeelaudibert! - Publish the code-split ESM toolbar bundle when the build emits one. The release tooling now recursively includesdist/toolbar/(with explicit JS content types for the strict-MIME ESM chunks) across the immutable, major-alias, and compatibility upload prefixes, and the workflow accepts the canonicaltoolbar.js/toolbar.csslayout. This is a no-op against today's single-file build.(2026-07-08)
v1.398.4Compare Source
1.398.4
Patch Changes
#4104
ec5e401Thanks @TueHaulund! - fix session recordings missing their initial full snapshot after an idle session-id rotationWhen the session id rotated while the recorder was idle, the restarted recorder's Meta and FullSnapshot were appended to the previous session's buffer and shipped under the old session id, leaving the new recording unplayable until the next periodic snapshot. The buffer now rebinds on any session-id change regardless of idle state, and as a safety net the recorder requests a full snapshot whenever an incremental is about to ship for a session that has not produced one. (2026-07-08)
v1.398.3Compare Source
1.398.3
Patch Changes
#4112
38bb185Thanks @TueHaulund! - fix session replay silently dropping shadow DOM mutations after an iframe teardownThe single shared ShadowDomManager observes every shadow root on the page, but MutationBuffer.reset() disconnected it. That reset fires whenever any one buffer is torn down, so an iframe being removed or navigating away disconnected every shadow-root observer page-wide. Shadow DOM content (for example a widget mounted in an open shadow root) then stopped recording until the next periodic full snapshot re-registered it. Buffer teardown now releases only its own resources; global shadow observation is reset by takeFullSnapshot and on recording stop. (2026-07-08)
v1.398.2Compare Source
1.398.2
Patch Changes
#4063
24aadd5Thanks @posthog! - Fix aRangeError: Maximum call stack size exceededthat could originate from the sharedpatch()fetch/XHR wrapper. posthog-js wrapswindow.fetchin two independent places (tracing headers and session-recording network capture), so their restores routinely ran out of order. Previously an out-of-order restore silently no-op'd, leaving the wrapper in the call path; repeated start/stop cycles grew the wrapper chain without bound until a realfetchwalked a chain deep enough to overflow the stack. Wrappers now delegate through a mutable link so any layer can be torn down even when newer wrappers sit on top of it, keeping the chain bounded. Header-injection and network-capture behavior is unchanged.(2026-07-07)
#4100
e250a24Thanks @marandaneto! - Stop adding the gzip compression query parameter to browser SDK requests.(2026-07-07)
#4083
f07e241Thanks @posthog! - fix(replay): harden session-replay network capture so instrumentation that throws (e.g.new Request()rejecting a URL/method) degrades gracefully and never breaks or misattributes the host application's ownxhr.open()/fetch()calls(2026-07-07)
v1.398.1Compare Source
1.398.1
Patch Changes
5013ab6Thanks @marandaneto! - Stop sending the deprecatedverquery parameter to capture and session recording endpoints.(2026-07-07)
v1.398.0Compare Source
1.398.0
Minor Changes
ef119bfThanks @posthog! - Add adisableAutofocussurvey appearance option. When set, open-text survey questions no longer steal focus when they render, which is useful for embedded (inline) surveys that shouldn't grab the caret or scroll the page on load. Defaults tofalse, preserving the existing autofocus behavior.(2026-07-06)
v1.397.0Compare Source
1.397.0
Minor Changes
cc340dbThanks @bs1180! - feat(web): add aposthog-js/customizationssubpath entry point exposing the optional customizations (setAllPersonProfilePropertiesAsPersonPropertiesForFlags, thebefore-sendsampling helpers, and the redux/kea loggers) as a proper ES module with bundled types, replacing the internalposthog-js/lib/src/customizationsdeep import. Also fixes the TypeScript definitions sosetAllPersonProfilePropertiesAsPersonPropertiesForFlagsaccepts the instance passed to theloadedcallback (the documented usage), and theloadedcallback's instance type now includesconfig.(2026-07-06)
v1.396.9Compare Source
1.396.9
Patch Changes
2595440Thanks @pauldambra! - fix(web): stop retrying log batches forever when requests die before an HTTP response (status 0, e.g. an ad blocker) — after 3 consecutive such failures while the browser reports itself online, the logs pipeline stops sending and drops batches instead of buffering and retrying for the life of the page; theonlineevent reopens it, and genuine offline periods still queue for the reconnect flush(2026-07-06)
v1.396.8Compare Source
1.396.8
Patch Changes
2af0026Thanks @posthog! - fix(web): prevent an infinite-recursion stack overflow in the logs console capture. The console wrapper's own capture path can emit internal debug lines through PostHog's logger, which wrote back to the wrapped console and re-entered capture until the stack blew (RangeError: Maximum call stack size exceeded). The wrapper now exposes the original console method via__rrweb_original__(so the internal logger bypasses it) and guards against re-entrancy from any code that logs mid-capture.(2026-07-06)
v1.396.7Compare Source
1.396.7
Patch Changes
08cd27bThanks @marandaneto! - fix(web): stop repeatedly hitting blocked feature flag and conversations polling endpoints after consecutive status-0 failures(2026-07-06)
v1.396.6Compare Source
1.396.6
Patch Changes
#4053
45d1b36Thanks @posthog! - feat(web): add a gracefulshutdown()to the browser client for parity with posthog-node, so isomorphic teardown code (e.g. the Nuxt module) that callsposthog.shutdown()on the client no longer throwsTypeError: shutdown is not a function. It best-effort flushes the queued events and always resolves.(2026-07-03)
#4054
f0657ebThanks @posthog! - fix(web): detect our own feature-flag request timeouts via atimedOutflag instead of the abort reason, so they are logged atwarn(noterror) on browsers that don't propagatecontroller.abort(reason)— keeping benign timeouts out of error tracking's console-error capture(2026-07-03)
#4031
94a0530Thanks @posthog! - Improve survey display reliability:$surveysdefinitions after a short TTL (stale-while-revalidate) so server-side changes such as switching a survey from popover to API propagate to long-lived tabs without a page reload.posthog.surveys.markSurveyAsSeen(surveyId, { iteration })so custom integrators that render surveys through their own backend can honour the "already seen" and wait-period checks.Modalnotifies its parent on close even when iOSModal.onDismissfails to fire, so the transparent full-screen modal can no longer stay mounted intercepting touches and freezing the app. (2026-07-03)Updated dependencies [
45d1b36]:v1.396.5Compare Source
1.396.5
Patch Changes
d7cf13bThanks @turnipdabeets! - Prevent uncaughtgetComputedStylecrashes in heatmaps and autocapture when the event target is a cross-realm element (e.g. from an iframe or synthetic event)(2026-07-02)
5e7e132]:v1.396.4Compare Source
1.396.4
Patch Changes
#4035
18e543bThanks @posthog! - fix(web): isolateonFeatureFlagscallbacks so a throwing user handler no longer breaks the remaining callback chain or gets misattributed as an SDK error(2026-07-01)
#4039
15bcb42Thanks @github-actions! - fix(replay): measure$snapshot_bytesas UTF-8 byte length instead of UTF-16 string length, so non-ASCII session replay payloads are counted accurately against the message size limit(2026-07-01)
v1.396.3Compare Source
1.396.3
Patch Changes
e0ad8efThanks @posthog! - FixTypeError: ....at is not a functionthrown by the bundledweb-vitalsdependency on browsers that predateArray.prototype.at()(Chrome <92, iOS Safari <15.4). The web-vitals entrypoints now install a tinyArray.prototype.atpolyfill before web-vitals runs, so web vitals capture works again on older browsers instead of crashing with an unhandled error.(2026-06-30)
v1.396.2Compare Source
1.396.2
Patch Changes
b6261e7Thanks @marandaneto! - Include a Promise polyfill in the IE11 bundle and avoid Promise-dependent async compression paths when Promise support is unavailable.(2026-06-29)
v1.396.1Compare Source
1.396.1
Patch Changes
cdeae17Thanks @marandaneto! - Fall back to uncompressed browser requests when gzip encoding fails.(2026-06-29)
v1.396.0Compare Source
1.396.0
Minor Changes
74cc6bbThanks @TueHaulund! - Add aget_current_urlconfig option that overrides the URL used for client-side URL targeting — session replay URL triggers, the session replay URL blocklist, survey URL display conditions, product tour URL conditions, web experiment URL conditions, and autocapture URL allow/ignore lists. These match againstwindow.location.hrefdirectly, which does not reflect a$current_urlrewritten inbefore_send. Apps where the browser URL is not meaningful for targeting (e.g. Electron/desktop builds served from a generated host) can now return the logical URL to match against. Defaults towindow.location.hrefwhen not set.(2026-06-29)
Patch Changes
74cc6bb]:v1.395.0Compare Source
1.395.0
Minor Changes
6200888Thanks @turnipdabeets! - AddgetAllFeatureFlags(), which returns all currently loaded feature flags as structuredFeatureFlagResults (key,enabled,variant,payload). It is a synchronous read of the cached flags and does not send a$feature_flag_calledevent.(2026-06-26)
Patch Changes
6200888]:v1.394.0Compare Source
1.394.0
Minor Changes
919abcaThanks @ioannisj! - Capture the$device_modelsuper-property on Android Chromium vianavigator.userAgentData.getHighEntropyValues(['model']). Resolved once during init and sent on subsequent events; opt out withdisableDeviceModel: true.(2026-06-26)
v1.393.6Compare Source
1.393.6
Patch Changes
6ef9179Thanks @marandaneto! - Handle request serialization errors without throwing or blocking queued requests.(2026-06-26)
v1.393.5Compare Source
1.393.5
Patch Changes
619d318Thanks @marandaneto! - Improve console log capture performance for truncated large objects.(2026-06-25)
v1.393.4Compare Source
1.393.4
Patch Changes
c9c8925Thanks @hpouillot! - Fix browser console log capture when session activity timestamps are missing and refresh session attributes for each log.(2026-06-24)
c9c8925]:v1.393.3Compare Source
1.393.3
Patch Changes
f94deafThanks @ioannisj! - fix(surveys): guard handlePageUnload against version-skewed surveys instance missing the method(2026-06-24)
v1.393.2Compare Source
1.393.2
Patch Changes
1c9a811Thanks @ioannisj! - Stop logging a misleading "upgrade your PostHog server" warning for valid v2 flags responses that have no flags.(2026-06-24)
v1.393.1Compare Source
1.393.1
Patch Changes
99bad9cThanks @pauldambra! - Session replay network capture: add an opt-in streaming reader for request/response bodies that stops at the payload size limit instead of buffering the whole body and then discarding it — bounding memory and pre-request latency when a body is very large. It reads only a clone of the body, so it never consumes the stream the page itself reads, and always resolves (never rejects) into the page'sfetch. Off by default; enabled fordefaults: '2026-06-25'and settable directly viasession_recording.streamNetworkBody.(2026-06-24)
99bad9c]:v1.393.0Compare Source
1.393.0
Minor Changes
#3921
c28b161Thanks @marandaneto! - Adddisable_capture_url_hashesto strip URL fragments from automatically captured URLs. It is disabled by default for backwards compatibility, and enabled automatically whenconfig.defaultsis'2026-06-25'or later. Enabling it (either explicitly or via the'2026-06-25'defaults) is a breaking behavior change for SPAs that rely on URL hashes for routing or analytics, because hash-based routes will be collapsed to the same URL without the fragment in fields such as$current_url,$initial_current_url,$session_entry_url, autocapture$elements[*].attr__href,$external_click_url, replayhrefURLs, heatmaps, web vitals$current_url, logsurl.full, conversationscurrent_url/request_url, or Next.js Pages Router$pageview$current_url.If you only want to capture some hashes, leave hash capture enabled and use
before_sendto remove or redact sensitive hash values before events are sent. (2026-06-23)Patch Changes
c28b161]:v1.392.0Compare Source
1.392.0
Minor Changes
#3895
ce528edThanks @turnipdabeets! - Console log auto-capture (logs: { captureConsoleLogs: true }) now flows through the same pipeline asposthog.captureLog(),posthog.logger.*, and PostHog's other SDKs, instead of OpenTelemetry. As a result:logs.beforeSend(the same hook ascaptureLog/logger.*), so you can redact or drop sensitive console output before it's sent. To treat console logs differently from manual logs, branch on the record'slog.sourceattribute: auto-captured console logs set it toconsole.<method>(e.g.console.error), while manualcaptureLog/logger.*logs leave it unsetposthogDistinctId, the attribute PostHog uses to associate logs with a person (docs). The old path useddistinct_id, which isn't used for person linking by default, so console logs previously didn't appear on person profiles unless you'd configured a custom key.Console logs keep their
posthog-browser-logsservice.name, theirconsoleinstrumentation scope, and theirlog.source: console.<level>attribute.As part of moving onto the shared pipeline, console records now use PostHog's standard log field names — the same ones programmatic web logs and other SDKs use, and the ones the Logs UI surfaces. For the fields below the values are unchanged — only the attribute names/locations differ:
distinct_id→posthogDistinctId(record attribute)location.href→url.full(record attribute; same value — the page URL)session.id(resource attribute) →sessionId(record attribute) — renamed and movedhostandwindow.idmove from resource attributes to record attributes (names unchanged)feature_flagsFor most projects this needs no action — these are already the canonical log fields. The only thing to update is a saved Logs query or dashboard built specifically on an old console attribute name, for example:
attributes.distinct_id→attributes.posthogDistinctIdattributes.location.href→attributes.url.fullresource.attributes.session.id→attributes.sessionIdresource.attributes.host/resource.attributes.window.id→attributes.host/attributes.window.id(2026-06-22)Patch Changes
ce528ed]:v1.391.9Compare Source
1.391.9
Patch Changes
26aa9baThanks @posthog! - Exception autocapture: posthog-js's own fetch timeout now aborts with an explicit, descriptive reason (PostHog request timed out after <n>ms) instead of a reason-lessDOMException: AbortError: signal is aborted without reason. This keepsname === 'AbortError'so existing timeout handling (e.g. feature flag timeout detection) is unchanged, but makes our own timeouts identifiable and stops them being re-captured as noise by console-error exception autocapture.(2026-06-22)
v1.391.8Compare Source
1.391.8
Patch Changes
1fce04fThanks @marandaneto! - Apply CSP stylesheet preparation hook to Product Tours styles.(2026-06-22)
v1.391.7Compare Source
1.391.7
Patch Changes
dac4edbThanks @pauldambra! - Session replay network capture: redact credential-bearing headers on both request and response (previously only request), and match credential-shaped custom header names by substring (e.g.x-gist-encoded-user-token) in addition to the exact deny list - avoiding accidental capture of tokens/cookies in recordings.(2026-06-22)
v1.391.6Compare Source
1.391.6
Patch Changes
#3901
049eeb6Thanks @marandaneto! - Stop adding the unusedbeaconquery parameter to browser SDK sendBeacon requests.(2026-06-22)
#3900
3ee8667Thanks @marandaneto! - Stop adding the unusedipquery parameter to browser SDK requests.(2026-06-22)
v1.391.5Compare Source
1.391.5
Patch Changes
beaccc3Thanks @pauldambra! - Session replay: apply the existing base64 image size cap (maxBase64ImageLength) to SVG<image>elements withdata:URIs on bothhrefandxlink:href. Previously the cap only covered<img>elements, so large inline data URIs inside SVGs were recorded in full - this also covers them in mutations, replacing oversized ones with the striped placeholder.(2026-06-22)
v1.391.4Compare Source
1.391.4
Patch Changes
ee9f2a8Thanks @pauldambra! - Session replay network capture: expand the default payload host deny list to skip third-party analytics, RUM, and session-replay telemetry whose payloads have no replay value - Datadog, Segment, RudderStack, Amplitude, Mixpanel, Hotjar (both.comand.io), and FullStory. Also covers both Google Analytics beacon hosts (google-analytics.com, plusanalytics.google.comwhich gtag uses when Google Signals is enabled) and widens New Relic tonr-data.net.(2026-06-22)
v1.391.3Compare Source
1.391.3
Patch Changes
#3909
ab4a220Thanks @marandaneto! - Avoidstyle-src-attrCSP violations when diffing rrweb style mutations.(2026-06-22)
#3912
78ac40cThanks @pauldambra! - Session replay network capture: never record binary/asset response or request bodies (image, video, audio, font, octet-stream, pdf, zip, wasm) even whenrecordBodyis enabled - they bloat recordings, duplicate what the replay already shows, and the body is no longer read.(2026-06-22)
v1.391.2Compare Source
1.391.2
Patch Changes
6b21f77Thanks @marandaneto! - Validate custom event UUID overrides and generate new UUIDs when invalid.(2026-06-19)
6b21f77]:v1.391.1Compare Source
1.391.1
Patch Changes
#3899
d090a7cThanks @lucasheriques! - Surveys: re-check eligibility when a popover's display delay elapses, instead of only re-checking the URL.A survey with a display delay could be queued while a visitor was still anonymous (the targeting flag passed for the anonymous profile), and then displayed after the delay even though
identify()had reloaded feature flags and the survey's internal targeting flag was now false for the identified profile (e.g. a "show once per user" survey the person had already dismissed). The delayed display now re-runs the full display predicate (eligibility, URL/device/selector conditions, event/action trigger, and feature flags) before rendering, so a survey that became ineligible during the delay is no longer shown. Pending delayed surveys are also cancelled promptly when a later evaluation cycle finds them ineligible. (2026-06-19)v1.391.0Compare Source
1.391.0
Minor Changes
#3885
5392a55Thanks @pauldambra! - feat(replay): capture canvas at reduced resolutionAdds
session_recording.canvasCapture.resolutionScale- a(0, 1]fraction of the canvas display size to capture replay frames at. The captured bitmap is downscaled (pixel-area savings are quadratic) while the canvas's true display size is still recorded, so playback stretches the smaller frame back to the correct dimensions and aspect ratio - only sharpness drops, never layout. It defaults to1(full resolution, matching today's behaviour), and the latestdefaultsbundle (2026-05-30) opts new installs into0.6.The canvas's true display size travels with each frame through the encode worker (as required message fields), so the encoded reply is always drawn back to the correct dimensions — no per-canvas state is retained on the main thread, and downscaling can never mislabel a canvas's dimensions. At full resolution the captured pixels are unchanged (the quality resampling hint is only applied when actually downscaling); the emitted
drawImagenow always uses the explicit destination-size form, which is pixel-equivalent on replay.Mechanically,
@posthog/rrweb's canvas FPS-snapshot observer takes an optionalcanvasResolutionScalerecord option and downscales each captured frame accordingly. (2026-06-19)Patch Changes
5392a55]:v1.390.2Compare Source
1.390.2
Patch Changes
#3868
a5dd54aThanks @pauldambra! - fix(replay): scope the session-recording flushed-size tracker to the session$sdk_debug_replay_flushed_sizewas stored as a single device-global value in persistence and only reset on an in-page session rotation, so it leaked across page loads and tabs and over-counted on returning visitors. The tracker now keys the running total to the current session id, so a new session starts from zero and a fresh load reading an ongoing session sees the correct total.The internal persistence key backing this counter (
$sess_rec_flush_size) was also unintentionally attached to every captured event as a super-property; it is now marked hidden so it no longer ships on events. The value remains available on session-replay debug events as$sdk_debug_replay_flushed_size. (2026-06-17)v1.390.1Compare Source
1.390.1
Patch Changes
#3784
e25e629Thanks @lucasheriques! - Surveys: event-triggered surveys are now scoped to the page load the event fired in, and only persist across a page reload once they have actually been shown.Previously an event armed a survey by writing it to localStorage, where it stayed until shown. Because the activation survived reloads and the URL condition was only checked at display time, a survey armed by an exit-intent event (which fires as the user is leaving or reloading) could surface on a later page load with no event behind it. Activations now live in memory until the survey is shown, so an armed-but-unshown survey no longer reappears after a reload.
Once a survey is shown it is promoted to persistence, so a non-repeatable survey survives a reload and re-displays until the user dismisses or answers it (instead of vanishing if they reload before interacting). Repeatable surveys (
schedule: 'always'or "Show every time the event is captured") are still consumed when shown, so each captured trigger shows them once. Product tours follow the same model. Cross-page deferral (arm on one full page load, display on a later one) is no longer supported via event triggers; use audience targeting for that. (2026-06-17)v1.390.0Compare Source
1.390.0
Minor Changes
#3869
81b79fbThanks @turnipdabeets! - Add abeforeSendoption to the logs config, so you can inspect, redact, or drop log records before they're sent:beforeSendaccepts a single function or an array of functions (applied left to right); returningnullfrom any of them drops the record. It runs for logs sent via bothposthog.captureLog()andposthog.logger.*. (2026-06-17)Patch Changes
81b79fb]:v1.389.1Compare Source
1.389.1
Patch Changes
43b4137Thanks @marandaneto! - Limit retries for transport failures without an HTTP response.(2026-06-17)
v1.389.0Compare Source
1.389.0
Minor Changes
b469830Thanks @turnipdabeets! - The browser's programmatic logs API (posthog.captureLog()/posthog.logger.*) now runs through the shared@posthog/corelogs pipeline that React Native already uses — no change to the public API or existing behavior. Log delivery is more resilient as a result: oversized batches are split automatically, failed sends retry with exponential backoff, and delivery resumes when the browser comes back online.(2026-06-17)
Patch Changes
b469830]:v1.388.2Compare Source
1.388.2
Patch Changes
5edfee1Thanks @turnipdabeets! - FixupdateFlags(flags, payloads, { merge: true })baking an active feature flag override into the stored flags. The merge now seeds from the raw stored flags rather than the override-applied values, so clearing the override afterwards correctly restores the original flag.(2026-06-17)
v1.388.1Compare Source
1.388.1
Patch Changes
5c453cdThanks @marandaneto! - Apply CSP nonce preparation hooks to style and script elements appended by site apps.(2026-06-17)
v1.388.0Compare Source
1.388.0
Minor Changes
b6bc9beThanks @marandaneto! - Add autocapture-only CSS selector opt-outs for web interactions.(2026-06-17)
Patch Changes
b6bc9be]:v1.387.0Compare Source
1.387.0
Minor Changes
c6c163aThanks @posthog! - AddunsetPersonProperties()to remove person properties, the counterpart tosetPersonProperties(). Previously the only way to unset a person property was to hand-pass a$unsetarray inside acapture()call.(2026-06-16)
Patch Changes
#3756
b3ec845Thanks @archievi! - Drop the event and log a warning when abefore_sendhook removes thetokenproperty, instead of silently sending an event that ingest rejects with a 401.(2026-06-16)
#3860
c9c7df1Thanks @marandaneto! - Add$unsetto capture options and pass it through in browser capture payloads.(2026-06-16)
#3855
fadaa4fThanks @haacked! - Stop sending theipquery parameter on feature flag requests. The flags endpoint ignores it, and some ad blockers match/flags…ip=to block flag evaluation on any domain. Dropping it from flag requests avoids the block with no functional change. Event and session recording requests are unchanged.(2026-06-16)
#3830
0d837f5Thanks @dustinbyrne! - Avoid reloading exception and dead-click autocapture external scripts when they are already present.(2026-06-16)
#3853
f95a0ecThanks @TueHaulund! - Capture native Fullscreen API transitions in session replay. Entering native fullscreen (element.requestFullscreen()) is rendered by the browser via the UA:fullscreenpseudo-class with no DOM mutation, so the recorder previously captured nothing and replays showed the element at its pre-fullscreen size with drifted click coordinates. The recorder now emits a reserved custom event onfullscreenchange(standard pluswebkit/moz/MSprefixes), and the replayer re-applies fullscreen layout to the element on playback (including when scrubbing into a fullscreen region) via a reservedrr_fullscreenattribute, consistent with rrweb's existingrr_*attribute namespace.Known limitation: fullscreen of an element inside a same-origin iframe is recorded against the
<iframe>element rather than the inner element, so replay pins the iframe. (2026-06-16)Updated dependencies [
b3ec845,c9c7df1,c6c163a]:v1.386.8Compare Source
1.386.8
Patch Changes
3094f73Thanks @TueHaulund! - fix(replay): discard the prior session's buffer when start() bails out a pending stop(). On a stopSessionRecording() → reset() → identify(newUser) → startSessionRecording() sequence, stopSessionRecording() takes the async compression-drain path, deferring its buffer flush and teardown. start() correctly invalidates that pending cleanup so the new recorder survives, but it left the stopped session's snapshot buffer in place. The re-entrant session-id restart then flushed those previous-user snapshots under the OLD session id, producing a mixed-distinct_id session that server-sideany(distinct_id)attribution resolves to the wrong person — recordings showing the previous user's identity. start() now clears that stale buffer alongside invalidating the compression queue, matching the drop-trailing-data trade-off the bailed-out stop() path already accepts.(2026-06-15)
v1.386.7Compare Source
1.386.7
Patch Changes
#3837
29bf8e3Thanks @marandaneto! - Add missing bugs metadata to package manifests.(2026-06-15)
#3832
d3a9462Thanks @archievi! - Surveys: guard the remaining unprotectedlocalStorageaccesses (reset()and thelastSeenSurveyDatewrite) so aSecurityErrorin cross-origin iframes is swallowed instead of bubbling up to user monitoring.(2026-06-15)
Updated dependencies [
29bf8e3]:v1.386.6Compare Source
1.386.6
Patch Changes
#3804
a27b163Thanks @pauldambra! - fix(product-tours): drop the cached tours blob when product tours is not enabledTours fetched while product tours was enabled are cached under
ph_product_toursin the main persistence blob. Once product tours is disabled (remote config or thedisable_product_toursoption) that cache was never cleaned up, so a potentially large stale blob kept riding on every persistence write — and on every cross-tabstorageevent those writes broadcast.onRemoteConfignow clears the cached tours whenever product tours resolves to disabled; they are re-fetched if it is ever re-enabled. (2026-06-11)v1.386.5Compare Source
1.386.5
Patch Changes
bd06ac7Thanks @ksvat! - fix(replay): prevent silent recorder teardown on session-id rotation. When the session id rotates during active rrweb capture,_updateWindowAndSessionIdscallsstop()then synchronouslystart('session_id_changed'). Ifstop()took the_stopAfterCompressionQueueDrainspath (which fires whenever the compression queue is non-empty — common during steady recording), its async cleanup would later resolve and call_teardown()against the freshly-started recorder, stopping rrweb, removing event listeners, and emptying the V2 trigger-group matchers. From that point on, the recorder'sstatusgetter kept reportingactive/sampled(the_strategyreference was still set), but rrweb was no longer producing events, no listeners were registered, and no$snapshotdata reached the server — the session looked recording-eligible from event metadata yet produced no replay.start()now invalidates the compression-queue state (generation bump plus reset of the stop-in-progress flag and queued-event count), so any pending cleanup from a priorstop()bails at its existing generation check and a laterstop()of the new recorder is not mistaken for the old in-progress one. Affects long-running tabs that rotate session id mid-use (idle timeout, session-past-max-length, orposthog.reset()).(2026-06-11)
v1.386.4Compare Source
1.386.4
Patch Changes
fdc07f3Thanks @arnohillen! - replay: jump scrolls instantly when seeking past pages that usescroll-behavior: smooth. During fast-forward the replayer applied scrolls withbehavior: 'auto', which inherits the page's CSSscroll-behavior— so on sites that setscroll-behavior: smooth(e.g. Silk bottom sheets/modals) a seeked scroll animated from 0 instead of jumping, leaving scroll-revealed content (the open sheet) out of view and showing only the backdrop until the animation caught up. Sync scrolls now usebehavior: 'instant', matching the method's stated intent that smooth scrolling be disabled while fast-forwarding. Full snapshot rebuilds apply their initial offset withbehavior: 'instant'too, so the document-level scroll doesn't animate either.(2026-06-11)
v1.386.3Compare Source
1.386.3
Patch Changes
#3760
5ddfd44Thanks @benben! - fix(conversations): re-attach the support widget after SPA navigations that replacedocument.body(e.g. Turbo Drive), so the widget no longer disappears until a full page reload(2026-06-11)
#3690
dbf2377Thanks @pauldambra! - fix(sessionid): keep the session id stable across tabsA session now rotates only when every tab has been idle past the timeout, rather than whenever a single background tab decides it is idle. On the active event path an idle tab re-reads the session id from storage before rotating: if a sibling tab kept the session alive it does not rotate, and if a sibling already rotated it adopts that id instead of minting a new one. This removes spurious cross-tab session fragmentation (inflated session counts, truncated session durations, split replays). When a sibling session is adopted,
onSessionIdhandlers fire withchangeReason.crossTabAdoption: trueso session recording, pageview state, and session-scoped properties follow the new session. Whenpersistence_save_debounce_ms > 0(the2026-05-30default) the refresh reads only the session-id key so it cannot clobber a sibling's write.Note: projects with significant multi-tab usage will see fewer but longer sessions after upgrading — this is a correction of previously over-counted sessions, not a traffic change. (2026-06-11)
#3795
21441a8Thanks @pauldambra! - fix(persistence): stop per-request metadata rewriting the split-storage entries on every load$feature_flag_evaluated_at,$feature_flag_request_id, and$surveys_loaded_atchange on every/flags(or/surveys) load even when the flag and survey content is unchanged. Withsplit_storageenabled that made the multi-hundred-KB__flags/__surveyslocalStorage entries dirty on every SPA navigation, re-broadcasting the full payload to every open same-origin tab via cross-tabstorageevents — the exact pressure the split exists to remove. These keys are now marked volatile: a value-only change neither dirties the group nor alters its fingerprint, so the write is skipped and the freshest value rides along on the next real content write. Adding or deleting a volatile key still writes through (presence is fingerprinted, the moving value is not), and the in-memory value is always current — only the on-disk copy may lag until the next content change. (2026-06-11)Updated dependencies [
dbf2377]:v1.386.2Compare Source
1.386.2
Patch Changes
25822ac]:v1.386.1Compare Source
1.386.1
Patch Changes
#3780
93e0461Thanks @dustinbyrne! - Fix stale sampled-in session replay decisions after the configured replay sample rate changes.(2026-06-10)
#3788
6da86d0Thanks @TueHaulund! - fix(replay): never record or flush snapshots while the sampling decision is missingWhen the stored sampling decision was wiped while the recorder was running (e.g. by
posthog.reset()), the undecided session reported anactivestatus and could leak short junk recordings from sessions that then decided not to record. Sampling decisions are now persisted tagged with the session id they were made for ('!' + sessionIdwhen sampled out), are re-made on every session id change regardless of config availability, and a buffer is never flushed without a decision when sampling is configured. Because the decision is a deterministic hash of the session id, re-deciding never flips the outcome for the same session. This also stops a stalefalsedecision from a previous session being inherited by a new session, which chronically under-recorded returning visitors. (2026-06-10)Updated dependencies []:
v1.386.0Compare Source
1.386.0
Minor Changes
#3634
612f97aThanks @lucasheriques! - feat(surveys): add opt-inappearance.allowGoBackfor multi-question surveys, and make button labels translatableRenders a "Back" button on web surveys after the first question. Default is off — existing surveys are unchanged. Uses a visited-index history stack so back-navigation respects branching paths (
response_based,specific_question), and abandoned-branch responses are pruned before submission so analytics aren't polluted. Returning to a question pre-fills the prior answer.appearance.backButtonTextoverrides the default label. The button uses the survey's text color so it stays readable on any background, and it also shows in survey previews.Also adds
submitButtonTextandbackButtonTextto survey-level translations, so both the submit and back button labels can be localized viaappearancetranslations (previously only the per-question button text was translatable). (2026-06-10)Patch Changes
612f97a]:v1.385.0Compare Source
1.385.0
Minor Changes
f601c49Thanks @dustinbyrne! - Promote external dependency script versioning to supportedstrict_script_versioningandasset_hostconfig options.(2026-06-10)
Patch Changes
#3753
c11794dThanks @dustinbyrne! - Reload feature flags by default when resetting person properties for flags.(2026-06-10)
#3742
23b2af1Thanks @arnohillen! - record: capture resting scroll offset onscrollendwhen a reveal scroll clamps to 0 before its target is scrollable (e.g. Silk sheets). Deduped againstscrollso normal gestures don't double event volume.(2026-06-10)
Updated dependencies [
c11794d,f601c49]:v1.384.3Compare Source
1.384.3
Patch Changes
2d21adaThanks @marandaneto! - Deprecate__preview_disable_beaconin favor ofdisable_beaconand mark__preview_disable_xhr_credentialsas a no-op.(2026-06-10)
2d21ada]:v1.384.2Compare Source
1.384.2
Patch Changes
d9462b3Thanks @marandaneto! - Deprecate__preview_eager_load_replayas a no-op now that session replay lazy loading is the default.(2026-06-10)
d9462b3]:v1.384.1Compare Source
1.384.1
Patch Changes
0e22d77Thanks @TueHaulund! - replayer: stop corrupting recordings when events are added behind the playhead.addEvent()used to apply any event older than the playback baseline synchronously onto the current DOM — correct for live-mode catch-up, but wrong for on-demand playback where snapshot chunks can finish loading after the user has seeked ahead. Applying those past mutations onto a DOM at a different position made theirremovesfail mirror lookups, andapplyMutationthen deleted the failed entries from the event objects themselves, so every later seek rebuilt from corrupted data (DOM nodes accumulating, e.g. duplicated text) and exports serialized the stripped events. Past events are now only applied synchronously in live mode (otherwise they are just inserted for the next seek to pick up), andapplyMutationfilters removes into a local copy instead of mutating the event data.(2026-06-10)
v1.384.0Compare Source
1.384.0
Minor Changes
#3782
0c2acb9Thanks @pauldambra! - Detect the Google Search App (GSA) as its own$browservalue (Google Search App) via the cross-platformGSA/UA marker, instead of reporting the embedded webview as Mobile Safari (iOS) or Chrome (Android). Gated behind the newdetect_google_search_appconfig option, which the2026-05-30config defaults opt into automatically — left off otherwise to keep existing browser attribution backwards-compatible.Note:
$browser_versionforGoogle Search Appis not comparable across platforms — iOS yields a version like284.0(fromGSA/284.0.564099828) while Android yields a version like14.21(fromGSA/14.21.20.28.arm64), since Google maintains separate versioning schemes for the two apps. Avoid building cross-platform version dashboards on$browser_versionfor this browser. (2026-06-10)Patch Changes
0c2acb9]:v1.383.3Compare Source
1.383.3
Patch Changes
783ba46Thanks @marandaneto! - Deprecate the no-op__preview_flags_v2browser SDK config option. The SDK already uses the/flags/?v=2endpoint by default.(2026-06-09)
783ba46]:v1.383.2Compare Source
1.383.2
Patch Changes
7820929Thanks @marandaneto! - Reduce duplicate internal code found by dry4ts.(2026-06-09)
v1.383.1Compare Source
1.383.1
Patch Changes
e481b0cThanks @dustinbyrne! - Respectcapture_pageview: falsewhen opting out in cookielesson_rejectmode.(2026-06-08)
v1.383.0Compare Source
1.383.0
Minor Changes
#3771
227c9b0Thanks @dustinbyrne! - feat(persistence): addsplit_storageconfig option to store the feature-flag config cluster in its own localStorage entry (<name>__flags) instead of the single main persistence blob. This payload is large and changes rarely, so keeping it out of the main blob stops it riding on every high-frequency main-blob write and broadcasting on cross-tabstorageevents. Reads are unchanged: on load the entry is merged back into the in-memory props, and the old main-blob location is read once and migrated forward so upgrades never miss a cached flag. The split only applies when persistence resolves tolocalStorage/localStorage+cookie(it is pointless formemory/sessionStorageand impossible forcookie), andreset()/ opt-out wipe every entry. Defaults tofalsefor backwards compatibility; the new2026-05-30config default opts in automatically.(2026-06-08)
#3727
393f9e2Thanks @pauldambra! - feat(surveys): extendsplit_storageto also move the survey config ($surveys) out of the main persistence blob into its own<name>__surveyslocalStorage entry, on top of the feature-flag split. Surveys now stamp a$surveys_loaded_atfreshness timestamp on every/surveysload — the survey analogue of$feature_flag_evaluated_at— so a stale__surveysentry can no longer win over a fresher survey payload written back into the main blob by a gate-off / older-SDK tab. With no timestamp on either side (migration leftover) the group entry still wins, so the migration path is unchanged. Same backend andreset()/ opt-out semantics as the flag split.(2026-06-08)
Patch Changes
227c9b0,393f9e2]:v1.382.0Compare Source
1.382.0
Minor Changes
#3749
9877710Thanks @pauldambra! - Stop classifying intentional repeated clicks as rageclicks. From the2026-05-30config defaults, rageclick detection now ignores:textarea, text-likeinputs, andcontenteditableelements), where rapid clicks are double/triple-click text selection rather than rage (rageclick.ignore_text_selection)+/-stepper buttons, added to the defaultcontent_ignorelistSymbol-only keywords in
content_ignorelist(e.g.+,-,>,<) now match the element's text exactly instead of as a substring, so labels likesign-up,5 > 3, orC++are no longer treated as repeatedly-clicked controls. The heatmaps rageclick marker now applies the same suppression as the$rageclickevent.A partial
rageclickconfig object is now merged with the date-gated defaults instead of replacing them, so e.g.rageclick: { threshold_px: 50 }keeps the defaultcontent_ignorelist/ignore_text_selection. Pass an explicit value (e.g.content_ignorelist: false) to override a specific default, or a boolean to opt out entirely.Behaviour change for existing
content_ignorelist: trueusers (available since2025-11-30): the default list already includes>and<. After this release, buttons whose text contains>or<but is not exactly that symbol (e.g.Learn more >,< Back,home > settings) will no longer be suppressed. Bare>and<buttons remain suppressed. This is the intended fix, but if you rely on the old substring behaviour for those keywords, replacecontent_ignorelist: truewith an explicit array listing the exact terms you want to suppress. (2026-06-06)Patch Changes
v1.381.0Compare Source
1.381.0
Minor Changes
a7bd828Thanks @lricoy! - Add__preview_cookie_wins_on_conflictopt-in config to prefer cookie values over localStorage when merging persistence state inlocalStorage+cookiemode, fixing cross-subdomain identify and session disconnects.(2026-06-05)
Patch Changes
a7bd828]:v1.380.1Compare Source
1.380.1
Patch Changes
ced0039Thanks @robbie-c! - fix(surveys): stop the survey CSS from using:has(.survey-question:empty), which crashes some WebKit builds during text-node style invalidation while a survey renders. The empty-header margin tweak now keys off a JS-setquestion-header--emptyclass and a sibling selector instead.(2026-06-05)
v1.380.0Compare Source
1.380.0
Minor Changes
2387084Thanks @dustinbyrne! - Promote browser tracing header configuration to the publictracing_headersoption while keepingaddTracingHeadersand__add_tracing_headersas deprecated aliases.(2026-06-04)
Patch Changes
2387084Thanks @dustinbyrne! - When using tracing headers,X-POSTHOG-DISTINCT-IDis read at request time instead of when fetch/XHR is patched, ensuring it reflects bootstrap, identify, reset, and other identity changes.(2026-06-04)
2387084]:v1.379.3Compare Source
1.379.3
Patch Changes
32de5d2Thanks @clr182! - logs: the console-log integration now respectsopt_out_capturing()— it checksis_capturing()before emitting, so log events stop on opt-out (and resume on opt-in).(2026-06-04)
v1.379.2Compare Source
1.379.2
Patch Changes
374962aThanks @arnohillen! - replay: re-apply scroll positions after fast-forward/seek. Scrolls applied mid-catch-up could clamp to 0 when the target wasn't scrollable yet (e.g. scroll-revealed sheets/modals whose content sits below the fold), leaving the content scrolled out of view on replay. The last scroll per node is now re-applied in the flush stage once layout has settled.posthog-jsis bumped too so the rebuilt bundle containing the fix is published.(2026-06-03)
v1.379.1Compare Source
1.379.1
Patch Changes
#3570
4a27cedThanks @gruessi! - fix(record): release iframe documents and observers on iframe removal — same-origin iframes mounted and unmounted while session recording is active no longer leak theirDocument, every node serialized into the mirror, or oneMutationObserverper mount. Closes eight retainer chains: load-listener disposers, named pagehide handlers, therecordCrossOriginIframescleanup gate (now applied to same-origin too), capturedDocument/Windowsets that surviveiframe.srcswap-to-about:blankbefore removal, and the globalmutationBuffers[]/handlers[]arrays which previously accumulated forever. Validated end-to-end: a host page that mounts/unmounts 5 blob-URL iframes every 2s for 110s went from +118 MB / +390 leakedHTMLDocuments to ~0 MB / 0.(2026-06-03)
#3717
1688b38Thanks @turnipdabeets! - Move the OpenTelemetry logs dependencies todevDependencies. They are only used to build the CDN-servedlogsextension chunk, which inlines them, so consumers no longer install the transitiveprotobufjs(whoseeval("require")trippedunsafe-evalContent Security Policies).If you imported
@opentelemetry/*directly while relying on it being hoisted fromposthog-js, add it to your own dependencies. (2026-06-03)Updated dependencies []:
v1.379.0Compare Source
1.379.0
Minor Changes
c487070Thanks @marandaneto! - Add$sdk_dist_channelevent property for browser SDKnpmandcdndistribution channels.(2026-06-02)
Patch Changes
v1.378.1Compare Source
1.378.1
Patch Changes
8fcf40dThanks @dustinbyrne! - fix(browser): avoid exposing internally-created Request bodies to downstream fetch wrappers in Safari.(2026-06-01)
v1.378.0Compare Source
1.378.0
Minor Changes
8181354Thanks @pauldambra! - feat(persistence): addpersistence_save_debounce_msconfig option to coalesce rapid storage saves into a single write. Setting a positive value debounces writes to localStorage/cookie by that window; the in-memorypropsobject still updates synchronously so within-tab reads see the latest values immediately, and pending writes flush onbeforeunloadandpagehideso no state is lost on tab close. Cross-tabstorageevents are reduced proportionally to the debounce window. Defaults to0(no debouncing) for backwards compatibility. On pages that capture many events per second,250is a reasonable starting point. The new2026-05-30config default opts intopersistence_save_debounce_ms: 250automatically.(2026-06-01)
Patch Changes
8181354]:v1.377.0Compare Source
1.377.0
Minor Changes
#3708
3d4a76fThanks @pauldambra! - Detect Brave (desktop, Android, iOS), Vivaldi, Yandex, Naver Whale, DuckDuckGo, Pale Moon, and Waterfox so users on these browsers no longer get bucketed as Chrome or Firefox.detectBrowser/detectBrowserVersionnow accept an optional third argument,BrowserDetectionHints, with abraveflag (set whennavigator.braveexists). The browser SDK populates this automatically to catch desktop / Android Brave, which is Chromium-based and carries no UA marker. Brave on iOS is picked up purely from theBrave/UA marker — WebKit doesn't shipnavigator.brave. The original two-argument signature still works for non-DOM callers. (2026-06-01)Patch Changes
f3cc6faThanks @marandaneto! - Disable/no-op initialization paths instead of throwing or sending requests when PostHog project tokens are missing or blank.(2026-06-01)
3d4a76f]:v1.376.6Compare Source
1.376.6
Patch Changes
663e250Thanks @pauldambra! - fix(persistence): skip the storage write when the serialized props are unchanged. Callers spamsave()after every property change, and many of those changes leave the serialized payload identical (e.g. resetting a value to its current value). Writing identical bytes to localStorage still fires a cross-tabstorageevent in every same-origin tab, where Chrome allocates the payload buffer in mojo IPC even though no listener reacts. Nowsave()compares the serialized payload against the last successful write and bails out when nothing changed.(2026-05-31)
v1.376.5Compare Source
1.376.5
Patch Changes
66cbc59Thanks @pauldambra! - fix(persistence): throttle session-activity timestamp writes to a 5s granularity. The in-memory value still moves at full resolution; only writes to localStorage/cookie are coalesced. Activity-timestamp-only updates within the granularity window are skipped, dropping localStorage write pressure and cross-tabstorageevent broadcasts on pages that capture many events per second. The pending in-memory value is flushed ondestroyandbeforeunloadso a tab close inside the window does not leave the persisted value up to 5s stale for sibling tabs. The flush re-reads storage first and bails out if a sibling tab has rotated the session, so the flush cannot clobber the new session with the old id/start.(2026-05-31)
d9ad199]:v1.376.4Compare Source
1.376.4
Patch Changes
#3685
f59f35aThanks @ioannisj! - fix(cookieless): enable request queue when opting out inon_rejectmode. When usingcookieless_mode: "on_reject", callingopt_out_capturing()correctly switched the SDK into cookieless capturing but never enabled theRequestQueue— so batched events were enqueued but never flushed over the network. At init time the queue was not started because consent wasPENDINGandis_capturing()returnedfalse;opt_out_capturing()is the first moment capturing becomes active but was missing the_start_queue_if_opted_in()call thatopt_in_capturing()already had.(2026-05-28)
#3692
f01cd93Thanks @ksvat! - fix(replay): take a fresh full snapshot after session ID rotates viaforcedIdleReset. Previously, when the session manager's idle enforcement timer rotated the session id, the recorder tore down rrweb and set_isIdle = 'unknown'before the new session id was observed. Neither restart path then fired (the_onSessionIdCallbackguard only restarted when_isIdle === true, and_updateWindowAndSessionIdscould not run with rrweb stopped), so the new session received only incremental mutations until a later snapshot — leaving the player stuck on "Buffering". The restart guard now also fires when rrweb isn't running.(2026-05-28)
#3691
cc71f3fThanks @ksvat! - fix(replay): shipph-no-captureabsolute-position fix from #3678 toposthog-js. The original changeset only bumped@posthog/rrweband@posthog/rrweb-snapshot; becauseposthog-jsdepends on@posthog/rrwebviaworkspace:*, the cascade did not bumpposthog-js, so the rebuilt bundle containing the fix was not published. This changeset re-publishesposthog-jswith the fix.(2026-05-28)
#3695
e1ff722Thanks @ksvat! - chore(replay): expose$sdk_debug_rrweb_attachedand$sdk_debug_rrweb_start_attempteddebug properties on captured events. Today the SDK already stamps several$sdk_debug_*properties (start reason, linked-flag trigger status, recording status) that report the SDK's intent to record — they all flip to "active" as soon as the state machine evaluates the configured triggers. None of them observe whether rrweb actually attached and is producing events. The new booleans close that gap:$sdk_debug_rrweb_start_attemptedis set when_startRecorder()is first entered, and$sdk_debug_rrweb_attachedreflects whether_stopRrwebis currently a non-falsy stop handle (i.e.rrwebRecord({...})returned successfully and the recorder has not been torn down). No behavior change — this only adds two booleans to the existingsdkDebugPropertieschannel, used to diagnose cases where a session reportstrigger_activated/recording_status: activebut no$snapshotdata is ever uploaded.(2026-05-28)
Updated dependencies [
7b84b75]:v1.376.3Compare Source
1.376.3
Patch Changes
9cac1f6Thanks @marandaneto! - Improve console log serialization performance for large objects.(2026-05-27)
v1.376.2Compare Source
1.376.2
Patch Changes
cafa9ccThanks @pauldambra! - fix(replay): stop polling preload-as-style<link>elements forever. Session recorder treated<link rel="preload" as="style" href="*.css">as if it were a stylesheet and waited forlink.sheetto populate. Per spec preload links never instantiate aCSSStyleSheet, so the wait timed out, re-serialized the link, scheduled another wait, and leaked aloadlistener on every cycle — multiplying further on every realloadevent. Pages with Next.js-style CSS preloads accumulated thousands of active polling chains, saturating the main thread and freezing the tab on refocus(2026-05-26)
v1.376.1Compare Source
1.376.1
Patch Changes
5568f12]:v1.376.0Compare Source
1.376.0
Minor Changes
6e8d349Thanks @arnaudhillen! - Expose the in-repo@posthog/rrweb,@posthog/rrweb-types, and@posthog/rrweb-plugin-console-recordpackages as subpath entry points onposthog-js. Consumers can nowimport { Replayer } from 'posthog-js/rrweb',import type { eventWithTime } from 'posthog-js/rrweb-types', andimport { LogLevel } from 'posthog-js/rrweb-plugin-console-record'instead of installing the underlying rrweb packages directly. The rrweb worker sourcemap (image-bitmap-data-url-worker-*.js.map) is also shipped fromposthog-js/dist/so downstream bundlers no longer need to reach intonode_modules/@​posthog/rrweb.(2026-05-22)
Patch Changes
c806ccaThanks @marandaneto! - Use native async gzip compression for session recording events when CompressionStream is available.(2026-05-22)
c806cca]:v1.375.0Compare Source
1.375.0
Minor Changes
2e1d5f4Thanks @dustinbyrne! - Addflag_keysconfig to restrict browser feature flag remote evaluation to specific flag keys.(2026-05-21)
Patch Changes
2e1d5f4]:v1.374.4Compare Source
1.374.4
Patch Changes
#3638
87e2145Thanks @marandaneto! - Apply tracing headers to matching XMLHttpRequest requests(2026-05-21)
#3646
4f87827Thanks @marandaneto! - Avoid throwing or initializing PostHogProvider when no API key or client is provided(2026-05-21)
#3645
280832bThanks @TueHaulund! - Capture<link rel="stylesheet">URLs fromlink.sheet.hrefand trylink.sheetdirectly for inlining, so recordings survive SPAhistory.pushStatenavigations between routes of different path depths (wherelink.hrefre-resolves against a new baseURI butlink.sheet.hrefpreserves the URL the browser actually fetched).Ships the fix landed in #3635, which only bumped the internal
@posthog/rrweb-snapshotpackage — that package is bundled intoposthog-jsat build time but is not published to npm on its own, so aposthog-jsbump is needed to actually deliver the change. (2026-05-21)Updated dependencies []:
v1.374.3Compare Source
1.374.3
Patch Changes
557b893Thanks @eli-r-ph! - Enable $web_vitals reporting when cookieless mode is enabled(2026-05-20)
557b893,a880dbc]:v1.374.2Compare Source
1.374.2
Patch Changes
#3550
df91995Thanks @TueHaulund! - Preserve session-recording remote config acrossposthog.reset().posthog.reset()was clearing the entire persistence store, which wiped$session_recording_remote_configalong with user state. On the next sessionrotation triggered by the reset,
start('session_id_changed')would early-returnbecause the remote config was missing — leaving rrweb torn down and the new
session opening with no Meta + FullSnapshot until the next periodic 5-minute
checkout.
This affected any flow where an app calls
posthog.reset()mid-session(e.g. on sign-out / sign-in) and was particularly visible on Flutter Web
recordings that depend on a fresh FullSnapshot to anchor the CanvasKit DOM. (2026-05-18)
Updated dependencies []:
v1.374.1Compare Source
1.374.1
Patch Changes
07a0f5fThanks @marandaneto! - Respect transport overrides passed to posthog.capture.(2026-05-18)
v1.374.0Compare Source
1.374.0
Minor Changes
594ea11Thanks @pauldambra! - Dead clicks: add a.ph-no-deadclickCSS class (andcapture_dead_clicks.css_selector_ignorelistconfig option) to exclude specific elements from dead-click detection without affecting autocapture, session replay, or heatmaps. Mirrors the existing.ph-no-rageclickpattern.(2026-05-18)
Patch Changes
3c0a09fThanks @pauldambra! - Dead clicks: a click on an<a>(or any element inside an<a>, including across shadow DOM) is no longer flagged as a dead click — the browser navigates / downloads / opens a new window and we can't observe that. Reuses autocapture's existing DOM walker for the ancestor walk. Direct clicks on<button>,<input>,<select>,<textarea>,<label>, and<form>(previously all skipped) are now eligible for dead-click detection: if their JS handler ran, the existing mutation / scroll / selection observers see the effect; if it didn't, dead-click correctly surfaces the bug. A broken<button>with no handler, or an<svg>icon inside one, will now flag — which is exactly the dead-click case we want to catch.(2026-05-18)
594ea11]:v1.373.5Compare Source
1.373.5
Patch Changes
221973eThanks @lucasheriques! - Surveys: submit open text questions with Cmd/Ctrl+Enter. The textarea still inserts a newline on plain Enter (native behaviour), matching the convention used by Slack, GitHub, Discord, and ChatGPT for multi-line inputs. Single-line "Other:" inputs continue to submit on plain Enter as before.(2026-05-15)
v1.373.4Compare Source
1.373.4
Patch Changes
4b895bfThanks @marandaneto! - Validate gzip request bodies at the browser send boundary and fall back to JSON if the outgoing body is not gzip data.(2026-05-12)
4b895bf]:v1.373.3Compare Source
1.373.3
Patch Changes
ad60818]:v1.373.2Compare Source
1.373.2
Patch Changes
223d925Thanks @marandaneto! - Validate native gzip output before sending requests and fall back when CompressionStream returns malformed data.(2026-05-11)
223d925]:v1.373.1Compare Source
1.373.1
Patch Changes
7d027bcThanks @dustinbyrne! - Prevent browser log capture from throwing when console arguments contain unreadable properties.(2026-05-11)
v1.373.0Compare Source
1.373.0
Minor Changes
4c0c7d9Thanks @williamchong! -capture()now accepts an optionaluuidonCaptureOptions.(2026-05-11)
Patch Changes
#3561
3511848Thanks @marandaneto! - Handle invalid persisted session replay config JSON gracefully(2026-05-11)
#3559
0a835faThanks @marandaneto! - Skip remote config background refreshes when no document is available.(2026-05-11)
Updated dependencies [
4c0c7d9,0a835fa]:v1.372.10Compare Source
1.372.10
Patch Changes
#3544
d120042Thanks @ksvat! - fix: stop session recording before destroying sessionManager inopt_out_capturing()withcookieless_mode: "on_reject". Previously, queued/throttled rrweb events (e.g. mousemove) could fire after the sessionManager was set toundefinedand throw[SessionRecording] must be started with a valid sessionManager. Also adds a defensive early-return inonRRwebEmitso any remaining late events bail out instead of throwing.(2026-05-07)
#3542
94a5ba0Thanks @TueHaulund! - Preserve<style>textContent when the browser's CSSOM serialization wouldemit empty longhands from
var()inside a shorthand. When a stylesheet hase.g.
padding: var(--p); padding-bottom: var(--pb);, browsers store theshorthand's longhands with empty token lists per the CSS Custom Properties
spec, and
CSSStyleRule.cssTextre-emits them aspadding-top: ; padding-right: ; padding-left: ;. The previous behavior replaced the<style>text with that corrupted output, silently dropping layout ruleson replay. We now detect the empty-longhand pattern and keep the original
textContent in that case. Affects users of any CSS-in-JS framework that
combines
var()with shorthands (Chakra UI v3, Panda CSS, Emotion, etc.).Same class of bug as rrweb-io/rrweb#1667. (2026-05-07)
Updated dependencies []:
v1.372.9Compare Source
1.372.9
Patch Changes
026e09dThanks @TueHaulund! - Pull in the canvas-manager fix from@posthog/rrweb0.0.61: skip canvassnapshots while the WebGL context is lost so transparent bitmaps don't
poison the worker's fingerprint dedup map and silently kill canvas
recording for the rest of the session. Also wraps
getCanvas()intry/catch so DOM/shadow-root traversal errors can't cancel the rAF
loop. See PR #3527 for context. (2026-05-05)
v1.372.8Compare Source
1.372.8
Patch Changes
255b273Thanks @marandaneto! - Gate survey translation logs behind SDK debug logging to avoid production console spam.(2026-05-04)
220cd61,255b273]:v1.372.7Compare Source
1.372.7
Patch Changes
8aee3d5]:v1.372.6Compare Source
1.372.6
Patch Changes
cf56753Thanks @lucasheriques! - Add translated survey rendering support in React Native and share survey translation logic through@posthog/core.(2026-05-01)
cf56753,04db756]:v1.372.5Compare Source
1.372.5
Patch Changes
c726aaeThanks @posthog! - fix(exceptions): avoid cross-origin property access when calling the previouswindow.onunhandledrejectionhandler(2026-04-29)
v1.372.4Compare Source
1.372.4
Patch Changes
5a6b2a5Thanks @posthog! - Fix copy autocapture when copying or cutting text from Shadow DOM or document fragment contexts.(2026-04-29)
v1.372.3Compare Source
1.372.3
Patch Changes
5b8efc3Thanks @lucasheriques! - Add browser survey translation rendering and language tracking.(2026-04-27)
v1.372.2Compare Source
1.372.2
Patch Changes
cba2570Thanks @veryayskiy! - Fix autofocus(2026-04-27)
v1.372.1Compare Source
1.372.1
Patch Changes
70508dfThanks @dustinbyrne! - Avoid usingBlob.stream()for native async gzip compression to prevent SafariNotReadableErrorstream failures.(2026-04-24)
70508df]:v1.372.0Compare Source
1.372.0
Minor Changes
eaa1322Thanks @veryayskiy! - You cannot write to a resolve ticket. Start a new one.(2026-04-24)
Patch Changes
v1.371.4Compare Source
1.371.4
Patch Changes
3c4fc1eThanks @fasyy612! - bump rrweb to 0.0.60(2026-04-24)
v1.371.3Compare Source
1.371.3
Patch Changes
61cf83eThanks @dustinbyrne! - Fix session recording in the full no-external browser bundles(2026-04-24)
daf028d]:v1.371.2Compare Source
1.371.2
Patch Changes
96f19b7Thanks @turnipdabeets! - Lift OTLP log serialization helpers from posthog-js into @posthog/core so theupcoming React Native logs feature consumes the same builders. Browser gains
two fixes as a side effect: NaN and ±Infinity attribute values no longer get
silently dropped during JSON encoding, and the scope.version OTLP field is
now populated with the SDK version (changes the server's instrumentation_scope
column from "posthog-js@" to "posthog-js@"). (2026-04-23)
96f19b7]:v1.371.1Compare Source
1.371.1
Patch Changes
2da17e8Thanks @marandaneto! - Classify SDK-owned persistence keys with an explicit event exposure policy so new internal persistence state must be intentionally marked as event-visible, hidden, or derived.(2026-04-23)
v1.371.0Compare Source
1.371.0
Patch Changes
#3432
1a8b727Thanks @richardsolomou! - refactor: rename__add_tracing_headerstoaddTracingHeaders. The__prefix signalled an internal/experimental option, but the config is a public API (documented for linking LLM traces to session replays).__add_tracing_headerscontinues to work as a deprecated alias on the browser SDK.Also exposes
patchFetchForTracingHeadersfrom@posthog/coreso non-browser SDKs can reuse the implementation. (2026-04-23)Updated dependencies [
1a8b727]:v1.370.1Compare Source
1.370.1
Patch Changes
6f19ce8Thanks @marandaneto! - fix(surveys): guard survey seen localStorage access(2026-04-22)
v1.370.0Compare Source
1.370.0
Minor Changes
922a1c1Thanks @hpouillot! - Add exception steps to error tracking (aka breadcrumbs)(2026-04-22)
Patch Changes
922a1c1]:v1.369.5Compare Source
1.369.5
Patch Changes
1a0b58d]:v1.369.4Compare Source
1.369.4
Patch Changes
d61bce1Thanks @sampennington! - fix(cookieless): start in cookieless mode when opt_out_capturing_by_default is set(2026-04-21)
v1.369.3Compare Source
1.369.3
Patch Changes
#3419
ea08727Thanks @haacked! - Reinstate$feature_flag_payloadsand$surveys_activatedin captured event properties.(2026-04-18)
#3416
3d8b2e2Thanks @feliperalmeida! - Updated dependencies: - protobufjs@7.5.5(2026-04-18)
Updated dependencies []:
v1.369.2Compare Source
1.369.2
Patch Changes
4a65604Thanks @dustinbyrne! - Add a preview flag for versioned browser lazy bundle asset paths.(2026-04-16)
4a65604]:v1.369.1Compare Source
1.369.1
Patch Changes
#3393
85ae4d9Thanks @haacked! - Exclude active feature flag payloads from event properties(2026-04-16)
#3392
00cd1ceThanks @haacked! - Fix unnecessary persisted config and activation properties (including product tours, surveys, and session recording config) added to captured events(2026-04-16)
Updated dependencies []:
v1.369.0Compare Source
1.369.0
Minor Changes
#3342
eea5260Thanks @ksvat! - Account for property filters on events in recording triggers for v2 triggers(2026-04-14)
#3281
b1fd228Thanks @ksvat! - Add session replay trigger groups handling (V2)(2026-04-14)
Patch Changes
v1.368.2Compare Source
1.368.2
Patch Changes
f1bea33Thanks @marandaneto! - Disable native gzip compression after a NotReadableError in the browser SDK(2026-04-14)
v1.368.1Compare Source
1.368.1
Patch Changes
d7c71b1Thanks @dmarticus! - Fix bootstrapped feature flags being overwritten by partial /flags response whenadvanced_only_evaluate_survey_feature_flagsis enabled(2026-04-14)
v1.368.0Compare Source
1.368.0
Minor Changes
3fcf5c4Thanks @jonmcwest! - Add posthog.captureLog() API for sending structured log entries to PostHog logs(2026-04-13)
Patch Changes
f5fe0a8Thanks @ksvat! - bump rrweb version(2026-04-13)
3fcf5c4]:v1.367.0Compare Source
1.367.0
Minor Changes
353be9aThanks @dustinbyrne! - feat: Add support for pre-loaded remote-config(2026-04-09)
Patch Changes
v1.366.2Compare Source
1.366.2
Patch Changes
575e354Thanks @lucasheriques! - Add a hover state to numeric survey rating options so they provide clearer pointer feedback before selection.(2026-04-09)
v1.366.1Compare Source
1.366.1
Patch Changes
802bf39Thanks @jabahamondes! - Re-evaluate consent persistent store when config changes to support cross-subdomain consent sharing(2026-04-09)
v1.366.0Compare Source
1.366.0
Minor Changes
b599672Thanks @veryayskiy! - Add customer side identification(2026-04-09)
Patch Changes
v1.365.5Compare Source
1.365.5
Patch Changes
c735b08]:v1.365.4Compare Source
1.365.4
Patch Changes
3939856Thanks @lucasheriques! - Expose the current question index on.survey-boxvia adata-question-indexattribute. This gives consumers rendering surveys via the API a reliable way to know which question is currently displayed without parsing input ids or class names — works for every question type, including link questions which render no input or rating element.(2026-04-08)
v1.365.3Compare Source
1.365.3
Patch Changes
dbdddcaThanks @pauldambra! - Bump @posthog/rrweb packages to 0.0.56, which includes:v1.365.2Compare Source
1.365.2
Patch Changes
c387f6dThanks @pauldambra! - perf(replay): reduce memory and CPU cost of event compression by caching gzipped empty arrays and eliminating redundant JSON.stringify for size estimation(2026-04-08)
c387f6d]:v1.365.1Compare Source
1.365.1
Patch Changes
57ee5b2]:v1.365.0Compare Source
1.365.0
Minor Changes
fc5589fThanks @dmarticus! - preserve $set_once semantics in local flag evaluation cache(2026-04-07)
Patch Changes
fc5589f]:v1.364.7Compare Source
1.364.7
Patch Changes
b25b689Thanks @dustinbyrne! - fix: send $groupidentify for new groups even when no properties are provided(2026-04-03)
react/react (react)
v19.2.8: 19.2.8 (July 21st, 2026)Compare Source
React Server Components
(#37087 by @eps1lon)
v19.2.7Compare Source
React Server Components
FormDataentries in Server Actions which regressed in 19.2.6 (@unstubbable #36566)v19.2.6Compare Source
React Server Components
v19.2.5Compare Source
React Server Components
omgovich/react-colorful (react-colorful)
v5.8.0Compare Source
ShadowRootwhen rendered inside one (via #232)v5.7.0Compare Source
onChangeEndcallback that fires when the user finishes changing a color (on mouse up, touch end, or arrow key up). Useful for undo/redo, saving to a database, or other expensive operations (via #230)v5.6.2Compare Source
dcastil/tailwind-merge (tailwind-merge)
v3.6.0Compare Source
New Features
postfixLookupClassGroupsoption to config to support Tailwind utilities where a slash is part of the full class name, like named container queriesDocumentation
Other
6b2499cFull Changelog: https://github.com/dcastil/tailwind-merge/compare/v3.5.0...v3.6.0
Thanks to @brandonmcconnell, @manavm1990, @langy, @roboflow, @syntaxfm, @getsentry, @codecov, a private sponsor, @block, @openclaw, @sourcegraph, @mike-healy and more via @thnxdev for sponsoring tailwind-merge! ❤️
v3.5.0Compare Source
New Features
Full Changelog: https://github.com/dcastil/tailwind-merge/compare/v3.4.1...v3.5.0
Thanks to @brandonmcconnell, @manavm1990, @langy, @roboflow, @syntaxfm, @getsentry, @codecov, a private sponsor, @block, @openclaw, @sourcegraph and more via @thnxdev for sponsoring tailwind-merge! ❤️
v3.4.1Compare Source
Bug Fixes
Full Changelog: https://github.com/dcastil/tailwind-merge/compare/v3.4.0...v3.4.1
Thanks to @brandonmcconnell, @manavm1990, @langy, @roboflow, @syntaxfm, @getsentry, @codecov, a private sponsor, @block, @openclaw, @sourcegraph and more via @thnxdev for sponsoring tailwind-merge! ❤️
privatenumber/tsx (tsx)
v4.23.1Compare Source
Bug Fixes
Performance Improvements
This release is also available on:
v4.23.0Compare Source
Bug Fixes
Features
This release is also available on:
v4.22.5Compare Source
Bug Fixes
This release is also available on:
v4.22.4Compare Source
Bug Fixes
This release is also available on:
v4.22.3Compare Source
Bug Fixes
This release is also available on:
v4.22.2Compare Source
Bug Fixes
This release is also available on:
v4.22.1Compare Source
Bug Fixes
This release is also available on:
v4.22.0Compare Source
Features
This release is also available on:
v4.21.1Compare Source
Bug Fixes
This release is also available on:
microsoft/TypeScript (typescript)
v6.0.3: TypeScript 6.0.3Compare Source
For release notes, check out the release announcement blog post.
Downloads are available on:
vitest-dev/vitest (vitest)
v4.1.10Compare Source
🐞 Bug Fixes
View changes on GitHub
v4.1.9Compare Source
🐞 Bug Fixes
importOriginalwith optimizer and query import [backport to v4] - by Hiroshi Ogawa, David Harris, Codexand Vladimir in #10546 (a5180)View changes on GitHub
v4.1.8Compare Source
🐞 Bug Fixes
cdpAPI whenallowWrite/allowExec: false[backport to v4] - by @hi-ogawa and Codex in #10450 (e4067)View changes on GitHub
v4.1.7Compare Source
🐞 Bug Fixes
View changes on GitHub
v4.1.6Compare Source
🐞 Bug Fixes
ToMatchScreenshotResolvePath- by @macarie and @sheremet-va in #10138 (31882)sequence.concurrent: truewith top-leveltest(..., { concurrent: false })+ depreactesequentialtest API and options - by @hi-ogawa, Codex and @sheremet-va in #10196 (2847d)🏎 Performance
View changes on GitHub
v4.1.5Compare Source
🚀 Experimental Features
instrumenteroption - by @BartWaardenburg and @AriPerkkio in #10119 (0e0ff)🐞 Bug Fixes
vi.defineHelpercalled as object method - by @hi-ogawa in #10163 (122c2)agentreporter tominimal- by @sheremet-va in #10157 (663b9)View changes on GitHub
v4.1.4Compare Source
🚀 Experimental Features
skipFullif agent detected - by @hi-ogawa in #10018 (53757)assertionas a public field - by @sheremet-va in #10095 (a120e)🐞 Bug Fixes
expect(..., message)consistent as error message prefix - by @hi-ogawa and Codex in #10068 (a1b5f)View changes on GitHub
v4.1.3Compare Source
🚀 Experimental Features
experimental.preParseflag - by @sheremet-va in #10070 (78273)browser.locators.exactoption - by @sheremet-va in #10013 (48799)TestAttachment.bodyEncoding- by @hi-ogawa in #9969 (89ca0)🐞 Bug Fixes
expect.pollinterval - by @hi-ogawa and Claude Sonnet 4.6 in #10022 (3f5bf)@vitest/coverage-v8and@vitest/coverage-istanbulas optional dependency - by @alan-agius4 in #10025 (146d4)defineHelperfor webkit async stack trace + update playwright 1.59.0 - by @hi-ogawa in #10036 (5a5fa)JestExtendError.contextfrom verbose error reporting - by @hi-ogawa in #9983 (66751)vitest- by @hi-ogawa and Codex in #10042 (691d3)View changes on GitHub
colinhacks/zod (zod)
v4.4.3Compare Source
Commits:
4c2fa95docs: use Zernio primary wordmark for gold sponsor logo2aeec83docs: prune lapsed gold sponsors and rebalance logo sizing7391be8docs: prune lapsed silver/bronze sponsors and add active ones2c70332docs: normalize bronze sponsor logos to github avatar pattern9195250docs: remove Mintlify from bronze sponsors (churned)b8dffe9docs: remove Numeric and Speakeasy (2+ missed monthly cycles)1cab693fix(v4): restore catch handling for absent object keys (#5937) (#5939)c2be4f8fix(v4): generalize optin/fallback to transform; restore preprocess on absent keys (#5941)f3c9ec04.4.31fb56a5docs: document release procedure in AGENTS.mdv4.4.2Compare Source
Commits:
0c62df0Clean up docs navigation and stale labels (#5901)20cc794chore: add security policy and refresh tooling deps6fbe07bfix(docs): heading anchor links now include the hash so it doesnt scoll all the way up, follows navbar logic (#5791)4bbed1bTighten discriminated union option typingbbac3e5Update PR guidance for agentscf0dc94Merge remote-tracking branch 'origin/main' into fix-discriminated-union-key-constraint292c894docs: add Zernio gold sponsor1fc9f31docs: document codec inversion1373c85docs: remove AI disclosure guidancee20d02bchore: ignore triage notese58ea4ddocs: test Zod Mini tab code heights905761adocs: document preprocess input type narrowingbf64bacchore: tighten test guidance in AGENTS.md8ec4e73chore: update play.ts scratch02c2bafMake z.preprocess defer optionality to inner schema (#5929)88015dffix(docs): drop deprecatedbaseUrlfrom tsconfigc59d4474.4.2v4.4.1Compare Source
Commits:
481f7beci: gate release publishing on full test workflow95ccab4test(v3): restore optional undefined expectationscede2c6fix(v4): reject tuple holes before required defaults (#5900)edd0bf0release: 4.4.1180d83ddocs: remove Jazz featured sponsorv4.4.0Compare Source
4.4.0
This is a minor release with a wide set of correctness and soundness fixes. Some fixes intentionally make Zod stricter, so code that depended on previously accepted invalid or ambiguous inputs may need small updates.
Potentially breaking bug fixes
Tuple defaults now materialize output values correctly
Fixed in #5661. Tuple parsing now more accurately reflects defaults, optional tails, explicit
undefined, and under-filled inputs. The headline behavior is that defaults in tuple positions now properly appear in parsed output.Trailing optional elements that are absent still stay absent; they are not filled with
undefined.But explicit
undefinedvalues supplied by the caller are preserved.When optional elements appear before later defaults, the parsed tuple is now dense so array operations behave predictably.
Tuple length errors are also more consistent now. Since
z.function()arguments are tuple-shaped, function input errors may look different.Required object properties with
z.undefined()Fixed in #5661, with follow-up coverage in
57d80a82. A property whose schema isz.undefined()is now treated as required. The key must be present, but its value may beundefined.Use
.optional()when the key itself may be absent.This also affects related
.catch(),.partial(),.default(), and.prefault()combinations that previously relied on missingz.undefined()keys being treated as optional.Safer
.merge()behavior with refinementsFixed in #5856. The
.merge()method now throws when the receiver has refinements, rather than silently producing ambiguous refinement behavior. Refinements from the second schema are preserved.JSON Schema
$defsentries no longer include redundantidFixed in #5759. JSON Schema conversion through
z.toJSONSchema()now strips redundantidfields from$defsentries. This is required for correctness in older JSON Schema dialects from before$idwas introduced: in those dialects,idchanges the resolution scope, so leaving it inside an extracted definition can make references resolve incorrectly. The removed value was redundant because the schema had already been extracted into$defs, so the definition key itself is the identifier. This may affect consumers that were reading those internalidfields directly.Other JSON Schema fixes in this release:
.describe(): #5797String validators are stricter
Base64 validation now rejects whitespace instead of allowing
atob()-style whitespace stripping. Fixed in #5888.Other string validator changes:
z.cuid()has been tightened, and CUID v1 is now deprecated. Fixed in #5880.z.httpUrl()now rejects malformed HTTP(S) URLs with a missing slash after the protocol. The underlyingURLconstructor normalizes inputs likehttps:/example.com, but Zod now rejects them instead of accepting the repaired URL. Fixed in #5672, related to #5284.Union paths are fixed in formatted errors
Two union-related error fixes landed:
z.treeifyError()andz.formatError(). Fixed in #5708 and60ff3987.ZodErroroutput.Other fixes
Record key transforms now run
Fixed in #5891. Record schemas now run transforms on record keys.
Related record fixes:
invalid_keyissues. Fixed in #5719.z.record(valueType)form works again. Fixed in0e960108.Metadata and input handling in
fromJSONSchema()Schema generation from JSON Schema now applies metadata more consistently across
enum,const,not,anyOf, and multi-type schemas. Fixed in #5758. It also rejects or normalizes more non-JSON-like inputs, including cyclic objects andBigInt. Fixed in87cf0f93.Codecs
Codec changes:
z.discriminatedUnion().encode()now works when the discriminator uses a codec. Fixed in #5769.Transform context
Transform callbacks now support
ctx.addIssue(). Fixed in #5699.Conditional
.superRefine()withwhenThe
whenoption was added for.superRefine(). Added in #5741, with related abort behavior fixed in #5681.Defaults for
MapandSetDefaults for
MapandSetare now cloned instead of shared across parses. Fixed in #5855.Empty unions
Empty
z.union([]),z.xor([]), and discriminated unions no longer crash at construction time. They construct and fail at parse time. Fixed in #5869.Floating-point multiples
Number
multipleOf()/step()validation is more accurate for decimal and exponent edge cases. Fixed in #5687 and #5793.Global config and
jitlessConfiguration fixes:
globalThis, improving behavior across mixed CJS/ESM module instances. Fixed in #5889.Prototype pollution hardening
Object catchall paths now skip
__proto__keys. Fixed in #5898.Performance improvements
Reduced memory usage from lazy-bound methods
Fixed in #5897. Classic builder methods are now lazy-bound through a shared internal prototype instead of eagerly attached per schema instance. This significantly reduces per-schema method allocation overhead, especially in codebases that construct many schemas. Detached methods continue to work:
Improved tree-shaking
Implemented in
195e8696and #5689. Top-level factory calls are annotated as pure, and generated stub package manifests now includesideEffects: false. This gives bundlers more room to remove unused Zod code.This is intended as the conclusive fix for a long-standing class of tree-shaking and bundle-size issues, especially in Next.js and Turbopack projects. The most visible symptom was that unused validators and locales could survive bundling even when importing from
zod/minior from a narrow subpath.Related reports include:
zod/minibundle-size reports: #5561, #5665, #4369, #4572Locales
Added or updated locale support:
Locale message text changed in some cases, which may affect snapshots.
Closed issues
The following issues were closed by PRs included in this release:
string.abort: truein.refine()checks withwhen.addIssueto transform context.deleteinfinalizeIssue.optionsto invalid discriminator errors.fromJSONSchema().idfrom$defsentries in JSON Schema output.z.custom()docs for v4 compatibility.discriminatedUnion().encode()with codec discriminators.multipleOf()validation.MapandSetdefaults..merge()refinement semantics with.extend().jitlessconfig in the eval probe.z.union([])andz.xor([]).z.record().Commits
44f6a03efix(locales): correct Georgian translation for 'string' to 'ველი' (#5655) by @tushargr0ver7b43bc64docs(ecosystem): add Hono Takibi (#5651) by @nakita628119376b9feat: add map support to Uzbek locale (#5599) by @uchkunr8fbf701etest: add edge case tests for boundary values (#5601) by @uchkunrf1f93c2bFix order of brand method examples in api.mdx (#5604) by @onurtemiz10105ee4docs: Fix typos in json-schema documentation (#5608) by @SaKaNa-Y2d367139feat: add hr translation (#5610) by @vuki65654902cb7chore: update pullfrog.yml workflow89ba70f2chore: add sideEffects false to stub package.json for tree-shaking (#5689) by @jesse-holdeneaa3c2c3Update positive checks to use alias.gt(0)in the docs (#5671) by @Fredkiss365f1f404fix typo (#5676) by @Nikita0x5b574501fix: respectabort: truein.refine()for checks withwhenfunction (#5681)539de140docs: fix README links for async refinements/transforms (#5682) by @pavan-sh46cd10e7docs: fix README anchor links for async APIs (#5683) by @pavan-sh55747b3cRemove deprecated downlevelIteration option (#5684) by @RyanCavanaugh3a818de1fix(v4): handle multi-digit exponents in floatSafeRemainder (#5687) by @shakecodeslikecray3cd45ebcfix(v4): add strict validation tohttpUrl()(#5672) by @LuckySilver00217d98c909add Sanity as silver sponsor and Mintlify as bronze sponsorc7805073move Sanity and Mintlify to top of sponsor listsbee2dc8ddocs: movez.iso.time()from format to pattern section (#5696)2f8414bcfix: add missing addIssue to transform context (#5699) by @F-A-N-D-Ed3c0ec87docs: add note about removed.errorsalias in v4 changelog (#5705) by @togami2864fa338a3bfix(v4): JSON schema min/max intersection for draft-04 and openapi-3.0 (#5700) by @ebroder3473b288chore: bump zshy to ^0.7.1cc8f9b7cdocs: improve README wording and fix typos (#5736) by @vedanshshettif5336717feat: add json-up to ecosystem (#5740) by @mrspence60ff3987fix(v4): preserve parent path when treeifying nested union/key/element issues08b14b51perf: avoiddeleteinfinalizeIssueto keep V8 fast mode (#5718)9cf868d2fix(v4): treeify error nested union bug (#5708) by @dstashevskyi28f39a6dAdd JSONType export (#5709) by @RobinVdBroeck65fab33efeat: allowwhenparameter in.superRefine()(#5741) by @vilvai7f87df1erefactor(v4): remove unnecessary type assertions (#5720) by @chisaki66518f15ddPreprocess is not deprecated (#5721) by @mxdvl2e5b23dcfix: add options to invalid discriminator errors (#5723) by @Danielchinasa7f789deffix: skip non-enumerable properties in record validation (#5719) by @veeceeyee15fa19docs: add AGENTS notes for JSDoc, PR comments, and PR worktree workflowf52b4d28Revert "docs: improve README wording and fix typos (#5736)"ddb41391test: increase timeout for redos checker in datetime.test.ts (#5744) by @rishadaufabc07e459docs: fix doc (#5745) by @xgaiae06af5deUpdate Hey API description (#5748) by @mrlubos28c156e2fix: apply description and default metadata to enum, const, and not schemas in fromJSONSchema (#5758) by @mibragimovf457edf1Fix grammar in CONTRIBUTING.md (#5765) by @siekmang411f6c64fix(v4): resolve stack overflow in toJSONSchema for recursive lazy with describe (#5797) by @Hassad67445dd421edocs: add tone guidelines for issue and PR comments to AGENTS.mdddd20a30test: align optional property assertions with actual inferred typesa1cf8a93docs: update z.custom example for v4 compatibility (#5763) by @andrewdameliob6a3b336fix: strip redundant id from$defsentries in toJSONSchema (#5759) by @mibragimovc7a8ccc0fix: discriminatedUnion encode() with codec discriminator (#5769) by @mahmoodhamdi87cf0f93fix(fromJSONSchema): normalize input via JSON round-trip7163e6f2feat: add.invert()method to ZodCodec (#5770) by @mahmoodhamdib59b9b13fix: replace.defaultwith.prefault(#5776) by @alanskovrlj93bba686docs: add Zod AOT to ecosystem page (#5806) by @wakita1810092564caa4fix(docs): add custom 404 page with proper theme support (#5779) by @WolfieLeader5b7ed214fix: correct multipleOf float validation using tolerance-based comparison (#5793) by @cyphercodescc9139d2docs: fix self-referencing schema in refine when() example (#5812) by @claygeo0e960108fix(v4): support v3-style single-arg z.record(valueType)41b25af9docs(agents): refine PR comment tone guidance4c03c20dUpdate Italian locale error messages for validation (#5852) by @pastorello37ac1ba0fix(fr): translate issue.origin in too_big/too_small errors (#5845) by @Ouaziz-chedli345be203docs: add validex to ecosystem (#5848) by @chiptoma3c1f32bdfeat(locales/en): handle instanceof and add comprehensive locale tests888e52bbfeat(locales): add Greek (el) locale (#5840) by @saileshbrobf6d99edRevert "feat(locales/en): handle instanceof and add comprehensive locale tests"e8196a8dfix(resolution): align expected fr message with translated localeb6b12882correct logic for validating length (#5843) by @nameearly34f60159fix(v4): clone Map and Set in shallowClone to prevent shared state across.default()parses (#5855) by @artur-seppa91a7d0d1fix(v4): reject whitespace in z.base64() to close atob bypass23edf484Revert "fix(v4): reject whitespace in z.base64() to close atob bypass"15cafa13fix(v4): throw on.merge()receiver with refinements; preserve refinements from second schema (#5856) by @solssak584b1089fix(v4): reject whitespace in z.base64() to close atob bypass (#5888) by @colinhacksb9b62c65fix(core): honourjitlessconfig inallowsEvalprobe (#5864) by @doksonfffe99bdfix(v4): construct empty unions instead of crashing (#5869) by @tjenkinson285bde7ffeat(core): shareglobalConfigacross module systems viaglobalThis(#5889) by @colinhacks195e8696perf(v4): mark top-level factory calls as/*@​__PURE__*/for tree-shaking61d7bedbfix(v4): apply key schema transforms in z.record() (#5891) by @colinhacks45acd2adci(release): switch to npm trusted publishing via OIDC (#5890) by @colinhacks476ae243Tighten cuid() regex and deprecate CUID v1 (#5880) by @colinhacks6217527edocs(agents): document push-to-main footgun and version-bump rule (#5883) by @colinhacks757f0b0ffix(v4): apply util.Writeable in strictObject/looseObject for shape display parity (#5882) by @colinhacksfa4a3740fix(v4): apply util.Writeable in mini object constructors and extend/safeExtend/partial/required (#5895) by @colinhacksebc8287cfix(v4): emit falsy prefault values in toJSONSchema (#5893) by @mixelburg8fcb71a5perf(v4): lazy-bind builder methods to shared internal prototype (#5897) by @colinhacks76e8f706fix(v4): skip__proto__key in object catchall (#5898) by @colinhacksf0b0608eecosystem:eslint-plugin-zod-xiseslint-plugin-zodnow (#5637) by @marcalexiei0b5c3bc2docs: fix refinements examples in api.mdx (#5649) by @playoffthecuff327e152edocs(agents): refine PR comment tone guidance further57d80a82test(v4): pin object/tuple key optionality through optout propagationf19860f1fix: preserve context immutability in parse functions (#5632) by @bgk614ec979ad7feat: add Romanian (ro) locale (#5657) by @tushargr0verb6066b3efix(v4): align object and tuple optionality handling (#5661) by @Cyjin-janiad0b8271ci: update release workflow for trusted publishing6db607befix(release): keep JSR manifest publishablef778e02abuild: bump zshy for JSR wildcard exportsConfiguration
📅 Schedule: (in timezone Europe/Berlin)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR has been generated by Mend Renovate.
99d5ddf5d8toc4bd5c25b8c4bd5c25b8to76d08a134a76d08a134ato2f4ccd609d2f4ccd609dtoc1f9244bf6