Commit Graph

16311 Commits

Author SHA1 Message Date
Jaanus 2a4be6ae96 perf: avoid OR-join on dependent_features in feature search
The dependency lookup joined dependent_features with an OR predicate
(parent = features.name OR child = features.name). Postgres cannot hash an
OR join condition, so it planned a nested loop with a BitmapOr index probe
per outer row -- and the outer side is the already fanned-out row set, so it
probed once per (feature x environment x tag x strategy x segment) row rather
than once per feature.

Replacing the OR with a UNION ALL derived table makes the predicate a plain
equality, which plans as a merge join.

Measured on a seeded dataset of 20k flags (18k active) x 5 environments,
120k strategies, 30k tags and 800 dependencies:

  shared buffer hits   9,796,910 -> 15,105   (648x fewer)
  query time              ~16.4s -> ~3.6s    (4.5x faster)

Row multiplicity and the resulting dependency value are unchanged: verified
with EXCEPT ALL in both directions across the whole features table, and by
the existing feature search and dependent features e2e suites.
2026-09-04 10:51:05 +03:00
Mikhail Alabugin f50c86c538 docs: fix dead Code Kitchen podcast link in README (#12579)
The Code Kitchen podcast episode link is dead — Fireside's episode-share
feature is gone (`share.fireside.fm` 404s entirely). The episode
("Feature flags with Unleash", with Egil and Ivar Østhus) is live on the
podcast's site, which embeds the identical Fireside episode id in its
player: `https://divanv.com/podcast/` (HTTP 200).
2026-09-04 08:46:14 +02:00
Fredrik Strand Oseberg edc7c2988a feat: make the winning survey deterministic across page loads
Guarantee survey order
2026-09-04 08:44:00 +02:00
Alexandra 316e898206 fix: cross-project variant overwrite
Issue: A project member may be able to overwrite another project's
feature environment variants and payloads because the target feature is
not properly bound to the project authorization scope.

Fix: All variant mutation paths should validate if feature belongs to
project

Intends to fix both
[EG-4687](https://linear.app/unleash/issue/EG-4687/cross-project-environment-variants-overwrite-ghsa-639f-52mg-grrc)
and
[EG-4685](https://linear.app/unleash/issue/EG-4685/cross-project-overwrite-via-variants-batch-ghsa-v6pr-g426-4xc4)
2026-09-04 08:05:27 +02:00
renovate[bot] a7efb00777 chore(deps): update dependency nodemailer to v9.0.6 (#12606)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [nodemailer](https://nodemailer.com/)
([source](https://redirect.github.com/nodemailer/nodemailer)) | [`9.0.5`
→ `9.0.6`](https://renovatebot.com/diffs/npm/nodemailer/9.0.5/9.0.6) |
![age](https://developer.mend.io/api/mc/badges/age/npm/nodemailer/9.0.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nodemailer/9.0.5/9.0.6?slim=true)
|

---

### Release Notes

<details>
<summary>nodemailer/nodemailer (nodemailer)</summary>

###
[`v9.0.6`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#906-2026-08-27)

[Compare
Source](https://redirect.github.com/nodemailer/nodemailer/compare/v9.0.5...v9.0.6)

##### Bug Fixes

- **addressparser:** recover the addr-spec from an angle-addr holding
whitespace
([e989a22](https://redirect.github.com/nodemailer/nodemailer/commit/e989a22ca4f5161929bf37be8fb07de635016fa7))
- harden copies of user supplied keys and URL fetching
([2f667f4](https://redirect.github.com/nodemailer/nodemailer/commit/2f667f4272cb2d7cb479b2e3903ab10600fc0eae))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC42MS4zIiwidXBkYXRlZEluVmVyIjoiNDQuNjEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-04 01:33:57 +00:00
renovate[bot] ad21c7d26c chore(deps): update dependency @testing-library/react to v16.3.3 (#12605)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@testing-library/react](https://redirect.github.com/testing-library/react-testing-library)
| [`16.3.2` →
`16.3.3`](https://renovatebot.com/diffs/npm/@testing-library%2freact/16.3.2/16.3.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2freact/16.3.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2freact/16.3.2/16.3.3?slim=true)
|

---

### Release Notes

<details>
<summary>testing-library/react-testing-library
(@&#8203;testing-library/react)</summary>

###
[`v16.3.3`](https://redirect.github.com/testing-library/react-testing-library/releases/tag/v16.3.3)

[Compare
Source](https://redirect.github.com/testing-library/react-testing-library/compare/v16.3.2...v16.3.3)

##### Bug Fixes

- Avoid act() re-entrant when dispatching events
([#&#8203;1468](https://redirect.github.com/testing-library/react-testing-library/issues/1468))
([20ce75f](https://redirect.github.com/testing-library/react-testing-library/commit/20ce75f2907ca0e5c5a8ae595c0e9a4e368c7800))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC42MS4zIiwidXBkYXRlZEluVmVyIjoiNDQuNjEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-04 01:33:45 +00:00
Gastón Fournier cdbfd34825 feat: strenghten the requirement around appName (#11628)
## About the changes

This PR prevents malformed client registrations with an empty `appName`
from reaching scheduled persistence and producing warnings such as
`Failed to register clients The query is empty`.

Validation now reflects whether an endpoint handles one application or
an aggregate of independent applications: single-application requests
are rejected at the API boundary, while malformed entries in an
aggregated Edge payload are ignored without discarding unrelated data.

## Validation strategy

### Single-application routes

- `POST /api/client/metrics` requires a non-empty `appName` in its
OpenAPI schema. Validation happens before instance registration, so
malformed registrations do not enter the scheduled persistence buffer.
- `POST /api/client/register` uses the same non-empty OpenAPI
constraint. Empty names were already rejected by the downstream
registration schema; this moves the rejection to the API boundary.
- `POST /api/frontend/client/register` is unchanged. It does not persist
client registrations through this path.

### Aggregated bulk route

`POST /api/client/metrics/bulk` can carry applications, usage metrics,
impact metrics, and seen tokens from multiple downstream clients.

The request schema still requires `appName` to be present on application
and usage-metric entries. After envelope validation, the controller:

- skips application entries whose `appName` is falsey;
- skips app-associated usage metrics whose `appName` is falsey;
- continues processing valid applications, usage metrics, impact
metrics, and seen tokens;
- returns success when the remaining work succeeds.

This prevents one malformed Edge entry from determining the result of
otherwise independent work in the same payload.

### Scheduled-persistence guard

`ClientInstanceService.bulkAdd()` also filters registrations with a
falsey `appName` before constructing application and instance upserts.
This avoids empty upsert queries for all-invalid batches and prevents
malformed entries in mixed batches from being persisted.
2026-09-03 18:34:00 +02:00
Mateusz Prusaczyk 0429c292c9 fix(flag-status): no tooltip on healthy and unknown flag status
# Description

Follow-up to #1692.

The `–` shown for a healthy flag came with a dotted underline and a "No
issues detected" tooltip. The underline invites a hover that then
explains nothing. It absorbs attention unnecessarily.

- **`ok`** — still shows `–`, now as plain text: no tooltip, no dotted
underline.
- **`unknown`** (no lifecycle data) — shows `N/A` instead of `–`, also
without a tooltip or underline.

Every other status keeps its tooltip unchanged.

Discussed in [this Slack
thread](https://unleash-internal.slack.com/archives/C046LV6HH6W/p1788432907560119?thread_ts=1788429793.320939&cid=C046LV6HH6W).

# Implementation note

`FeatureStatusText.description` is renamed to `tooltip`, and its absence
now means "render no tooltip" rather than "fall back to the label". The
two statuses that relied on that fallback for their truncated labels —
`milestone` and `noProductionEnvironments` — now set `tooltip`
explicitly, so their rendering is unchanged.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 14:01:01 +00:00
Øystein Lorentzen Vesth 75a42cef56 feat(integrations): surface project-scoped Slack integrations in project settings
[Linear
project](https://linear.app/unleash/project/integrations-slack-integration-project-level-284041fa76da/overview)
Flag: `slackIntegrationProjectLevel`

**Description**

Adds an Integrations tab under project settings, behind the
slackIntegrationProjectLevel flag. A Slack integration appears there
when the project is the only one it sends events to; instance-wide and
shared ones stay on /integrations.

Reuses ConfiguredIntegrations for the list, made scope-aware via
useOptionalPathParam. Integrations can be created and edited from either
place, with the projects selector hidden in a project since the scope is
implied. No new endpoints, permissions or schema changes, writes still
go through the existing addon API behind CREATE_ADDON/UPDATE_ADDON.

Kept the possibility of adding the api key on project settings since you
must have UPDATE/CREATE_ADDON permission anyways, and it just creates a
integration similar to what is already in integrations. This PR does not
really fix the "*Then each project/team that wants an own integration so
it looks like slack is set up x times which can lead to some
confusion.*" mentioned in the linear issue.

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 14:28:44 +02:00
Mateusz Prusaczyk 367b3295a3 feat(strategies): simpler strategy setup - part 1 : add a flag and placeholder screen
[Related
ticket](https://linear.app/unleash/project/ux-make-flag-setup-options-simpler-81f10792c2d5/overview)

Simpler strategy flow - this is just a first step - define a flag and
create a dummy placeholder

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 11:53:58 +00:00
Gergo Kekesi 122c21982b feat(tracking): track project access journeys
- Assign, role-change and remove emit the full lifecycle via
`useMutationTracking`
- Role names captured (comma-joined), `groupName` for group targets only
— user identities never emitted
- Opened intents at the assign button and row edit icon; the form's
Cancel button emits its `cancel-button` dismissal (it bypasses the
modal's own dismiss path)
- `PermissionIconButton` Link mode accepts `onClick` to allow tracking
alongside navigation
2026-09-03 10:52:27 +01:00
Gergo Kekesi 7804942a5a feat(tracking): track project settings journeys
- Project archive/delete emit opened at the button, submitted at dialog
confirm, succeeded/failed on settle via `useMutationTracking`
- General settings save emits the full lifecycle with changed-field
booleans
- Link template deletion and settings sub-menu navigation tracked
- **Live-series change:** `project-navigation` eventType values switch
from tab titles (`'Change requests'`, `'Event log'`, …) to tab ids
(`'change-request'`, `'logs'`, …), and the previously mis-guarded
`'Overview'` rows stop entirely (the old `tab.title !== 'Flags'` guard
never matched) — dashboards keyed on the old values need updating
- Stacked on #1562; the shared mutation-tracking hook comes from #1576
(foundations)
2026-09-03 10:42:53 +01:00
Gergo Kekesi 1186f04744 feat(tracking): track flag row actions and lifecycle
- Stale-toggle, delete, revive and archive journeys emit the full
lifecycle via `useMutationTracking`, with flag `name` on every row
- `FeatureArchiveDialog` gained
`onArchiveStart`/`onArchiveError`/`tracking` seams — archive was
previously silent on the project list and had no action axis on the
feature view
- Clone tracked as an opened intent on both surfaces; favorites and
lifecycle uncomplete tracked with names
- name-copied clipboard row carries the flag name
- The archive dialogs **are** tagged for dismissal tracking in this
branch: both `FeatureArchiveDialog` call sites carry `tracking={{ event:
'flag-actions', type: 'archived' }}`. Mark-completed remains untagged.

### Live-series change: `feature-lifecycle` / `uncomplete`

This is a breaking shape change for any existing chart or query on that
series. `uncomplete` previously emitted a single row on success with no
`action` property. It now emits a `submitted` row on every attempt plus
a `succeeded` or `failed` row, so the series gains an `action` axis and
roughly doubles in row count (tripling on the failure path, which also
carries the request-failure properties). Anything counting raw
`uncomplete` rows as "successful uncompletes" must now filter on `action
= 'succeeded'`.
2026-09-03 10:33:58 +01:00
Gergo Kekesi 5a568d4ebe feat(tracking): track context field journeys
- Context field create/edit/delete emit the full mutation lifecycle via
`useMutationTracking` with `name`, exact `legalValuesCount`, stickiness
and changed-field booleans
- Delete icon emits `opened`; dialogs carry dismissal `tracking` props

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 10:05:00 +01:00
Mateusz Prusaczyk 8fb8bc4c32 fix: Feature status tooltip
# Description
[Related Linear
ticket](https://linear.app/unleash/project/ux-small-improvements-tooltip-for-status-in-flags-overview-7bf140e7e3e1/overview)
[Related
docs](https://docs.getunleash.io/concepts/feature-flags#flag-status)

Add a tooltip which provides more context to the status.

A complete table of statuses, labels and descriptions

| Stage | Condition | Label | Tooltip description |
| --- | --- | --- | --- |
| _any_ | `lifecycle` is missing | `–` | We are lacking data about this
flag |
| initial (define) | Any non-production environment is enabled | No
traffic | A non-production environment is enabled |
| initial (define) | No non-production environment has strategies | No
strategies | No strategies in non-production environment |
| initial (define) | No non-production environment has enabled
strategies | No enabled strategies | All strategies in non-production
environments are disabled |
| initial (define) | Non-prod strategies exist and are enabled, but no
non-production environment is enabled | Paused* 👇 | All non-production
environments are disabled |
| pre-live (develop) | No environment at all is enabled | Paused | No
environment enabled |
| pre-live (develop) | At least one environment is enabled | `–` | No
issues detected |
| live (production) / completed (cleanup) | No production environments
exist | No production environments | _(none — tooltip falls back to the
label)_ |
| live (production) / completed (cleanup) | Multiple production
environments, none enabled | Paused | Production environments are
disabled |
| live (production) / completed (cleanup) | Multiple production
environments, some but not all enabled | In {n} out of {total}
production environments | Enabled in: {env1, env2, …} |
| live (production) / completed (cleanup) | First production environment
has no strategies | No strategies | No strategies added in the
production environment |
| live (production) / completed (cleanup) | First production environment
is disabled | Paused | Production environments are disabled |
| live (production) / completed (cleanup) | First production environment
is in a named milestone | Milestone: {name} ({order} of {total}) |
_(none — tooltip falls back to the label)_ |
| live (production) / completed (cleanup) | First production environment
is in an unnamed milestone | Milestone {order} of {total} | _(none —
tooltip falls back to the label)_ |
| live (production) / completed (cleanup) | Production is enabled, has
strategies, no milestones | `–` | No issues detected |
| archived (archived) | Always — no archived-specific branch exists |
`–` | No issues detected |

*see below:
**key change to discuss** - previously the initial state didn't have a
fall-through case (the "else"). Now it has and goes to pause. To be
discussed whether that makes sense. E.g. it may happen if you have a
flag
- in define phase
- development env is disabled
- production env is enabled 

# UI changes
## Before
<img width="1620" height="1230" alt="Screenshot 2026-09-03 at 08 57 35"
src="https://github.com/user-attachments/assets/de46bb0e-76b4-452c-8220-7b96c5f3030d"
/>


## After
<img width="1245" height="436" alt="Screenshot 2026-09-02 at 16 18 53"
src="https://github.com/user-attachments/assets/ceae8c74-07c2-441b-9af2-bee34b92d1ad"
/>

<img width="1240" height="465" alt="Screenshot 2026-09-02 at 16 18 51"
src="https://github.com/user-attachments/assets/8c7dd2c8-62e2-4a7a-a514-c3b22b26105b"
/>
2026-09-03 10:51:05 +02:00
Gergo Kekesi e3f25356cf feat(tracking): track segment journeys
- Segment create/edit/delete emit the full mutation lifecycle via
`useMutationTracking` with `name`/`id` and constraint shape
(contextName/operator/valueCount + `constraintValuesCount` total) —
constraint values stay counts
- `viaChangeRequest` marks the CR route; edit rows carry changed-field
booleans
2026-09-03 09:43:34 +01:00
Gergo Kekesi 96941df3fd feat(tracking): mutation tracking hook and form template events
- `useMutationTracking`: one hook enforcing the mutation lifecycle
vocabulary (opened/submitted/succeeded/failed), route-derived `scope`
and `eventType` on every row — the convergence target the whole stack
shares
- `FormTemplate` emits `docs-opened` (target href, auto path) on every
form's documentation link and `api-command-copied` (clipboard settle) on
the curl snippet — one emit site covers every create/edit form
- Dismissal-hook and provider touch-ups ride along
- Root of the tracking stack
2026-09-03 09:37:01 +01:00
renovate[bot] 5c06c74a06 chore(deps): update dependency js-yaml to v4.3.2 (#12604)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [js-yaml](https://redirect.github.com/nodeca/js-yaml) | [`4.3.1` →
`4.3.2`](https://renovatebot.com/diffs/npm/js-yaml/4.3.1/4.3.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/js-yaml/4.3.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/js-yaml/4.3.1/4.3.2?slim=true)
|

---

### Release Notes

<details>
<summary>nodeca/js-yaml (js-yaml)</summary>

###
[`v4.3.2`](https://redirect.github.com/nodeca/js-yaml/compare/4.3.1...4.3.2)

[Compare
Source](https://redirect.github.com/nodeca/js-yaml/compare/4.3.1...4.3.2)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC41Ny4zIiwidXBkYXRlZEluVmVyIjoiNDQuNTcuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-03 01:06:59 +00:00
irstavr 3db0a1516e feat(login): add user-agent in login/logout events - EG-4692
### Issue


Customer needs the `User-Agent` header present in the login/logout events we
replicate to S3. Access logs already have it, login events didn't.

### In this PR:

Behind a new Feature Flag 'UNLEASH_EXPERIMENTAL_LOGIN_HISTORY_USER_AGENT', the login and logout events now record the `User-Agent` header of the request that triggered
them. It shows up in the login history API, the CSV download, and the S3
export, but it's hidden in the login history UI. (As requested)

As `User-Agent` is an optional header, the field is nullable. a client
that sends none still gets a null field. Same for old login events that
do not support this change.

All four providers (simple, SAML, OIDC auth and the logout middleware)
hand the `request` itself (with the user-agent) to
`LoginHistoryService.create()` instead of just the IP as it was till
now.

Everything else happens in `resolveUserAgent()` in the service:
-strips non-printable characters
-trims to 512 chars
-and skips the whole thing when the flag is off



### Notes 

For the review, some extra caveats alongside:

-drop the `user-agent` (and not only the `ip`) when we retry on a
db-failure
-added a trimming of escape chars for the CSV export that was missing



### Testing

Run
`$ UNLEASH_EXPERIMENTAL_LOGIN_HISTORY_USER_AGENT=true pnpm
dev:enterprise`

navigated to `localhost:4242/api/admin/logins` 

📸  we now see the "user-agent" info in the events object
<img width="1113" height="836" alt="Screenshot 2026-09-02 at 14 55 44"
src="https://github.com/user-attachments/assets/1b99cd44-6aba-4cbe-842a-215f827e4e8f"
/>

it is still not visible on the UI, on the login history
<img width="1376" height="591" alt="Screenshot 2026-09-02 at 14 58 36"
src="https://github.com/user-attachments/assets/231b87d1-6925-4231-ace9-ad3f2ded8747"
/>

but part of the CSV downloaded file:
<img width="1419" height="581" alt="Screenshot 2026-09-02 at 14 59 22"
src="https://github.com/user-attachments/assets/f3688456-91e7-4e26-a575-e97e214583f4"
/>

Co-Authored-By: irstavr <irstavr@gmail.com>
2026-09-02 16:15:01 +02:00
Fredrik Strand Oseberg 296e99f92c feat: cap how often an ignored survey is shown
The runner records one impression per survey per page load; a survey
shown 3 times without being submitted or closed stops appearing. An
ignored card must not nag forever, but one glance shouldn't burn it
either. Malformed impression storage fails open, matching the other
frequency-control keys.
2026-09-02 14:36:33 +02:00
Øystein Lorentzen Vesth d5ac679d16 chore: Adds Slack integration project level flag -> slackIntegrationProjectLevel 2026-09-02 11:37:58 +02:00
Krzysztof (Kris) Kula 82725ceddb update sanitize-html to 2.17.7 2026-09-02 09:37:41 +00:00
Krzysztof (Kris) Kula 6ea3527810 chore: close project onboarding when it's done
I think we were showing the project setup for too long. This change
should be trying to close it for you more actively.


<img width="1421" height="256" alt="Screenshot 2026-09-01 at 16 37 13"
src="https://github.com/user-attachments/assets/9519b89c-97a8-4f48-81ce-3fed6088775d"
/>
2026-09-02 11:00:08 +02:00
Krzysztof (Kris) Kula e5d33a64b7 update browserlist
https://github.com/Unleash/unleash/security/dependabot

for OSS and Enterprise
2026-09-02 10:59:55 +02:00
Mateusz Kwasniewski 7c596a77ef feat: analytics has info about automation type used in template
Sample json sent to plausible with new `timeAutomations` and `exposureAutomations`, counting the amount of time based and exposure based automations in the milestones:

```
{
    "props": {
        "eventType": "edit-template",
        "template": "Canary",
        "scope": "project",
        "project": "payments",
        "timeAutomations": 2,
        "exposureAutomations": 1
    }
}
```

---------

Co-authored-by: Kamala Rocci <kamala.rocci@getunleash.io>
2026-09-02 10:04:31 +02:00
Anniken Østdahl 810765311f Adjust input fields and margins (#12597)
Design adjustments made via the UX Tweak extension.

Files changed:
-
frontend/src/component/releases/ReleasePlanTemplate/TemplateForm/TemplateForm.tsx
-
frontend/src/component/releases/ReleasePlanTemplate/TemplateForm/MilestoneList/MilestoneCard/MilestoneCard.tsx

🤖 Drafted from the UX Tweak extension — please review.

---------

Co-authored-by: Anniken Østdahl <6595978+nikken@users.noreply.github.com>
2026-09-02 09:21:02 +02:00
renovate[bot] 80a3d4da47 chore(deps): update dependency @vitejs/plugin-react to v6.1.0 (#12600)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@vitejs/plugin-react](https://redirect.github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#readme)
([source](https://redirect.github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react))
| [`6.0.5` →
`6.1.0`](https://renovatebot.com/diffs/npm/@vitejs%2fplugin-react/6.0.5/6.1.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@vitejs%2fplugin-react/6.1.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vitejs%2fplugin-react/6.0.5/6.1.0?slim=true)
|

---

### Release Notes

<details>
<summary>vitejs/vite-plugin-react
(@&#8203;vitejs/plugin-react)</summary>

###
[`v6.1.0`](https://redirect.github.com/vitejs/vite-plugin-react/blob/HEAD/packages/plugin-react/CHANGELOG.md#610-2026-08-19)

[Compare
Source](https://redirect.github.com/vitejs/vite-plugin-react/compare/68c0cb8796ce18bd049c3d05c5210eaf0617eac0...39b31735bf79c2dd380eedaba7ed849256f92a29)

##### Add experimental native React Compiler support
([#&#8203;1419](https://redirect.github.com/vitejs/vite-plugin-react/pull/1419))

Add experimental native React Compiler support.

You can use it by installing `oxc-transform-react` and enabling it via
the `compiler` option:

```sh
npm install -D oxc-transform-react
```

```js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [
     react({ compiler: true })
  ]
})
```

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-02 03:17:45 +00:00
renovate[bot] ca1763351f chore(deps): update dependency @unleash/toolbar to v1.2.0 (#12599)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@unleash/toolbar](https://redirect.github.com/Unleash/toolbar) |
[`1.1.1` →
`1.2.0`](https://renovatebot.com/diffs/npm/@unleash%2ftoolbar/1.1.1/1.2.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@unleash%2ftoolbar/1.2.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@unleash%2ftoolbar/1.1.1/1.2.0?slim=true)
|

---

### Release Notes

<details>
<summary>Unleash/toolbar (@&#8203;unleash/toolbar)</summary>

###
[`v1.2.0`](https://redirect.github.com/Unleash/toolbar/releases/tag/v1.2.0)

[Compare
Source](https://redirect.github.com/Unleash/toolbar/compare/v1.1.1...v1.2.0)

### What's Changed

#### New features

- feat: keyboard-first operation and accessibility overhaul by
[@&#8203;alexcasalboni](https://redirect.github.com/alexcasalboni) in
[#&#8203;63](https://redirect.github.com/Unleash/toolbar/pull/63)
- fix: replace the focus trap with a tether back to the summoning
element by
[@&#8203;thomasheartman](https://redirect.github.com/thomasheartman) in
[#&#8203;64](https://redirect.github.com/Unleash/toolbar/pull/64)
- feat: announce search result counts to assistive tech by
[@&#8203;thomasheartman](https://redirect.github.com/thomasheartman) in
[#&#8203;66](https://redirect.github.com/Unleash/toolbar/pull/66)
- Chore: move reset buttons to bottom by
[@&#8203;thomasheartman](https://redirect.github.com/thomasheartman) in
[#&#8203;67](https://redirect.github.com/Unleash/toolbar/pull/67)

#### Dependencies updates

- Bump next from 16.2.10 to 16.2.12 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;57](https://redirect.github.com/Unleash/toolbar/pull/57)
- Bump next from 16.2.9 to 16.2.11 in /examples/nextjs by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;59](https://redirect.github.com/Unleash/toolbar/pull/59)
- Bump brace-expansion and eslint in /examples/nextjs by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;58](https://redirect.github.com/Unleash/toolbar/pull/58)
- Bump
[@&#8203;angular/compiler](https://redirect.github.com/angular/compiler)
from 21.2.18 to 21.2.19 in /examples/angular by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;62](https://redirect.github.com/Unleash/toolbar/pull/62)
- Bump [@&#8203;angular/core](https://redirect.github.com/angular/core)
from 21.2.18 to 21.2.19 in /examples/angular by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;61](https://redirect.github.com/Unleash/toolbar/pull/61)
- Bump
[@&#8203;angular/common](https://redirect.github.com/angular/common)
from 21.2.18 to 21.2.19 in /examples/angular by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;60](https://redirect.github.com/Unleash/toolbar/pull/60)

#### New Contributors

- [@&#8203;thomasheartman](https://redirect.github.com/thomasheartman)
made their first contribution in
[#&#8203;64](https://redirect.github.com/Unleash/toolbar/pull/64)

**Full Changelog**:
<https://github.com/Unleash/toolbar/compare/v1.1.1...v1.2.0>

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 20:49:16 +00:00
Gastón Fournier 7bc1768182 fix(tokens-v2): invalidate tokens when environments are deleted
## What

- Replaces the V2 token environment foreign key cascade with `ON DELETE
NO ACTION`.
- Adds a bulk V2-token deletion path that returns the deleted tokens and
writes one selector-bearing `api-token-deleted` event per token.
- Runs token deletion, token deletion-event persistence, environment
deletion, and the environment deletion event in the same database
transaction.
- Leaves cache mutation to the existing token-revision poller: once the
transaction commits, each pod can observe the deletion events and evict
the affected selectors.
- Refactors the V2 token service factory so environment deletion can
construct it with the transaction-scoped database handle.
- Keeps deletion atomic: if token-event persistence or a later step
fails, the environment and its tokens remain.

## Why

Database cascade deletion removes token rows without producing the
token-scoped events used by the cache-coherence layer. Pods could
therefore continue authenticating cached tokens after an environment was
deleted.

Making token deletion explicit records the selectors needed by the
revision poller while keeping database changes and audit events atomic.
`NO ACTION` also makes mixed-version rollout fail safely: an older pod
cannot delete an environment through the database cascade without
producing V2 token deletion events.
2026-09-01 20:00:40 +02:00
Gastón Fournier 81088d6cd5 feat(tokens-v2): synchronize token caches across pods
## TL;DR

This PR gives the two V2 token-cache implementations separate lifecycle
strategies:

- the **legacy cache keeps its full active-token refresh every minute**;
- the **single-flight cache is warmed at startup with active tokens seen
in the last six hours**, then stays read-through;
- a **10-second token-revision poll** invalidates updated and deleted
selectors in the single-flight cache across pods;
- if token-revision polling fails, authentication continues serving
cached tokens and logs the degraded coherence state.

The startup warm-up is an optimization, not a correctness requirement.
The single-flight cache can always load a token on demand.

### Active does not mean in use

The legacy token service queries and loads every active token on every
pod once per minute. In storage, "active" only means non-expired; it
does not mean the token is receiving traffic. `seenAt` usage suggests
that only a subset of those tokens is typically hot.

That full-table refresh remains the legacy tokens's coherence mechanism,
but it is a poor steady-state fit for the single-flight cache: it
preserves the existing database cost and fills the cache with tokens
that may never be read.

### Read-through with a bounded startup warm-up

When the single-flight cache is active during startup, it queries the
active-token set once and preloads only tokens whose `seenAt` is within
the last six hours. This reduces cold-start queries for recently used
tokens without turning the cache into another periodically rebuilt copy
of the complete active-token table.

After startup, the cache loads a selector when that token is presented
and coalesces concurrent misses for the same selector. Its 10-minute
sliding TTL keeps continuously hot tokens resident, so a token normally
needs one selector query per pod until it is invalidated, evicted,
expires from the cache, or the process restarts.

The cache proxy routes reads and mutations to the implementation
currently selected by `usePromiseTokenCache`. This keeps the migration
decision at the service boundary: `fetchActiveTokens()` acts only on the
legacy implementation, while `initialize()` and revision processing act
only on the read-through implementation.

### Targeted coherence across pods

The preceding transactional-events work makes each token mutation and
its audit event commit or roll back together. This PR uses that
committed token-event revision stream to keep long-lived single-flight
caches coherent across instances.

```mermaid
flowchart LR
    TX[Transactional mutation service] -->|token + event in one transaction| DB[(Database)]
    DB --> LOG[(Token event revisions)]
    LOG -->|poll every 10s| A[Long-lived cache - pod A]
    LOG -->|poll every 10s| B[Long-lived cache - pod B]
    LOG -->|poll every 10s| C[Sibling service instance]
```

Each long-lived instance polls independently and advances through the
committed revision stream:

- **Create:** advance the revision without changing the cache. A newly
created credential has not previously been used, and speculative
selector misses are not treated as a meaningful coherence case.
- **Update:** invalidate the affected selector so its next use reloads
the current token from storage.
- **Delete:** invalidate the affected selector so it can no longer be
served from memory.
- **Legacy cache:** skip revision processing because its complete
active-token refresh continues to run every minute.
- **Failure behavior**: if revision polling fails, authentication
continues using the cache rather than forcing database lookups. Updated
or deleted cached tokens may remain accepted until polling recovers and
invalidates them. This prioritizes serving up-to-date feature flag
configuration over precise token validation (which is solved by
restarting the server)

The transactional mutation service remains **cache-neutral**. It is
short-lived, so changing its private cache would not update the
long-lived instance serving authentication reads. Its useful output is
the committed event, which every long-lived instance observes through
revision polling.

### Runtime cache selection

`CacheProxy` resolves the active implementation for each operation. Bulk
replacement, targeted invalidation, and normal reads therefore affect
only the cache currently selected by the feature flag.

This lets the two implementations coexist during migration without
requiring the legacy cache to seed or mirror the single-flight cache.

## Reviewer summary

The intended invariants are:

1. **The legacy cache remains a full-table cache refreshed once per
minute.**
2. **The single-flight cache receives a six-hour usage-based startup
warm-up, then grows and refreshes through real token usage.**
3. **Cache operations affect only the implementation currently selected
by the feature flag.**
4. **Revision polling invalidates updated and deleted selectors across
single-flight cache instances and pods.**
5. **Failed revision polling does not bypass the cache; coherence
recovers after the next successful poll.**


Co-authored-by: irstavr
[irini.stavrakantonaki@getunleash.io](mailto:irini.stavrakantonaki@getunleash.io)
Co-authored-by: irstavr [irstavr@gmail.com](mailto:irstavr@gmail.com)
2026-09-01 19:49:04 +02:00
Mateusz Kwasniewski 126b71c517 feat: show automations in CR release plan from template
This PR adds "Proceed to the next milestone" read only
automation/progression when it exists on a template
<img width="972" height="609" alt="Screenshot 2026-08-31 at 13 11 35"
src="https://github.com/user-attachments/assets/fa936c93-5fa2-4f76-97ed-298612f52cf6"
/>

---------

Co-authored-by: Kamala Rocci <kamala.rocci@getunleash.io>
2026-09-01 14:43:44 +00:00
Fredrik Strand Oseberg 0dac202e85 feat: further uxtweak survey hardening
Add latching, so that we don't change surveys based on flag order or
surveys change for current users if the payload changes.
2026-09-01 15:36:49 +02:00
David Leek eb2e914d07 chore: hide frontend support for semver metadata behind flag 2026-09-01 13:15:03 +02:00
Fredrik Strand Oseberg 43a9c8bd2a feat: 7-day grace period between uxtweak surveys
Concluding any survey (submit or close) writes a self-expiring marker
via createLocalStorage's timeToLive; useActiveSurvey shows nothing while
it is present. Keeps a visitor matched by several campaigns from getting
the next card the moment they finish one. Also removes a leftover debug
log.

Grace period is currently set to 7 days.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-01 13:08:16 +02:00
Krzysztof (Kris) Kula f153aee009 Revert "chore: add back the pixel domain"
Reverts bricks-software/unleash-enterprise#1659
2026-09-01 11:49:40 +02:00
renovate[bot] 0f2f128806 chore(deps): update dependency @types/pg to v8.23.1 (#12595)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/pg](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/pg)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/pg))
| [`8.20.4` →
`8.23.1`](https://renovatebot.com/diffs/npm/@types%2fpg/8.20.4/8.23.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fpg/8.23.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fpg/8.20.4/8.23.1?slim=true)
|

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 01:29:38 +00:00
renovate[bot] 5c6e57b7bf chore(deps): update dependency @slack/web-api to v7.19.0 (#12594)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@slack/web-api](https://docs.slack.dev/tools/node-slack-sdk/web-api/)
([source](https://redirect.github.com/slackapi/node-slack-sdk)) |
[`7.18.0` →
`7.19.0`](https://renovatebot.com/diffs/npm/@slack%2fweb-api/7.18.0/7.19.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@slack%2fweb-api/7.19.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@slack%2fweb-api/7.18.0/7.19.0?slim=true)
|

---

### Release Notes

<details>
<summary>slackapi/node-slack-sdk (@&#8203;slack/web-api)</summary>

###
[`v7.19.0`](https://redirect.github.com/slackapi/node-slack-sdk/releases/tag/%40slack/web-api%407.19.0)

[Compare
Source](https://redirect.github.com/slackapi/node-slack-sdk/compare/@slack/web-api@7.18.0...@slack/web-api@7.19.0)

##### Minor Changes

-
[`a795b86`](https://redirect.github.com/slackapi/node-slack-sdk/commit/a795b86):
feat: expand app manifest types — add `agent_view` and `assistant_view`
features, recent agent events (`app_context_changed`,
`assistant_thread_started`, `assistant_thread_context_changed`),
optional OAuth scopes (`bot_optional`/`user_optional`), and event
`metadata_subscriptions`

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 01:29:20 +00:00
renovate[bot] ba7f16c028 chore(deps): update dependency fast-uri to v3.1.6 (#12593)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [fast-uri](https://redirect.github.com/fastify/fast-uri) | [`3.1.5` →
`3.1.6`](https://renovatebot.com/diffs/npm/fast-uri/3.1.5/3.1.6) |
![age](https://developer.mend.io/api/mc/badges/age/npm/fast-uri/3.1.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/fast-uri/3.1.5/3.1.6?slim=true)
|

---

### Release Notes

<details>
<summary>fastify/fast-uri (fast-uri)</summary>

###
[`v3.1.6`](https://redirect.github.com/fastify/fast-uri/compare/v3.1.5...6f970b2951fd896aa0f3a7ff28eeb6640c137d33)

[Compare
Source](https://redirect.github.com/fastify/fast-uri/compare/v3.1.5...v3.1.6)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 21:56:01 +00:00
renovate[bot] f9e058002f chore(deps): update dependency @types/react-dom to v19.2.5 (#12592)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/react-dom](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react-dom)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom))
| [`19.2.4` →
`19.2.5`](https://renovatebot.com/diffs/npm/@types%2freact-dom/19.2.4/19.2.5)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact-dom/19.2.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact-dom/19.2.4/19.2.5?slim=true)
|

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 21:55:32 +00:00
Krzysztof (Kris) Kula ff8a7d2bb1 chore: try improving delay before tour is marked as done
Trying to improve time before someone finishes the tour and the
onboarding checklist marks it as done.
2026-08-31 16:20:34 +02:00
Krzysztof (Kris) Kula b87664ac78 fix: onboarding checklist in safari showing corners after drag
Fixing weird corners showing up in Safari after drag. 

<img width="250" height="174" alt="image"
src="https://github.com/user-attachments/assets/d28d92ab-fed7-440e-b65f-b2de0af949c9"
/>
2026-08-31 15:31:14 +02:00
David Leek d028deb02e chore: add semverBuildMetadata flag
This adds the semverBuildMetadata flag to Unleash
2026-08-31 15:04:44 +02:00
Anniken Østdahl e9019d7a57 Align input fields (#12591)
Feedback from Henning that we should align the input fields in
project/flag creation modal with the rest of Unleash to stay consistent

Files changed:
- frontend/src/component/common/FormField/FormField.tsx

🤖 Drafted from the UX Tweak extension — please review.

Co-authored-by: Anniken Østdahl <6595978+nikken@users.noreply.github.com>
2026-08-31 13:04:58 +02:00
Gastón Fournier 850949655b feat(tokens): add flag controlling single-flight caching
## TL;DR

This PR supersedes #1643 and incorporates its review feedback by
extracting the cache implementations from the authentication services.

It allows V1 and V2 token authentication to switch at runtime between
the existing cache and `SingleFlightCache` using the disabled-by-default
`usePromiseTokenCache` flag. Both implementations now live behind a
shared `TokenCacheInterface`, while the authentication services remain
responsible for token-specific validation.

## What changed

### Shared cache abstraction

This PR introduces:

- `TokenCacheInterface`, defining the operations required by token
authentication;
- `CacheV1`, containing the existing map and negative-throttling
behavior;
- `CacheV2`, adapting `SingleFlightCache`;
- `CacheProxy`, selecting the active implementation from
`usePromiseTokenCache` at lookup time.

Both the plain-text token service and secure V2 token service now depend
on this interface rather than implementing their own cache-selection and
negative-cache logic.

### Runtime selection

`usePromiseTokenCache` is evaluated by `CacheProxy` whenever the cache
is accessed:

- **Flag off:** use the existing map-based cache.
- **Flag on:** use the bounded single-flight cache, coalescing
concurrent database lookups for the same key.

The flag remains disabled by default and can be configured with
`UNLEASH_EXPERIMENTAL_USE_PROMISE_TOKEN_CACHE`. No restart is required
to change the selected implementation.

The two implementations intentionally keep independent state. Writes and
lookups update only the currently selected cache, so enabling the new
implementation begins with a cold cache. This makes its database and
cache impact representative of a real rollout instead of hiding it by
warming the new implementation through the legacy path.

## Authentication behavior

The cache only returns a candidate token. Authentication-specific checks
remain in the owning service.

### Plain-text tokens

- Tokens are cached by secret.
- Deprecated aliases retain a separate cache because aliases cannot be
queried through the token store.
- Expiry is checked before a cached token is returned.
- Alias usage continues to produce the existing migration warning.

### Secure V2 tokens

- Cache entries are keyed by selector, not by the complete credential.
- The presented secret is verified against the stored verifier on every
authentication, including cache hits.
- An incorrect secret for an existing selector is an authentication
failure; it does not become a separate negative-cache entry.
- Expiry is checked both when loading from the database and when
returning a cached entry.
- Expired database records are not cached.
- `seen_at` continues to be updated after successful authentication.

## Cache behavior

`CacheV1` preserves the existing map-based positive cache and
five-minute negative throttling.

`CacheV2` provides:

- single-flight database loading for concurrent misses;
- a bounded positive cache;
- a separately bounded negative cache with progressive retry delays;
- a sliding ten-minute TTL;
- a short stale-while-error window.

Cache lookup metrics are emitted by each implementation, keeping
cache-specific instrumentation out of the authentication services.

## Mutation and refresh behavior

Token mutation services remain cache-neutral because they may be
transaction-scoped and do not necessarily own the long-lived cache used
for authentication.

Periodic refreshes replace the V1 cache contents with the current
active-token set. The V2 cache remains read-through and demand-filled.

Cross-instance and cross-pod convergence remain outside this PR and are
handled by the revision-driven work in #1644.

## Reviewer guide

The review can be split into three layers:

1. `api-token-cache.ts`: common contract, implementation selection,
cache semantics, and metrics.
2. `api-token-service.ts`: plain-text token and deprecated-alias
behavior.
3. `api-token-v2-service.ts`: selector-based loading, expiry, verifier
checks, and `seen_at`.

The intended default remains unchanged: with `usePromiseTokenCache`
disabled, authentication uses `CacheV1`.
2026-08-31 12:53:08 +02:00
Krzysztof (Kris) Kula bccdf46f4d chore: bump js-yaml to 4.3.1
4.3.1 was already in the OSS lockfile, but we need to bump it manually
in enterprise
2026-08-31 11:34:31 +01:00
Ivar Conradi Østhus 38c893793d chore: remove sessionInspector flag
We decided to keep the session inspector, so this removes the
`sessionInspector` flag and makes the feature unconditional.

## Backend (OSS)
- Removed the flag from the experimental flag union and its
`UNLEASH_EXPERIMENTAL_SESSION_INSPECTOR` default, plus the
`server-dev.ts` / `example.ts` configs that enabled it.
- `sessionContextMiddleware` no longer takes a flag resolver — it always
stamps `ip`/`userAgent` on authenticated sessions.

## Backend (enterprise)
- Dropped the request-time 404 gate from `UserSessionsController` (both
routes) and the `flagResolver` field.
- Removed the flag-disabled e2e app and its "returns 404 when the flag
is disabled" test; remaining apps start with default config.

## Frontend
- `/admin/sessions` is no longer flag-gated.
- `useActiveSessions` only checks for enterprise.
- `SecurityBanner` always links to the session inspector (the
`/admin/users` variant existed only for the flag-off case).

## Testing
- `pnpm run typecheck:source` and frontend `tsc` pass; biome clean on
all touched files.
- The user-sessions e2e suite was not run locally (needs Postgres) — CI
covers it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01QnCX4pShjSeEVWBXiJisj5

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 12:29:03 +02:00
Krzysztof (Kris) Kula c1b70da2af chore: check billing before relaxing CSP
Relax csp rules only for PAYG - this will matter if we need to set
portal ID for all production instances
2026-08-31 10:19:48 +03:00
renovate[bot] ac44b65ce0 chore(deps): update dependency @testing-library/user-event to v14.6.6 (#12590)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@testing-library/user-event](https://redirect.github.com/testing-library/user-event)
| [`14.6.5` →
`14.6.6`](https://renovatebot.com/diffs/npm/@testing-library%2fuser-event/14.6.5/14.6.6)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2fuser-event/14.6.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2fuser-event/14.6.5/14.6.6?slim=true)
|

---

### Release Notes

<details>
<summary>testing-library/user-event
(@&#8203;testing-library/user-event)</summary>

###
[`v14.6.6`](https://redirect.github.com/testing-library/user-event/releases/tag/v14.6.6)

[Compare
Source](https://redirect.github.com/testing-library/user-event/compare/v14.6.5...v14.6.6)

##### Bug Fixes

- default pointer event pointerType to empty string instead of the
string "undefined"
([#&#8203;1325](https://redirect.github.com/testing-library/user-event/issues/1325))
([71a5475](https://redirect.github.com/testing-library/user-event/commit/71a547572e6f7793b925052c71aaabef6a443995))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 03:03:46 +00:00
renovate[bot] 3ce087b005 chore(deps): update dependency @faker-js/faker to v10.6.0 (#12589)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@faker-js/faker](https://fakerjs.dev)
([source](https://redirect.github.com/faker-js/faker)) | [`10.5.0` →
`10.6.0`](https://renovatebot.com/diffs/npm/@faker-js%2ffaker/10.5.0/10.6.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@faker-js%2ffaker/10.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@faker-js%2ffaker/10.5.0/10.6.0?slim=true)
|

---

### Release Notes

<details>
<summary>faker-js/faker (@&#8203;faker-js/faker)</summary>

###
[`v10.6.0`](https://redirect.github.com/faker-js/faker/blob/HEAD/CHANGELOG.md#1060-2026-08-14)

[Compare
Source](https://redirect.github.com/faker-js/faker/compare/v10.5.0...v10.6.0)

##### New Locales

- **locale:** add 060 Japanese mobile phone number formats
([#&#8203;3922](https://redirect.github.com/faker-js/faker/issues/3922))
([afa272d](https://redirect.github.com/faker-js/faker/commit/afa272d468620755cbde4cae9379d342ebbd87d1))
- **locale:** add Norwegian (nb\_NO) animal module
([#&#8203;3901](https://redirect.github.com/faker-js/faker/issues/3901))
([1232937](https://redirect.github.com/faker-js/faker/commit/123293757668b3fb2b944e343ad212f4339828c3))
- **locale:** add Norwegian (nb\_NO) food module
([#&#8203;3900](https://redirect.github.com/faker-js/faker/issues/3900))
([bd23594](https://redirect.github.com/faker-js/faker/commit/bd23594bc6f2958fed29414f575fd5eab0b6ff9a))
- **locale:** add vehicle data for de
([#&#8203;3958](https://redirect.github.com/faker-js/faker/issues/3958))
([974490f](https://redirect.github.com/faker-js/faker/commit/974490f652f6f0dc210ea57071ec755dab66cfe8))
- **locale:** better middle names by gender for en locale
([#&#8203;3932](https://redirect.github.com/faker-js/faker/issues/3932))
([aba3fb1](https://redirect.github.com/faker-js/faker/commit/aba3fb1a2a18ec27c4af3f6f900ffef1bba1c698))
- **locale:** better organize first\_name by gender for en
([#&#8203;3924](https://redirect.github.com/faker-js/faker/issues/3924))
([119386b](https://redirect.github.com/faker-js/faker/commit/119386b419039b1e266a4b0f0c303bffc92788ef))

##### Features

- introduce NumberRange type
([#&#8203;3838](https://redirect.github.com/faker-js/faker/issues/3838))
([acd5fda](https://redirect.github.com/faker-js/faker/commit/acd5fdaf099bda7cf90c76bf0ae0a33349a54ce7))
- **phone:** mobile styles for more locales
([#&#8203;3902](https://redirect.github.com/faker-js/faker/issues/3902))
([1107eab](https://redirect.github.com/faker-js/faker/commit/1107eab7691a73631802dffa6aa023d6212284b7))

##### Changed Locales

- **locale:** add en\_NP and change ne to Devangari
([#&#8203;3868](https://redirect.github.com/faker-js/faker/issues/3868))
([fc788cc](https://redirect.github.com/faker-js/faker/commit/fc788cc0c502743fb2290a62104ad07dcc668beb))
- **locale:** normalize phone\_number data
([#&#8203;3518](https://redirect.github.com/faker-js/faker/issues/3518))
([9a1cb7d](https://redirect.github.com/faker-js/faker/commit/9a1cb7d1d2622d159fe623e3f7cc593a92ef2d55))

##### Bug Fixes

- **apidocs:** scope code group tab identifiers
([#&#8203;3976](https://redirect.github.com/faker-js/faker/issues/3976))
([3125eaf](https://redirect.github.com/faker-js/faker/commit/3125eaf85e8df1bf5ea15bdb73c0ef10bab436dd))
- **color:** give the LCH hue its full 360 degree range
([#&#8203;3978](https://redirect.github.com/faker-js/faker/issues/3978))
([1ce5994](https://redirect.github.com/faker-js/faker/commit/1ce599462b0c04036797594c8c1b6d5bd0c91846))
- **color:** stop scaling the HSLA alpha into a percentage
([#&#8203;3979](https://redirect.github.com/faker-js/faker/issues/3979))
([1143329](https://redirect.github.com/faker-js/faker/commit/11433295b990a8359bd5a36fed3002b33e387a56))
- groupBy handling for prototype property keys
([#&#8203;3906](https://redirect.github.com/faker-js/faker/issues/3906))
([c898ff1](https://redirect.github.com/faker-js/faker/commit/c898ff1f90a8b74b512e8e1fca89ae1e4e738df3))
- **internet:** exclude reserved port 0 from internet.port()
([#&#8203;3948](https://redirect.github.com/faker-js/faker/issues/3948))
([d4b35a4](https://redirect.github.com/faker-js/faker/commit/d4b35a48fa576422497257c01d10274282d82c94))
- **internet:** generate long passwords without stack overflow
([#&#8203;3946](https://redirect.github.com/faker-js/faker/issues/3946))
([4782978](https://redirect.github.com/faker-js/faker/commit/478297849dce372664ceae13fe36c84212d374c6))
- **internet:** validate CIDR prefix length and octet range in ipv4()
([#&#8203;3933](https://redirect.github.com/faker-js/faker/issues/3933))
([15cb8fb](https://redirect.github.com/faker-js/faker/commit/15cb8fbae9e8d5debd35e1fb144691f5517c0807))
- **locale:** exclude forbidden letter combinations from nl postcodes
([#&#8203;3888](https://redirect.github.com/faker-js/faker/issues/3888))
([9bebe67](https://redirect.github.com/faker-js/faker/commit/9bebe676beafefd5191b2aa103401be0ebe94169))
- **locale:** only generate valid French postal codes
([#&#8203;3905](https://redirect.github.com/faker-js/faker/issues/3905))
([711f36f](https://redirect.github.com/faker-js/faker/commit/711f36fa04235513050fdd23a5104aa05ddc47c7))
- **locale:** update nl\_BE phone number patterns
([#&#8203;3981](https://redirect.github.com/faker-js/faker/issues/3981))
([9616076](https://redirect.github.com/faker-js/faker/commit/96160763bafee03177331f84850dc5e18216ffc3))
- **locale:** use only common surnames for zh\_CN last names
([#&#8203;3938](https://redirect.github.com/faker-js/faker/issues/3938))
([58394eb](https://redirect.github.com/faker-js/faker/commit/58394eb2610ae8fe15ab9b1b2a17c108fd8e9749))
- **locale:** use only valid letters in en\_CA postcodes
([#&#8203;3951](https://redirect.github.com/faker-js/faker/issues/3951))
([3b184d6](https://redirect.github.com/faker-js/faker/commit/3b184d6e52a721c227c6e9c58731bdf008f43532))
- **string:** reject refDates that a ULID timestamp cannot encode
([#&#8203;3982](https://redirect.github.com/faker-js/faker/issues/3982))
([81717bc](https://redirect.github.com/faker-js/faker/commit/81717bc633865917e5193b6d00eefea667ecd862))
- **vehicle:** calculate VIN check digit
([#&#8203;3954](https://redirect.github.com/faker-js/faker/issues/3954))
([a4c6757](https://redirect.github.com/faker-js/faker/commit/a4c6757fdf65c6434c862ca4f29639e8b982d7e5))
- **word:** pick nearest length for closest strategy
([#&#8203;3943](https://redirect.github.com/faker-js/faker/issues/3943))
([42fd322](https://redirect.github.com/faker-js/faker/commit/42fd322071afc4f3e9148618127bd18148337ce5))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-28 21:59:00 +00:00
renovate[bot] 5b579f42b6 chore(deps): update dependency @base-ui/react to v1.7.0 (#12588)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@base-ui/react](https://base-ui.com)
([source](https://redirect.github.com/mui/base-ui/tree/HEAD/packages/react))
| [`1.6.0` →
`1.7.0`](https://renovatebot.com/diffs/npm/@base-ui%2freact/1.6.0/1.7.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@base-ui%2freact/1.7.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@base-ui%2freact/1.6.0/1.7.0?slim=true)
|

---

### Release Notes

<details>
<summary>mui/base-ui (@&#8203;base-ui/react)</summary>

###
[`v1.7.0`](https://redirect.github.com/mui/base-ui/blob/HEAD/CHANGELOG.md#v170)

[Compare
Source](https://redirect.github.com/mui/base-ui/compare/v1.6.0...v1.7.0)

*Aug 4, 2026*

##### General changes

- Restore visible focus after keyboard close in Safari and Firefox
([#&#8203;5093](https://redirect.github.com/mui/base-ui/issues/5093)) by
[@&#8203;lyzno1](https://redirect.github.com/lyzno1)
- Type `render` callback props based on the rendered element
([#&#8203;5104](https://redirect.github.com/mui/base-ui/issues/5104)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce popup bundle size
([#&#8203;5233](https://redirect.github.com/mui/base-ui/issues/5233)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce store bundle size
([#&#8203;5250](https://redirect.github.com/mui/base-ui/issues/5250)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Keep unpositioned popups at the viewport origin
([#&#8203;5299](https://redirect.github.com/mui/base-ui/issues/5299)) by
[@&#8203;flaviendelangle](https://redirect.github.com/flaviendelangle)
- Correct layout and passive effect timing
([#&#8203;5337](https://redirect.github.com/mui/base-ui/issues/5337)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Remove redundant lifecycle synchronization
([#&#8203;5341](https://redirect.github.com/mui/base-ui/issues/5341)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Prevent stale cleanup from clearing registered part IDs
([#&#8203;5340](https://redirect.github.com/mui/base-ui/issues/5340)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Complete popup unmounting after a canceled exit transition
([#&#8203;5401](https://redirect.github.com/mui/base-ui/issues/5401)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix rendered trigger ID ownership
([#&#8203;5110](https://redirect.github.com/mui/base-ui/issues/5110)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Prevent unwanted flip with capped scrollable content
([#&#8203;5120](https://redirect.github.com/mui/base-ui/issues/5120)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix `collisionPadding` off-by-one on the biased side
([#&#8203;5143](https://redirect.github.com/mui/base-ui/issues/5143)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce shared popup bundle size
([#&#8203;5192](https://redirect.github.com/mui/base-ui/issues/5192)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Mount popup subtrees synchronously when opening in React 17
([#&#8203;5309](https://redirect.github.com/mui/base-ui/issues/5309)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix auto-resize origin for left-anchored popups
([#&#8203;5370](https://redirect.github.com/mui/base-ui/issues/5370)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Avoid redundant re-renders during lazy flipping
([#&#8203;5372](https://redirect.github.com/mui/base-ui/issues/5372)) by
[@&#8203;mdm317](https://redirect.github.com/mdm317)
- Strip implementation-only types from published `.d.ts` files
([#&#8203;5165](https://redirect.github.com/mui/base-ui/issues/5165)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Fix `usePreviousValue` equality comparison
([#&#8203;5264](https://redirect.github.com/mui/base-ui/issues/5264)) by
[@&#8203;lyzno1](https://redirect.github.com/lyzno1)

##### Accordion

- Remove the implicit `dir` attribute from `<Accordion.Root>`
([#&#8203;5117](https://redirect.github.com/mui/base-ui/issues/5117)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)

##### Alert Dialog

- Prevent `<AlertDialog.Root>` from reopening after remounting with a
reused handle
([#&#8203;5109](https://redirect.github.com/mui/base-ui/issues/5109)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)

##### Autocomplete

- Respect locale when filtering
([#&#8203;5195](https://redirect.github.com/mui/base-ui/issues/5195)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Add `input-press` to change event details
([#&#8203;5356](https://redirect.github.com/mui/base-ui/issues/5356)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Add `cancel-open` to change event details
([#&#8203;5376](https://redirect.github.com/mui/base-ui/issues/5376)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Reset list scroll position on filter
([#&#8203;5231](https://redirect.github.com/mui/base-ui/issues/5231)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Remove dead code and deduplicate handlers
([#&#8203;5194](https://redirect.github.com/mui/base-ui/issues/5194)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix listbox separator semantics
([#&#8203;5399](https://redirect.github.com/mui/base-ui/issues/5399)) by
[@&#8203;sarthakmalik0810](https://redirect.github.com/sarthakmalik0810)

##### Avatar

- Show `<Avatar.Fallback>` immediately when `delay={0}`
([#&#8203;5147](https://redirect.github.com/mui/base-ui/issues/5147)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)

##### Button

- Fix keyboard click handling for custom elements
([#&#8203;4838](https://redirect.github.com/mui/base-ui/issues/4838)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Checkbox

- Remove redundant validation input ref
([#&#8203;5188](https://redirect.github.com/mui/base-ui/issues/5188)) by
[@&#8203;nami8824](https://redirect.github.com/nami8824)
- Stop internal input clicks from reaching ancestors
([#&#8203;5176](https://redirect.github.com/mui/base-ui/issues/5176)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5223](https://redirect.github.com/mui/base-ui/issues/5223)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Checkbox Group

- Focus invalid checkbox
([#&#8203;5216](https://redirect.github.com/mui/base-ui/issues/5216)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Align form values with native submission
([#&#8203;5218](https://redirect.github.com/mui/base-ui/issues/5218)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5223](https://redirect.github.com/mui/base-ui/issues/5223)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Combobox

- Add `input-press` to change event details
([#&#8203;5356](https://redirect.github.com/mui/base-ui/issues/5356)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Add `cancel-open` to change event details
([#&#8203;5376](https://redirect.github.com/mui/base-ui/issues/5376)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Stop filtering grouped items after limit
([#&#8203;5086](https://redirect.github.com/mui/base-ui/issues/5086)) by
[@&#8203;lyzno1](https://redirect.github.com/lyzno1)
- Remove leaky value registry
([#&#8203;5198](https://redirect.github.com/mui/base-ui/issues/5198)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Set initial highlight in inline combobox
([#&#8203;5230](https://redirect.github.com/mui/base-ui/issues/5230)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Return highlight to selected item on query clear
([#&#8203;5232](https://redirect.github.com/mui/base-ui/issues/5232)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Expose `expanded` state for inline comboboxes
([#&#8203;5332](https://redirect.github.com/mui/base-ui/issues/5332)) by
[@&#8203;sarthakmalik0810](https://redirect.github.com/sarthakmalik0810)
- Keep portalled popup content open
([#&#8203;5334](https://redirect.github.com/mui/base-ui/issues/5334)) by
[@&#8203;obeattie](https://redirect.github.com/obeattie)
- Reset list scroll position on filter
([#&#8203;5231](https://redirect.github.com/mui/base-ui/issues/5231)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix hovered item stealing highlight when the list scrolls in Safari
([#&#8203;5265](https://redirect.github.com/mui/base-ui/issues/5265)) by
[@&#8203;arikchakma](https://redirect.github.com/arikchakma)
- Inherit the disabled state from `<Combobox.Root>` in `<Combobox.Item>`
([#&#8203;5365](https://redirect.github.com/mui/base-ui/issues/5365)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Widen trigger slip-out release tolerance
([#&#8203;5159](https://redirect.github.com/mui/base-ui/issues/5159)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Remove dead code and deduplicate handlers
([#&#8203;5194](https://redirect.github.com/mui/base-ui/issues/5194)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix listbox separator semantics
([#&#8203;5399](https://redirect.github.com/mui/base-ui/issues/5399)) by
[@&#8203;sarthakmalik0810](https://redirect.github.com/sarthakmalik0810)

##### Composite

- Fix nested list reorder detection
([#&#8203;5156](https://redirect.github.com/mui/base-ui/issues/5156)) by
[@&#8203;jjenzz](https://redirect.github.com/jjenzz)
- Always skip natively disabled items during list navigation
([#&#8203;5185](https://redirect.github.com/mui/base-ui/issues/5185)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix scroll alignment for RTL direction in `scrollIntoViewIfNeeded`
([#&#8203;5234](https://redirect.github.com/mui/base-ui/issues/5234)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Simplify keyboard bookkeeping
([#&#8203;5249](https://redirect.github.com/mui/base-ui/issues/5249)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Dialog

- Fix touch outside-press dismissal without a backdrop
([#&#8203;5096](https://redirect.github.com/mui/base-ui/issues/5096)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Prevent `<Dialog.Root>` from reopening after remounting with a reused
handle
([#&#8203;5109](https://redirect.github.com/mui/base-ui/issues/5109)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Fix scroll lock handoff with external overlays
([#&#8203;4665](https://redirect.github.com/mui/base-ui/issues/4665)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5193](https://redirect.github.com/mui/base-ui/issues/5193)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Drawer

- Prevent `<Drawer.Root>` from reopening after remounting with a reused
handle
([#&#8203;5109](https://redirect.github.com/mui/base-ui/issues/5109)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Fix unreliable swipe-to-open gestures
([#&#8203;5105](https://redirect.github.com/mui/base-ui/issues/5105)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix popup flashing fully open for a frame on swipe area re-grab
([#&#8203;5112](https://redirect.github.com/mui/base-ui/issues/5112)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Deduplicate swipe math to reduce bundle size
([#&#8203;5181](https://redirect.github.com/mui/base-ui/issues/5181)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix scroll handling when focus moves while the virtual keyboard is
open
([#&#8203;5179](https://redirect.github.com/mui/base-ui/issues/5179)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix cross-axis scroll blocked on iOS below the touchmove slop
([#&#8203;5257](https://redirect.github.com/mui/base-ui/issues/5257)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix snap point jump when pinned pointer moves leave the drag offset
unchanged
([#&#8203;5308](https://redirect.github.com/mui/base-ui/issues/5308)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix Shadow DOM swipe gestures
([#&#8203;5360](https://redirect.github.com/mui/base-ui/issues/5360)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Field

- Keep invalid state on disabled fields
([#&#8203;5116](https://redirect.github.com/mui/base-ui/issues/5116)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5225](https://redirect.github.com/mui/base-ui/issues/5225)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix `data-dirty` tracking for null-valued controls
([#&#8203;5290](https://redirect.github.com/mui/base-ui/issues/5290)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)

##### Fieldset

- Reduce bundle size
([#&#8203;5225](https://redirect.github.com/mui/base-ui/issues/5225)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Form

- Reduce bundle size
([#&#8203;5225](https://redirect.github.com/mui/base-ui/issues/5225)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Focus the first invalid field in document order
([#&#8203;5287](https://redirect.github.com/mui/base-ui/issues/5287)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Menu

- Ignore pinch-zoom shifting
([#&#8203;4485](https://redirect.github.com/mui/base-ui/issues/4485)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Cancel stale submenu hover-open when Chrome drops mouseleave
([#&#8203;5153](https://redirect.github.com/mui/base-ui/issues/5153)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix exit animation not running on uncheck of item
([#&#8203;5252](https://redirect.github.com/mui/base-ui/issues/5252)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Fix duplicate `onOpenChange` calls when closing a submenu
([#&#8203;5178](https://redirect.github.com/mui/base-ui/issues/5178)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix VoiceOver announcement when opening a submenu
([#&#8203;5342](https://redirect.github.com/mui/base-ui/issues/5342)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Propagate disabled state to items
([#&#8203;5363](https://redirect.github.com/mui/base-ui/issues/5363)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Open submenus on Android TalkBack press
([#&#8203;5384](https://redirect.github.com/mui/base-ui/issues/5384)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Prevent `<Menu.Root>` from reopening after remounting with a reused
handle
([#&#8203;5149](https://redirect.github.com/mui/base-ui/issues/5149)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Widen trigger slip-out release tolerance
([#&#8203;5159](https://redirect.github.com/mui/base-ui/issues/5159)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Meter

- Format clamped values
([#&#8203;5409](https://redirect.github.com/mui/base-ui/issues/5409)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5224](https://redirect.github.com/mui/base-ui/issues/5224)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Navigation Menu

- Fix frozen menu when the open trigger unmounts
([#&#8203;5240](https://redirect.github.com/mui/base-ui/issues/5240)) by
[@&#8203;DreierF](https://redirect.github.com/DreierF)
- Ignore pinch-zoom shifting
([#&#8203;4485](https://redirect.github.com/mui/base-ui/issues/4485)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Number Field

- Fix keyboard editing with multi-character format symbols
([#&#8203;5111](https://redirect.github.com/mui/base-ui/issues/5111)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5220](https://redirect.github.com/mui/base-ui/issues/5220)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### OTP Field

- Keep focus on the invalid field when `autoSubmit` is blocked
([#&#8203;5089](https://redirect.github.com/mui/base-ui/issues/5089)) by
[@&#8203;lyzno1](https://redirect.github.com/lyzno1)

##### Popover

- Prevent `<Popover.Root>` from reopening after remounting with a reused
handle
([#&#8203;5149](https://redirect.github.com/mui/base-ui/issues/5149)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Reduce bundle size
([#&#8203;5193](https://redirect.github.com/mui/base-ui/issues/5193)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Preview Card

- Prevent `<PreviewCard.Root>` from reopening after remounting with a
reused handle
([#&#8203;5149](https://redirect.github.com/mui/base-ui/issues/5149)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)

##### Progress

- Fix custom `min`/`max` semantics to match the indicator
([#&#8203;5095](https://redirect.github.com/mui/base-ui/issues/5095)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5224](https://redirect.github.com/mui/base-ui/issues/5224)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Radio Group

- Remove unnecessary ARIA attributes from `<Radio.Root>`
([#&#8203;5213](https://redirect.github.com/mui/base-ui/issues/5213)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Stop internal input clicks from reaching ancestors
([#&#8203;5176](https://redirect.github.com/mui/base-ui/issues/5176)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Align form values with native submission
([#&#8203;5238](https://redirect.github.com/mui/base-ui/issues/5238)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5223](https://redirect.github.com/mui/base-ui/issues/5223)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Scroll Area

- Fix thumb-drag divide-by-zero and per-scroll re-render
([#&#8203;5099](https://redirect.github.com/mui/base-ui/issues/5099)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix scrollbar visibility during touch scrolling on iOS
([#&#8203;5157](https://redirect.github.com/mui/base-ui/issues/5157)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Add WebKit overscroll feedback to `<ScrollArea.Thumb>`
([#&#8203;5145](https://redirect.github.com/mui/base-ui/issues/5145)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5217](https://redirect.github.com/mui/base-ui/issues/5217)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Prevent scroll snapping while dragging the thumb
([#&#8203;5259](https://redirect.github.com/mui/base-ui/issues/5259)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- End thumb drag when the primary button is no longer held
([#&#8203;5374](https://redirect.github.com/mui/base-ui/issues/5374)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Select

- Fix hovered item stealing highlight when the list scrolls in Safari
([#&#8203;5265](https://redirect.github.com/mui/base-ui/issues/5265)) by
[@&#8203;arikchakma](https://redirect.github.com/arikchakma)
- Inherit the disabled state from `<Select.Root>` in `<Select.Item>`
([#&#8203;5365](https://redirect.github.com/mui/base-ui/issues/5365)) by
[@&#8203;chuganzy](https://redirect.github.com/chuganzy)
- Widen trigger slip-out release tolerance
([#&#8203;5159](https://redirect.github.com/mui/base-ui/issues/5159)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Do not force-mount the popup on programmatic value changes
([#&#8203;5119](https://redirect.github.com/mui/base-ui/issues/5119)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Remove dead code and deduplicate handlers
([#&#8203;5194](https://redirect.github.com/mui/base-ui/issues/5194)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix listbox separator semantics
([#&#8203;5399](https://redirect.github.com/mui/base-ui/issues/5399)) by
[@&#8203;sarthakmalik0810](https://redirect.github.com/sarthakmalik0810)

##### Slider

- Fix assorted issues
([#&#8203;5097](https://redirect.github.com/mui/base-ui/issues/5097)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5222](https://redirect.github.com/mui/base-ui/issues/5222)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Exclude the prehydration script from client bundles
([#&#8203;5003](https://redirect.github.com/mui/base-ui/issues/5003)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)

##### Switch

- Stop internal input clicks from reaching ancestors
([#&#8203;5176](https://redirect.github.com/mui/base-ui/issues/5176)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Reduce bundle size
([#&#8203;5223](https://redirect.github.com/mui/base-ui/issues/5223)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Tabs

- Position pre-hydration indicator inside streamed Suspense
([#&#8203;5171](https://redirect.github.com/mui/base-ui/issues/5171)) by
[@&#8203;brijeshb42](https://redirect.github.com/brijeshb42)
- Exclude the prehydration script from client bundles
([#&#8203;5003](https://redirect.github.com/mui/base-ui/issues/5003)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)
- Reduce bundle size
([#&#8203;5221](https://redirect.github.com/mui/base-ui/issues/5221)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Toast

- Fix remaining toast timer calculation
([#&#8203;5261](https://redirect.github.com/mui/base-ui/issues/5261)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Reduce bundle size
([#&#8203;5219](https://redirect.github.com/mui/base-ui/issues/5219)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Render content passed through the `render` prop in `<Toast.Title>`,
`<Toast.Description>`, and `<Toast.Action>`
([#&#8203;5210](https://redirect.github.com/mui/base-ui/issues/5210)) by
[@&#8203;m2na7](https://redirect.github.com/m2na7)
- Fix re-adding a closing toast
([#&#8203;5258](https://redirect.github.com/mui/base-ui/issues/5258)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)
- Fix swipe direction locking for two-axis swipes
([#&#8203;5295](https://redirect.github.com/mui/base-ui/issues/5295)) by
[@&#8203;sai6855](https://redirect.github.com/sai6855)
- Fix `<Toast.Provider>` prop effect ordering
([#&#8203;5338](https://redirect.github.com/mui/base-ui/issues/5338)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Toggle Group

- Reduce bundle size
([#&#8203;5224](https://redirect.github.com/mui/base-ui/issues/5224)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Toolbar

- Reduce bundle size
([#&#8203;5221](https://redirect.github.com/mui/base-ui/issues/5221)) by
[@&#8203;atomiks](https://redirect.github.com/atomiks)

##### Tooltip

- Prevent `<Tooltip.Root>` from reopening after remounting with a reused
handle
([#&#8203;5149](https://redirect.github.com/mui/base-ui/issues/5149)) by
[@&#8203;michaldudak](https://redirect.github.com/michaldudak)

All contributors of this release in alphabetical order:
[@&#8203;arikchakma](https://redirect.github.com/arikchakma),
[@&#8203;atomiks](https://redirect.github.com/atomiks),
[@&#8203;bernardobelchior](https://redirect.github.com/bernardobelchior),
[@&#8203;brijeshb42](https://redirect.github.com/brijeshb42),
[@&#8203;chuganzy](https://redirect.github.com/chuganzy),
[@&#8203;DiegoAndai](https://redirect.github.com/DiegoAndai),
[@&#8203;DreierF](https://redirect.github.com/DreierF),
[@&#8203;flaviendelangle](https://redirect.github.com/flaviendelangle),
[@&#8203;jjenzz](https://redirect.github.com/jjenzz),
[@&#8203;lyzno1](https://redirect.github.com/lyzno1),
[@&#8203;m2na7](https://redirect.github.com/m2na7),
[@&#8203;mdm317](https://redirect.github.com/mdm317),
[@&#8203;michaldudak](https://redirect.github.com/michaldudak),
[@&#8203;nami8824](https://redirect.github.com/nami8824),
[@&#8203;obeattie](https://redirect.github.com/obeattie),
[@&#8203;sai6855](https://redirect.github.com/sai6855),
[@&#8203;sarthakmalik0810](https://redirect.github.com/sarthakmalik0810)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "after 7pm every weekday,before 5am every weekday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-28 21:57:59 +00:00