diff --git a/.changeset/README.md b/.changeset/README.md
index 6c68425e59..423552ee75 100644
--- a/.changeset/README.md
+++ b/.changeset/README.md
@@ -26,7 +26,7 @@ Optional description with code examples.
Migration instructions (breaking changes only).
-**Affected components:** button, card
+**Affected components:** Button, Card
```
**Required:**
@@ -40,7 +40,7 @@ Migration instructions (breaking changes only).
```markdown
Fixed button hover state
-**Affected components:** button
+**Affected components:** Button
```
````markdown
@@ -56,7 +56,7 @@ Update imports:
```
````
-**Affected components:** table
+**Affected components:** Table
```
diff --git a/.changeset/add-actions-registry-examples.md b/.changeset/add-actions-registry-examples.md
new file mode 100644
index 0000000000..5174bcc68d
--- /dev/null
+++ b/.changeset/add-actions-registry-examples.md
@@ -0,0 +1,7 @@
+---
+'@backstage/backend-plugin-api': minor
+'@backstage/backend-defaults': patch
+'@backstage/backend-test-utils': patch
+---
+
+Added support for typed `examples` on actions registered via the actions registry. Action authors can now provide examples with compile-time-checked `input` and `output` values that match their schema definitions.
diff --git a/.changeset/add-masked-and-hidden-option.md b/.changeset/add-masked-and-hidden-option.md
deleted file mode 100644
index ad5c810a8e..0000000000
--- a/.changeset/add-masked-and-hidden-option.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-gitlab': patch
----
-
-Added `maskedAndHidden` option to `gitlab:projectVariable:create` and `publish:gitlab` action to support creating GitLab project variables that are both masked and hidden. Updated gitbeaker to version 43.8.0 for proper type support.
diff --git a/.changeset/add-query-catalog-entities-action.md b/.changeset/add-query-catalog-entities-action.md
deleted file mode 100644
index 78fb30d584..0000000000
--- a/.changeset/add-query-catalog-entities-action.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Added `query-catalog-entities` action to the catalog backend actions registry. Supports predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators.
diff --git a/.changeset/add-who-am-i-action.md b/.changeset/add-who-am-i-action.md
deleted file mode 100644
index 5c1008a7e1..0000000000
--- a/.changeset/add-who-am-i-action.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend': patch
----
-
-Added `who-am-i` action to the auth backend actions registry. Returns the catalog entity and user info for the currently authenticated user.
diff --git a/.changeset/add-withApis-core-compat-api.md b/.changeset/add-withApis-core-compat-api.md
deleted file mode 100644
index 135dcf87c7..0000000000
--- a/.changeset/add-withApis-core-compat-api.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-compat-api': patch
----
-
-Added `withApis`, which is a Higher-Order Component for providing APIs as props to a component via `useApiHolder`.
diff --git a/.changeset/angry-clouds-tell.md b/.changeset/angry-clouds-tell.md
new file mode 100644
index 0000000000..a01306d84a
--- /dev/null
+++ b/.changeset/angry-clouds-tell.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli-module-new': patch
+---
+
+Rename the legacy `frontend-plugin` to `frontend-plugin-legacy`
diff --git a/.changeset/app-defaults-clarify-failures.md b/.changeset/app-defaults-clarify-failures.md
new file mode 100644
index 0000000000..c6321a3a3a
--- /dev/null
+++ b/.changeset/app-defaults-clarify-failures.md
@@ -0,0 +1,5 @@
+---
+'@backstage/app-defaults': patch
+---
+
+Added `FetchMiddlewares.clarifyFailures()` to the default fetch API middleware stack.
diff --git a/.changeset/app-routes-redirect-config.md b/.changeset/app-routes-redirect-config.md
new file mode 100644
index 0000000000..ce43e3c159
--- /dev/null
+++ b/.changeset/app-routes-redirect-config.md
@@ -0,0 +1,17 @@
+---
+'@backstage/plugin-app': patch
+---
+
+Added support for configuring URL redirects on the `app/routes` extension. Redirects can be configured through `app-config` as an array of `{from, to}` path pairs, which will cause navigation to the `from` path to be redirected to the `to` path.
+
+For example:
+
+```yaml
+app:
+ extensions:
+ - app/routes:
+ config:
+ redirects:
+ - from: /old-path
+ to: /new-path
+```
diff --git a/.changeset/auditor-zod-v4-refactor.md b/.changeset/auditor-zod-v4-refactor.md
new file mode 100644
index 0000000000..c1ac7ce0aa
--- /dev/null
+++ b/.changeset/auditor-zod-v4-refactor.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Refactored auditor severity log level mappings to use `zod/v4` with schema-driven defaults and type inference.
diff --git a/.changeset/azure-scm-events-layer.md b/.changeset/azure-scm-events-layer.md
new file mode 100644
index 0000000000..22ca304f96
--- /dev/null
+++ b/.changeset/azure-scm-events-layer.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-azure': patch
+---
+
+Add Azure DevOps SCM event translation layer for instant catalog reprocessing.
diff --git a/.changeset/blue-moons-crash.md b/.changeset/blue-moons-crash.md
deleted file mode 100644
index bb5ae15c2e..0000000000
--- a/.changeset/blue-moons-crash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Made Accordion a `bg` provider so nested components like Button auto-increment their background level. Updated `useDefinition` to resolve `bg` `propDef` defaults for provider components.
diff --git a/.changeset/bright-items-see.md b/.changeset/bright-items-see.md
deleted file mode 100644
index ea3ba17cdf..0000000000
--- a/.changeset/bright-items-see.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-Fixed `generate-catalog-info` command failing with "too many arguments" when invoked by lint-staged via the pre-commit hook.
diff --git a/.changeset/bright-moons-open.md b/.changeset/bright-moons-open.md
deleted file mode 100644
index 2668dfb2e6..0000000000
--- a/.changeset/bright-moons-open.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-search-react': patch
-'@backstage/plugin-search': patch
----
-
-Fixes the search component not registering the first search on navigate to the search page.
diff --git a/.changeset/brown-rings-sort.md b/.changeset/brown-rings-sort.md
deleted file mode 100644
index 045f2fbd3b..0000000000
--- a/.changeset/brown-rings-sort.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Added interactive support to the `Card` component. Pass `onPress` to make the entire card surface pressable, or `href` to make it navigate to a URL. A transparent overlay handles the interaction while nested buttons and links remain independently clickable.
diff --git a/.changeset/brown-towns-find.md b/.changeset/brown-towns-find.md
deleted file mode 100644
index c3244d9427..0000000000
--- a/.changeset/brown-towns-find.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-api-docs': patch
----
-
-Fixed invisible text in parameter input fields when using dark mode in OpenAPI definition pages
diff --git a/.changeset/bui-analytics.md b/.changeset/bui-analytics.md
deleted file mode 100644
index 65ba31b1cf..0000000000
--- a/.changeset/bui-analytics.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Added analytics capabilities to the component library. Components with navigation behavior (Link, ButtonLink, Tab, MenuItem, Tag, Row) now fire analytics events on click when a `BUIProvider` is present.
-
-New exports: `BUIProvider`, `useAnalytics`, `getNodeText`, and associated types (`AnalyticsTracker`, `UseAnalyticsFn`, `BUIProviderProps`, `AnalyticsEventAttributes`).
-
-Components with analytics support now accept a `noTrack` prop to suppress event firing.
-
-**Affected components:** Link, ButtonLink, Tab, MenuItem, Tag, Row
diff --git a/.changeset/bump-bfj-v9.md b/.changeset/bump-bfj-v9.md
deleted file mode 100644
index 63309e4657..0000000000
--- a/.changeset/bump-bfj-v9.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `bfj` to `^9.0.2`.
diff --git a/.changeset/bump-glob-rollup-security.md b/.changeset/bump-glob-rollup-security.md
new file mode 100644
index 0000000000..1738169fd1
--- /dev/null
+++ b/.changeset/bump-glob-rollup-security.md
@@ -0,0 +1,11 @@
+---
+'@backstage/plugin-catalog-backend': patch
+'@backstage/cli-module-auth': patch
+'@backstage/cli-module-build': patch
+'@backstage/cli-module-test-jest': patch
+'@backstage/cli': patch
+'@backstage/ui': patch
+'@backstage/repo-tools': patch
+---
+
+Bumped `glob` dependency from v7/v8/v11 to v13 to address security vulnerabilities in older versions. Bumped `rollup` from v4.27 to v4.59+ to fix a high severity path traversal vulnerability (GHSA-mw96-cpmx-2vgc).
diff --git a/.changeset/bumpy-colts-teach.md b/.changeset/bumpy-colts-teach.md
deleted file mode 100644
index e3457127ce..0000000000
--- a/.changeset/bumpy-colts-teach.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed neutral-1 hover & pressed state in light mode.
diff --git a/.changeset/bumpy-keys-pay.md b/.changeset/bumpy-keys-pay.md
deleted file mode 100644
index fdd698fd7b..0000000000
--- a/.changeset/bumpy-keys-pay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-gitlab': patch
----
-
-Added new `gitlab:group:access` scaffolder action to add or remove users and groups as members of GitLab groups. The action supports specifying members via `userIds` and/or `groupIds` array parameters, configurable access levels (Guest, Reporter, Developer, Maintainer, Owner), and defaults to the 'add' action when not specified.
diff --git a/.changeset/by-refs-predicate-backend.md b/.changeset/by-refs-predicate-backend.md
deleted file mode 100644
index a2a0346122..0000000000
--- a/.changeset/by-refs-predicate-backend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Added support for predicate-based filtering on the `/entities/by-refs` endpoint via the `query` field in the request body. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators.
diff --git a/.changeset/by-refs-predicate-client.md b/.changeset/by-refs-predicate-client.md
deleted file mode 100644
index 5ed136fbe1..0000000000
--- a/.changeset/by-refs-predicate-client.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-client': minor
----
-
-Added support for the `query` field in `getEntitiesByRefs` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators.
diff --git a/.changeset/calm-vans-play.md b/.changeset/calm-vans-play.md
deleted file mode 100644
index 0b7571da7b..0000000000
--- a/.changeset/calm-vans-play.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Migrated all components from `useStyles` to `useDefinition` hook. Exported `OwnProps` types for each component, enabling better type composition for consumers.
-
-**Affected components:** Avatar, Checkbox, Container, Dialog, FieldError, FieldLabel, Flex, FullPage, Grid, HeaderPage, Link, Menu, PasswordField, PluginHeader, Popover, RadioGroup, SearchField, Select, Skeleton, Switch, Table, TablePagination, Tabs, TagGroup, Text, TextField, ToggleButton, ToggleButtonGroup, Tooltip, VisuallyHidden
diff --git a/.changeset/card-hybrid-click.md b/.changeset/card-hybrid-click.md
deleted file mode 100644
index 48343c72a7..0000000000
--- a/.changeset/card-hybrid-click.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed interactive cards so that CardBody can scroll when the card has a constrained height. Previously, the overlay element blocked scroll events.
-
-**Affected components:** Card
diff --git a/.changeset/catalog-entity-page-no-header.md b/.changeset/catalog-entity-page-no-header.md
new file mode 100644
index 0000000000..51cda8f087
--- /dev/null
+++ b/.changeset/catalog-entity-page-no-header.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Disabled the default page layout header for the catalog entity page in the new frontend system. The entity page already renders its own header through the `EntityHeader` extension, so the page layout header was redundant.
diff --git a/.changeset/catalog-exists-query-optimization.md b/.changeset/catalog-exists-query-optimization.md
new file mode 100644
index 0000000000..e0eb2cbb31
--- /dev/null
+++ b/.changeset/catalog-exists-query-optimization.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Improved catalog entity filter query performance by switching from `IN (subquery)` to `EXISTS (correlated subquery)` patterns. This enables PostgreSQL semi-join optimizations and fixes `NOT IN` NULL-semantics pitfalls by using `NOT EXISTS` instead.
diff --git a/.changeset/catalog-graph-nfs-page.md b/.changeset/catalog-graph-nfs-page.md
new file mode 100644
index 0000000000..fac437c641
--- /dev/null
+++ b/.changeset/catalog-graph-nfs-page.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-graph': patch
+---
+
+Added `title` and `icon` to the new frontend system plugin definition.
diff --git a/.changeset/catalog-import-nfs-page.md b/.changeset/catalog-import-nfs-page.md
new file mode 100644
index 0000000000..2944565205
--- /dev/null
+++ b/.changeset/catalog-import-nfs-page.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-import': patch
+---
+
+Added `title` and `icon` to the new frontend system plugin definition.
diff --git a/.changeset/catalog-search-table-sync.md b/.changeset/catalog-search-table-sync.md
new file mode 100644
index 0000000000..3a3bcea96a
--- /dev/null
+++ b/.changeset/catalog-search-table-sync.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Reduced search table write churn during stitching by syncing only changed rows instead of doing a full delete and re-insert. On Postgres this uses a single writable CTE, on MySQL a temporary table merge with deadlock retry, and on SQLite the previous bulk replace.
diff --git a/.changeset/chatty-cups-create.md b/.changeset/chatty-cups-create.md
new file mode 100644
index 0000000000..0fa05b14f3
--- /dev/null
+++ b/.changeset/chatty-cups-create.md
@@ -0,0 +1,24 @@
+---
+'@backstage/ui': minor
+---
+
+**BREAKING**: The `Header` component's `tabs` prop now uses `HeaderNavTabItem[]` instead of `HeaderTab[]`. Tabs render as a `
-
+
Components
{components.map(item => {
@@ -92,6 +92,29 @@ export const Navigation = ({ onLinkClick }: NavigationProps) => {
);
})}
+
+ Hooks
+
+ {hooks.map(item => {
+ const isActive = pathname === `/hooks/${item.slug}`;
+ return (
+
+ {item.title}
+
+ {item.status === 'alpha' && 'Alpha'}
+ {item.status === 'beta' && 'Beta'}
+ {item.status === 'inProgress' && 'In Progress'}
+ {item.status === 'stable' && 'Stable'}
+ {item.status === 'deprecated' && 'Deprecated'}
+
+
+ );
+ })}
>
);
};
diff --git a/docs-ui/src/utils/changelog.ts b/docs-ui/src/utils/changelog.ts
index a99c0e8335..21ffa93651 100644
--- a/docs-ui/src/utils/changelog.ts
+++ b/docs-ui/src/utils/changelog.ts
@@ -1,4 +1,6 @@
export * from './types';
+import { changelog_0_13_0 } from './changelogs/v0.13.0';
+import { changelog_0_12_0 } from './changelogs/v0.12.0';
import { changelog_0_11_0 } from './changelogs/v0.11.0';
import { changelog_0_10_0 } from './changelogs/v0.10.0';
import { changelog_0_9_1 } from './changelogs/v0.9.1';
@@ -18,6 +20,8 @@ import { changelog_0_2_0 } from './changelogs/v0.2.0';
import { changelog_0_1_0 } from './changelogs/v0.1.0';
export const changelog = [
+ ...changelog_0_13_0,
+ ...changelog_0_12_0,
...changelog_0_11_0,
...changelog_0_10_0,
...changelog_0_9_1,
diff --git a/docs-ui/src/utils/changelogs/v0.12.0.ts b/docs-ui/src/utils/changelogs/v0.12.0.ts
new file mode 100644
index 0000000000..f83920c36f
--- /dev/null
+++ b/docs-ui/src/utils/changelogs/v0.12.0.ts
@@ -0,0 +1,526 @@
+import type { ChangelogProps } from '../types';
+
+export const changelog_0_12_0: ChangelogProps[] = [
+ {
+ components: ['alert'],
+ version: '0.12.0',
+ prs: ['32711'],
+ description: `**BREAKING**: Alert no longer accepts a \`surface\` prop
+
+ The Alert component's background is now driven entirely by its \`status\` prop. The \`surface\` prop has been removed.
+
+ \`\`\`diff
+ -
+ +
+ \`\`\``,
+ breaking: true,
+ commitSha: '46a9adc',
+ },
+ {
+ components: [],
+ version: '0.12.0',
+ prs: ['32723'],
+ description: `**BREAKING**: Removed gray scale tokens and renamed background surface tokens to neutral tokens
+
+ The \`--bui-gray-1\` through \`--bui-gray-8\` tokens have been removed. The \`--bui-bg-surface-*\` and \`--bui-bg-neutral-on-surface-*\` tokens have been replaced by a unified \`--bui-bg-neutral-*\` scale.`,
+ migration: `Replace surface tokens directly:
+
+\`\`\`diff
+- background: var(--bui-bg-surface-0);
++ background: var(--bui-bg-neutral-0);
+\`\`\`
+
+Replace on-surface tokens shifted by +1:
+
+\`\`\`diff
+- background: var(--bui-bg-neutral-on-surface-0);
++ background: var(--bui-bg-neutral-1);
+\`\`\`
+
+Replace gray tokens 1-4 with neutral equivalents (\`--bui-gray-5\` through \`--bui-gray-8\` have no direct replacement):
+
+\`\`\`diff
+- background: var(--bui-gray-1);
++ background: var(--bui-bg-neutral-1);
+\`\`\``,
+ breaking: true,
+ commitSha: 'b63c25b',
+ },
+ {
+ components: [
+ 'box',
+ 'button',
+ 'button-icon',
+ 'button-link',
+ 'toggle-button',
+ 'card',
+ 'flex',
+ 'grid',
+ ],
+ version: '0.12.0',
+ prs: ['32711'],
+ description: `**BREAKING**: Replaced \`Surface\` / \`onSurface\` system with new provider/consumer background system
+
+ The old \`Surface\` type (\`'0'\`–\`'3'\`, \`'auto'\`) and its associated props (\`surface\`, \`onSurface\`) have been replaced by a provider/consumer \`bg\` architecture.
+
+ **Types:**
+
+ - \`ContainerBg\` — \`'neutral-1'\` | \`'neutral-2'\` | \`'neutral-3'\` | \`'danger'\` | \`'warning'\` | \`'success'\`
+ - \`ProviderBg\` — \`ContainerBg | 'neutral-auto'\`
+
+ Consumer components (e.g. Button) inherit the parent's \`bg\` via \`data-on-bg\`, and CSS handles the visual step-up. See "Neutral level capping" below for details on how levels are bounded.
+
+ **Hooks:**
+
+ - \`useBgProvider(bg?)\` — for provider components. Returns \`{ bg: undefined }\` when no \`bg\` is given (transparent). Supports \`'neutral-auto'\` to auto-increment from the parent context.
+ - \`useBgConsumer()\` — for consumer components. Returns the parent container's \`bg\` unchanged.
+
+ **Component roles:**
+
+ - **Provider-only** (Box, Flex, Grid): set \`data-bg\`, wrap children in \`BgProvider\`. **Transparent by default** — they do _not_ auto-increment; pass \`bg="neutral-auto"\` explicitly if you want automatic neutral stepping.
+ - **Consumer-only** (Button, ButtonIcon, ButtonLink): set \`data-on-bg\`, inherit the parent container's \`bg\` unchanged.
+ - **Provider + Consumer** (Card): sets both \`data-bg\` and \`data-on-bg\`, wraps children. Card passes \`bg="neutral-auto"\` to its inner Box, so it auto-increments from the parent context.
+
+ **Neutral level capping:**
+
+ Provider components cap at \`neutral-3\`. There is no \`neutral-4\` prop value. The \`neutral-4\` level exists only in consumer component CSS — for example, a Button sitting on a \`neutral-3\` surface uses \`neutral-4\` tokens internally via \`data-on-bg\`.`,
+ migration: `Rename the \`surface\` prop to \`bg\` on provider components and update values:
+
+\`\`\`diff
+-
++
+
+-
++
+
+-
++
+
+-
++
+\`\`\`
+
+Remove \`onSurface\` from consumer components — they now always inherit from the parent container:
+
+\`\`\`diff
+-