PageSourceSearch

https://backstage.io/assets/js/3f874808.55c47958.js

js backstage.io collected 2026-09-24 08:26:23 UTC 35,843 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkbackstage_microsite=self.webpackChunkbackstage_microsite||[]).push([["1076"],{654928(e,t,i){i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var s=i(833326),n=i(474848),a=i(28453);let r={id:"v1.53.0",title:"v1.53.0",description:"Backstage Release v1.53.0"},o,c={},d=[{value:"Highlights",id:"highlights",level:2},{value:"<strong>BREAKING</strong>: Removed deprecated SSE transport from MCP actions",id:"breaking-removed-deprecated-sse-transport-from-mcp-actions",level:3},{value:"<strong>BREAKING</strong>: Configuration schemas now resolve imported types",id:"breaking-configuration-schemas-now-resolve-imported-types",level:3},{value:"<strong>BREAKING</strong>: Stricter OAuth redirect URI and CIMD allowlist matching",id:"breaking-stricter-oauth-redirect-uri-and-cimd-allowlist-matching",level:3},{value:"<strong>BREAKING ALPHA</strong>: Catalog entity page migrated to BUI",id:"breaking-alpha-catalog-entity-page-migrated-to-bui",level:3},{value:"<strong>BREAKING</strong>: Removed legacy proxy agent bootstrap",id:"breaking-removed-legacy-proxy-agent-bootstrap",level:3},{value:"<strong>BREAKING</strong>: Replaced Optic with oasdiff for OpenAPI tooling",id:"breaking-replaced-optic-with-oasdiff-for-openapi-tooling",level:3},{value:"Backstage UI updates",id:"backstage-ui-updates",level:3},{value:"Database-backed user settings storage",id:"database-backed-user-settings-storage",level:3},{value:"Comma-separated <code>BACKSTAGE_ENV</code> for config stacking",id:"comma-separated-backstage_env-for-config-stacking",level:3},{value:"Azure DevOps webhook ingress",id:"azure-devops-webhook-ingress",level:3},{value:"Token revocation support for CIMD clients",id:"token-revocation-support-for-cimd-clients",level:3},{value:"CIMD promoted to stable configuration",id:"cimd-promoted-to-stable-configuration",level:3},{value:"Redis cache store connection options",id:"redis-cache-store-connection-options",level:3},{value:"Additional fixes and improvements",id:"additional-fixes-and-improvements",level:3},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Contributors",id:"contributors",level:2},{value:"Upgrade path",id:"upgrade-path",level:2},{value:"Links and References",id:"links-and-references",level:2}];function h(e){let t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["These are the release notes for the v1.53.0 release of ",(0,n.jsx)(t.a,{href:"https://backstage.io/",children:"Backstage"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done."}),"\n",(0,n.jsx)(t.h2,{id:"highlights",children:"Highlights"}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-removed-deprecated-sse-transport-from-mcp-actions",children:[(0,n.jsx)(t.strong,{children:"BREAKING"}),": Removed deprecated SSE transport from MCP actions"]}),"\n",(0,n.jsxs)(t.p,{children:["The deprecated Server-Sent Events (SSE) MCP transport has been removed from ",(0,n.jsx)(t.code,{children:"@backstage/plugin-mcp-actions-backend"}),". MCP clients must use the Streamable HTTP endpoint at ",(0,n.jsx)(t.code,{children:"/api/mcp-actions/v1"})," or a configured named-server endpoint."]}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-configuration-schemas-now-resolve-imported-types",children:[(0,n.jsx)(t.strong,{children:"BREAKING"}),": Configuration schemas now resolve imported types"]}),"\n",(0,n.jsxs)(t.p,{children:["Configuration schemas declared in TypeScript now resolve and validate imported types in ",(0,n.jsx)(t.code,{children:"@backstage/config-loader"}),", instead of treating them as unconstrained values. Invalid imports now cause schema loading to fail. This may surface previously undetected schema issues in plugins that import types in their ",(0,n.jsx)(t.code,{children:"config.d.ts"})," files."]}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-stricter-oauth-redirect-uri-and-cimd-allowlist-matching",children:[(0,n.jsx)(t.strong,{children:"BREAKING"}),": Stricter OAuth redirect URI and CIMD allowlist matching"]}),"\n",(0,n.jsxs)(t.p,{children:["The OAuth redirect URI and client ID metadata document allowlists in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-auth-backend"})," now match patterns against each URL component separately instead of against the full URL string. Wildcards no longer match across the host and path boun
1dary, patterns must include an explicit protocol and are otherwise rejected as invalid configuration instead of being silently ignored, and redirect URIs that contain embedded credentials are always rejected."]}),"\n",(0,n.jsxs)(t.p,{children:["A wildcard port also no longer implicitly matches every path: a pattern such as ",(0,n.jsx)(t.code,{children:"http://localhost:*"})," now only matches the root path. Use ",(0,n.jsx)(t.code,{children:"http://localhost:*/*"})," to allow any port and any path. The built-in loopback defaults have been updated accordingly, so this only affects explicitly configured patterns."]}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-alpha-catalog-entity-page-migrated-to-bui",children:[(0,n.jsx)(t.strong,{children:"BREAKING ALPHA"}),": Catalog entity page migrated to BUI"]}),"\n",(0,n.jsxs)(t.p,{children:["The new frontend system Catalog entity page has been migrated to Backstage UI components with several breaking alpha changes in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-catalog"})," and ",(0,n.jsx)(t.code,{children:"@backstage/plugin-catalog-react"}),":"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The entity page now uses a BUI page header with entity tags, title, metadata, favorite and context-menu actions, and Catalog-composed navigation. Existing alpha opaque entity header customizations continue to render through a temporary per-entity legacy fallback. Migrate those customizations to the new BUI-ready entity header layout extension point."}),"\n",(0,n.jsxs)(t.li,{children:["The entity context menu has been migrated to BUI with Remix icons. The ",(0,n.jsx)(t.code,{children:"EntityContextMenuItemBlueprint"})," now outputs menu item data instead of a rendered MUI element. The ",(0,n.jsx)(t.code,{children:"icon"})," type is now ",(0,n.jsx)(t.code,{children:"IconElement"})," \u2014 we recommend using Remix icons."]}),"\n",(0,n.jsx)(t.li,{children:"A new alpha entity header layout extension point has been added, providing Catalog-composed tabs and the active tab ID for custom entity headers. The existing opaque entity header extension point is deprecated."}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["New translation keys have been added: ",(0,n.jsx)(t.code,{children:"entityLabels.systemLabel"}),", ",(0,n.jsx)(t.code,{children:"entityLabels.domainLabel"}),", ",(0,n.jsx)(t.code,{children:"entityLabels.partOfLabel"}),", and ",(0,n.jsx)(t.code,{children:"entityContextMenu.moreButtonAriaLabel"})," (default changed from ",(0,n.jsx)(t.code,{children:"more"})," to ",(0,n.jsx)(t.code,{children:"More actions"}),"). Apps that provide Catalog translations should add entries for these new messages."]}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-removed-legacy-proxy-agent-bootstrap",children:[(0,n.jsx)(t.strong,{children:"BREAKING"}),": Removed legacy proxy agent bootstrap"]}),"\n",(0,n.jsxs)(t.p,{children:["The deprecated ",(0,n.jsx)(t.code,{children:"bootstrapEnvProxyAgents"})," export has been removed from ",(0,n.jsx)(t.code,{children:"@backstage/cli-common"}),", along with the ",(0,n.jsx)(t.code,{children:"global-agent"})," and ",(0,n.jsx)(t.code,{children:"undici"})," dependencies. The ",(0,n.jsx)(t.code,{children:"versions:bump"})," command in ",(0,n.jsx)(t.code,{children:"@backstage/cli-module-migrate"})," and newly created apps from ",(0,n.jsx)(t.code,{children:"@backstage/create-app"})," no longer bootstrap legacy proxy agents either. Use Node.js built-in proxy support by setting ",(0,n.jsx)(t.code,{children:"NODE_USE_ENV_PROXY=1"})," alongside your ",(0,n.jsx)(t.code,{children:"HTTP_PROXY"}),"/",(0,n.jsx)(t.code,{children:"HTTPS_PROXY"}),"/",(0,n.jsx)(t.code,{children:"NO_PROXY"})," environment variables instead. See the ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/tutorials/corporate-proxy/",children:"corporate proxy guide"})," for details."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/jonkoops",children:"@jonkoops"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/33444",children:"#33444"})]}),"\n",(0,n.jsxs)(t.h3,{id:"breaking-replaced-optic-with-oasdiff-for-openapi-tooling",children:[(0,n.jsx)(t.strong,{children:"BREAKING"}),": Replaced Optic with oasdiff for OpenAPI tooling"]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"@useoptic/optic"})," and ",(0,n.jsx)(t.code,{children:"@useoptic/openapi-utilities"})," have been replaced with ",(0,n.jsx)(t.code,{children:"oasdiff"})," in ",(0,n.jsx)(t.code,{children:"@backstage/repo-tools"})," for OpenAPI breaking change detection. To migrate, remove ",(0,n.jsx)(t.code,{children:"@useoptic/optic"})," from your root ",(0,n.jsx)(t.code,{children:"package.json"})," and install the ",(0,n.jsx)(t.code,{children:"oasdiff"})," CLI \u2014 see ",(0,n.jsx)(t.a,{href:"https://github.com/oasdiff/oasdiff#installation",children:"oasdiff installation"})," for instructions."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"package schema openapi diff"})," command now uses ",(0,n.jsx)(t.code,{children:"oasdiff"})," under the hood. The ",(0,n.jsx)(t.code,{children:"--since"}),", ",(0,n.jsx)(t.code,{children:"--json"}),", and ",(0,n.jsx)(t.code,{children:"--ignore"})," flags continue to work, but the output format has changed to match ",(0,n.jsx)(t.code,{children:"oasdiff"}),"'s native output. The ",(0,n.jsx)(t.code,{children:"repo schema openapi diff"})," command now automatically detects packages with a changed ",(0,n.jsx)(t.code,{children:"src/schema/openapi.yaml"})," \u2014 packages no longer need a ",(0,n.jsx)(t.code,{children:'"diff"'})," script in their ",(0,n.jsx)(t.code,{children:"package.json"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"package schema openapi init"})," and ",(0,n.jsx)(t.code,{children:"repo schema openapi test"}
1)," commands have been removed. Runtime validation is still available via ",(0,n.jsx)(t.code,{children:"wrapServer"})," from ",(0,n.jsx)(t.code,{children:"@backstage/backend-openapi-utils/testUtils"}),". The previously deprecated ",(0,n.jsx)(t.code,{children:"wrapInOpenApiTestServer"})," function has also been removed from ",(0,n.jsx)(t.code,{children:"@backstage/backend-openapi-utils"})," \u2014 use ",(0,n.jsx)(t.code,{children:"wrapServer"})," instead."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/jonkoops",children:"@jonkoops"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34452",children:"#34452"})]}),"\n",(0,n.jsx)(t.h3,{id:"backstage-ui-updates",children:"Backstage UI updates"}),"\n",(0,n.jsx)(t.p,{children:"This release includes several additions to Backstage UI:"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Breadcrumbs:"})," A new ",(0,n.jsx)(t.code,{children:"breadcrumbs"})," prop has been added to ",(0,n.jsx)(t.code,{children:"PluginHeader"})," that renders a navigation breadcrumb trail, visually hiding the plugin title when breadcrumbs are present. Breadcrumbs collapse middle segments when five or more are present and show tooltips for truncated text. On the framework side, a ",(0,n.jsx)(t.code,{children:"useBreadcrumbEntries"})," hook, ",(0,n.jsx)(t.code,{children:"BreadcrumbEntry"})," component, and ",(0,n.jsx)(t.code,{children:"BreadcrumbsRegistryProvider"})," have been added for managing breadcrumb trails across plugin pages using the new frontend system. Sub-pages created with ",(0,n.jsx)(t.code,{children:"PageBlueprint"})," now automatically contribute to ",(0,n.jsx)(t.code,{children:"PluginHeader"})," breadcrumbs without extra wiring."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/clairep94",children:"@clairep94"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34587",children:"#34587"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34588",children:"#34588"}),", and ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34682",children:"#34682"})]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"New components:"})," A ",(0,n.jsx)(t.code,{children:"TextAreaField"})," component has been added for multi-line text input, following the same conventions as ",(0,n.jsx)(t.code,{children:"TextField"})," with support for a label, secondary label, and description. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/vanessaliu",children:"@vanessaliu"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34611",children:"#34611"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Re-exports:"})," The types ",(0,n.jsx)(t.code,{children:"Selection"}),", ",(0,n.jsx)(t.code,{children:"SortDirection"}),", and ",(0,n.jsx)(t.code,{children:"Key"})," (type-only), and the runtime export ",(0,n.jsx)(t.code,{children:"Focusable"})," from ",(0,n.jsx)(t.code,{children:"react-aria-components"})," are now available directly from ",(0,n.jsx)(t.code,{children:"@backstage/ui"}),", avoiding version mismatches. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/sspadotto",children:"@sspadotto"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34540",children:"#34540"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Check the ",(0,n.jsx)(t.a,{href:"https://ui.backstage.io/changelog",children:"BUI Changelog"})," for more details."]}),"\n",(0,n.jsx)(t.h3,{id:"database-backed-user-settings-storage",children:"Database-backed user settings storage"}),"\n",(0,n.jsxs)(t.p,{children:["A new ",(0,n.jsx)(t.code,{children:"@backstage/plugin-app-module-user-settings"})," frontend module has been added that provides database-backed user settings storage. When installed, it overrides the default browser local storage with the user settings backend, enabling settings to persist across devices and sessions. Newly created apps from ",(0,n.jsx)(t.code,{children:"@backstage/create-app"})," now include this module out of the box."]}),"\n",(0,n.jsxs)(t.h3,{id:"comma-separated-backstage_env-for-config-stacking",children:["Comma-separated ",(0,n.jsx)(t.code,{children:"BACKSTAGE_ENV"})," for config stacking"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"BACKSTAGE_ENV"})," environment variable in ",(0,n.jsx)(t.code,{children:"@backstage/config-loader"})," now supports comma-separated values, allowing multiple environment-specific configuration files to be loaded and stacked at startup. For example, setting ",(0,n.jsx)(t.code,{children:"BACKSTAGE_ENV=e2e-test,production"})," will load ",(0,n.jsx)(t.code,{children:"app-config.e2e-test.yaml"})," and ",(0,n.jsx)(t.code,{children:"app-config.production.yaml"})," in addition to the base ",(0,n.jsx)(t.code,{children:"app-config.yaml"}),", with later environments taking priority. Local override files (",(0,n.jsx)(t.code,{children:".local.yaml"}),") are always loaded after all non-local files."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/jabrks",children:"@jabrks"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34498",children:"#34498"})]}),"\n",(0,n.jsx)(t.h3,{id:"azure-devops-webhook-ingress",children:"Azure DevOps webhook ingress"}),"\n",(0,n.jsxs)(t.p,{children:["A new HTTP POST webhook ingress endpoint has been added to ",(0,n.jsx)(t.code,{children:"@backstage/plugin-events-backend-module-azure"})," for Azure DevOps events, matching the pattern established by the GitHub events module. The ingress endpoint is only registered when ",(0,n.jsx)(t.code,{children:"events.modules.azureDevOps.webhookSecret"})," is configured, and incoming requests are validated against the ",(0,n.jsx)(t.code,{children:"x-ado-webhook-secret"})," header using timing-safe comparison."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/rishim-personal",children:"@rishim-personal"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34691",children:"#34691"})]}),"\n",(0,n.jsx)(t.h3,{id:"token-revocation-support-for-cimd-clients",children:"Token revocation support for CIMD clients"}),"\n",(0,n.jsxs)(t.p,{children:["Token revocation support has been added for clients using client ID metadata documents (CIMD) in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-auth-backend"}),". The ",(0,n.jsx)(t.code,{children:"/v1/revoke"})," endpoint is now available whenever dynamic client registration or CIMD are enabled, and is advertised through ",(0,n.jsx)(t.code,{children:"revocation_endpoint"})," in the OpenID provider configuration."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/djamaile",children:"@djamaile"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34779",children:"#34779"})]}),"\n",(0,n.jsx)(t.h3,{id:"cimd-promoted-to-stable-configuration",children:"CIMD promoted to stable configuration"}),"\n",(0,n.jsxs)(t.p,{children:["Client ID Metadata Documents (CIMD) in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-auth-backend"})," have been promoted to the stable ",(0,n.jsx)(t.code,{children:"auth.clientIdMetadataDocuments"})," configuration key. The previous ",(0,n.jsx)(t.code,{children:"auth.experimentalClientIdMetadataDocuments"})," key remains supported as a deprecated alias. Dynamic Client Registration now logs a deprecation warning when enabled \u2014 users should migrate to CIMD. Newly created apps from ",(0,n.jsx)(t.code,{children:"@backstage/create-app"}
1)," now use the stable CIMD configuration by default and no longer advertise Dynamic Client Registration."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/djamaile",children:"@djamaile"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34810",children:"#34810"})]}),"\n",(0,n.jsx)(t.h3,{id:"redis-cache-store-connection-options",children:"Redis cache store connection options"}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"connection"})," config option for the Redis cache store in ",(0,n.jsx)(t.code,{children:"@backstage/backend-defaults"})," now accepts either a string URL or an object with additional connection options passed directly to the underlying client. This allows configuring options like ",(0,n.jsx)(t.code,{children:"pingInterval"})," without needing dedicated config fields. For clustered Redis, the connection object properties are merged into cluster defaults."]}),"\n",(0,n.jsxs)(t.p,{children:["Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/AlexandruCatalinPitaLSEG",children:"@AlexandruCatalinPitaLSEG"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34337",children:"#34337"})]}),"\n",(0,n.jsx)(t.h3,{id:"additional-fixes-and-improvements",children:"Additional fixes and improvements"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Fixed the TechDocs reader requesting documentation metadata in a tight loop when the request fails permanently (e.g. 404), which previously flooded the backend with requests and caused the page to flicker. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/officialasishkumar",children:"@officialasishkumar"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34356",children:"#34356"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed ",(0,n.jsx)(t.code,{children:"DatabaseTaskStore.list"})," returning ",(0,n.jsx)(t.code,{children:"totalTasks"})," as a string on PostgreSQL, which caused the ",(0,n.jsx)(t.code,{children:"list-scaffolder-tasks"})," action to fail output validation. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/mitsukado-shinagawa",children:"@mitsukado-shinagawa"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34479",children:"#34479"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed Bitbucket Cloud and Bitbucket Server hosts not rendering the correct repository and branch picker fields in the Scaffolder. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/sikehish",children:"@sikehish"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34111",children:"#34111"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed a crash when exporting the catalog with unset filters. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/lexhuismans-wk",children:"@lexhuismans-wk"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34745",children:"#34745"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed a regression where ",(0,n.jsx)(t.code,{children:"EntityTypePicker"}),"'s ",(0,n.jsx)(t.code,{children:"initialFilter"})," prop was being cleared when used alongside ",(0,n.jsx)(t.code,{children:"EntityKindPicker"})," inside ",(0,n.jsx)(t.code,{children:"EntityListProvider"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Fixed scheduled tasks that were initially registered with a manual trigger and later re-registered with a duration or cron cadence never being scheduled to run."}),"\n",(0,n.jsx)(t.li,{children:"Fixed duplicate React key warnings in the ownership card when different entity kinds share the same type, and in TechDocs when documentation entities share a name across different namespaces or kinds."}),"\n",(0,n.jsxs)(t.li,{children:["Fixed the published configuration schema in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-kubernetes-react"})," referencing a file excluded from the package, which caused configuration schema extraction to fail. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/dyatko",children:"@dyatko"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34721",children:"#34721"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed compatibility with yeoman-environment v4+, which is ESM-only, in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-scaffolder-backend-module-yeoman"}),". Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/Elhefes",children:"@Elhefes"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/33623",children:"#33623"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Fixed the default fetch API to support discovery endpoints that only define an internal target."}),"\n",(0,n.jsxs)(t.li,{children:["Fixed TechDocs pages sometimes rendering blank due to sanitizer hooks registered by other plugins. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/Dasmat13",children:"@Dasmat13"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34811",children:"#34811"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed the table filters sidebar rendering a stray ",(0,n.jsx)(t.code,{children:"0"})," when no filters are configured. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/ATKasem",children:"@ATKasem"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34842",children:"#34842"}),"."]}
1),"\n",(0,n.jsxs)(t.li,{children:['Fixed an issue where two "Notifications" links were displayed in the sidebar for newly created apps. Contributed by ',(0,n.jsx)(t.a,{href:"https://github.com/apc-kamezaki",children:"@apc-kamezaki"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34815",children:"#34815"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Fixed MySQL test database failures in ",(0,n.jsx)(t.code,{children:"@backstage/backend-test-utils"})," by pinning the Docker image to ",(0,n.jsx)(t.code,{children:"mysql:8.4"})," and replacing a startup flag removed in MySQL 8.4."]}),"\n",(0,n.jsxs)(t.li,{children:["Pinned ",(0,n.jsx)(t.code,{children:"@types/node"})," to ",(0,n.jsx)(t.code,{children:"22.20.0"})," in the ",(0,n.jsx)(t.code,{children:"@backstage/create-app"})," seed lockfile to prevent ",(0,n.jsx)(t.code,{children:"@types/[email protected]"})," from breaking ",(0,n.jsx)(t.code,{children:"tsc:full"})," builds."]}),"\n",(0,n.jsxs)(t.li,{children:["Added support for AWS PrivateLink for Amazon S3 in ",(0,n.jsx)(t.code,{children:"@backstage/backend-defaults"}),". Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/zcmander",children:"@zcmander"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34467",children:"#34467"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Added an optional ",(0,n.jsx)(t.code,{children:"prompt"})," setting for Auth0 authorization requests \u2014 set it to ",(0,n.jsx)(t.code,{children:"auto"})," to let Auth0 determine whether the user needs to be prompted. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/jroebu14",children:"@jroebu14"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34643",children:"#34643"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Added ",(0,n.jsx)(t.code,{children:"screen_hint"})," and ",(0,n.jsx)(t.code,{children:"login_hint"})," parameter forwarding for the Auth0 authentication provider, enabling invitation flows that direct users to the signup screen and pre-fill the email field. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/UsainBloot",children:"@UsainBloot"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34817",children:"#34817"}),"."]}
1),"\n",(0,n.jsxs)(t.li,{children:["Added support for passing custom flags to embedded postgres processes via ",(0,n.jsx)(t.code,{children:"backend.database.connection.flags.postgres"})," and ",(0,n.jsx)(t.code,{children:"backend.database.connection.flags.initdb"})," configuration. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/mtlewis",children:"@mtlewis"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34675",children:"#34675"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Added a default implementation for the connections service so backend modules can depend on it without requiring apps to explicitly install the connections service factory. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/neoreddog",children:"@neoreddog"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34769",children:"#34769"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Extension ",(0,n.jsx)(t.code,{children:"if"})," predicates now support specifying an ",(0,n.jsx)(t.code,{children:"action"})," attribute in the permission reference using the ",(0,n.jsx)(t.code,{children:"#"})," separator (e.g. ",(0,n.jsx)(t.code,{children:"catalog.entity.read#read"}),")."]}),"\n",(0,n.jsxs)(t.li,{children:["The shared ESLint configuration now reports unused imports in ",(0,n.jsx)(t.code,{children:"config.d.ts"})," configuration schema files, catching stray imports that could break schema loading for published packages. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/dyatko",children:"@dyatko"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34722",children:"#34722"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Migrated the ",(0,n.jsx)(t.code,{children:"CopyTextButton"})," component from Material-UI to Backstage UI. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/samarthsinh2660",children:"@samarthsinh2660"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/32855",children:"#32855"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Improved caching for Module Federation remote builds by extracting dependencies into separate content-hashed chunks."}),"\n",(0,n.jsx)(t.li,{children:"Increased generated frontend static asset filename hashes to 12 characters to reduce collision risk across long-lived cached builds."}),"\n",(0,n.jsx)(t.li,{children:"Package preparation now converts TypeScript configuration schemas to separate JSON files."}),"\n",(0,n.jsx)(t.li,{children:"Improved readability of the AWS S3 URL parser by splitting the monolithic regex into two separate patterns with named capture groups."}),"\n",(0,n.jsxs)(t.li,{children:["Added an option to prevent duplicate widget additions in the homepage and added an empty state for the Add Widget dialog. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/karthikjeeyar",children:"@karthikjeeyar"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/31323",children:"#31323"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Added support for wildcard plugin entries in frontend discovery endpoints, matching the backend discovery behavior."}),"\n",(0,n.jsx)(t.li,{children:"Custom catalog entity kinds are now included in the search page kind filter."}),"\n",(0,n.jsx)(t.li,{children:"The TechDocs plugin now automatically adds the Documentation result type to the Search page when it is installed, and the Search page no longer shows the Documentation result type unless a plugin provides it."}),"\n",(0,n.jsxs)(t.li,{children:["Configuring ",(0,n.jsx)(t.code,{children:"userGroupMember.path"})," together with ",(0,n.jsx)(t.code,{children:"user.filter"})," in ",(0,n.jsx)(t.code,{children:"@backstage/plugin-catalog-backend-module-msgraph"})," is now rejected with a configuration error, as the two options are mutually exclusive."]}),"\n",(0,n.jsxs)(t.li,{children:["Added a ",(0,n.jsx)(t.code,{children:"title"})," field to connection auth methods in ",(0,n.jsx)(t.code,{children:"@backstage/connections"}),", providing a human-readable display name for each configured authentication option."]}),"\n",(0,n.jsxs)(t.li,{children:["Synced ",(0,n.jsx)(t.code,{children:"zod-validation-error"})," versions between packages. Contributed by ",(0,n.jsx)(t.a,{href:"https://github.com/deejay1",children:"@deejay1"})," in ",(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/pull/34224",children:"#34224"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"security-fixes",children:"Security Fixes"}),"\n",(0,n.jsx)(t.p,{children:"This release does not contain any security fixes."}),"\n",(0,n.jsx)(t.h2,{id:"contributors",children:"Contributors"}),"\n",(0,n.jsxs)(t.p,{children:["Big shoutout to all 25 of you amazing folks who chipped in on this release: ",(0,n.jsx)(t.a,{href:"https://github.com/ATKasem",children:"@ATKasem"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/AlexandruCatalinPitaLSEG",children:"@AlexandruCatalinPitaLSEG"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/Dasmat13",children:"@Dasmat13"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/Elhefes",children:"@Elhefes"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/UsainBloot",children:"@UsainBloot"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/apc-kamezaki",children:"@apc-kamezaki"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/clairep94",children:"@clairep94"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/deejay1",children:"@deejay1"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/djamaile",children:"@djamaile"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/dyatko",children:"@dyatko"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/jabrks",children:"@jabrks"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/jonkoops",children:"@jonkoops"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/jroebu14",children:"@jroebu14"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/karthikjeeyar",children:"@karthikjeeyar"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/lexhuismans-wk",children:"@lexhuismans-wk"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/mitsukado-shinagawa",children:"@mitsukado-shinagawa"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/mtlewis",children:"@mtlewis"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/neoreddog",children:"@neoreddog"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/officialasishkumar",children:"@officialasishkumar"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/rishim-personal",children:"@rishim-personal"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/samarthsinh2660",children:"@samarthsinh2660"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/sikehish",children:"@sikehish"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/sspadotto",children:"@sspadotto"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/vanessaliu",children:"@vanessaliu"}),", ",(0,n.jsx)(t.a,{href:"https://github.com/zcmander",children:"@zcmander"})]}),"\n",(0,n.jsx)(t.h2,{id:"upgrade-path",children:"Upgrade path"}),"\n",(0,n.jsxs)(t.p,{children:["We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/getting-started/keeping-backstage-updated",children:"keeping Backstage updated"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"links-and-references",children:"Links and References"}),"\n",(0,n.jsx)(t.p,{children:"Below you can find a list of links and references to help you learn about and start using this new release."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://backstage.io/",children:"Backstage official website"}),", ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/",children:"documentation"}),", and ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/getting-started/",children:"getting started guide"})]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage",children:"GitHub repository"})}),"\n",(0,n.jsxs)(t.li,{children:["Backstage's ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/overview/versioning-policy",children:"versioning and support policy"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://discord.gg/backstage-687207715902193673",children:"Community Discord"})," for discussions and support"]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/backstage/backstage/tree/master/docs/releases/v1.53.0-changelog.md",children:"Changelog"})}),"\n",(0,n.jsxs)(t.li,{children:["Backstage ",(0,n.jsx)(t.a,{href:"https://backstage.io/demos",children:"Demos"}),", ",(0,n.jsx)(t.a,{href:"https://backstage.io/blog",children:"Blog"}),", ",(0,n.jsx)(t.a,{href:"https://backstage.io/docs/overview/roadmap",children:"Roadmap"})," and ",(0,n.jsx)(t.a,{href:"https://backstage.io/plugins",children:"Plugins"})]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Sign up for our ",(0,n.jsx)(t.a,{href:"https://spoti.fi/backstagenewsletter",children:"newsletter"})," if you want to be informed about what is happening in the world of Backstage."]})]})}function l(e={}){let{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},28453(e,t,i){i.d(t,{R:()=>r,x:()=>o});var s=i(296540);let n={},a=s.createContext(n);function r(e){let t=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(a.Provider,{value:t},e.children)}},833326(e){e.exports=JSON.parse('{"id":"releases/v1.53.0","title":"v1.53.0","description":"Backstage Release v1.53.0","source":"@site/versioned_docs/version-stable/releases/v1.53.0.md","sourceDirName":"releases","slug":"/releases/v1.53.0","permalink":"/docs/releases/v1.53.0","draft":false,"unlisted":false,"editUrl":"https://github.com/backstage/backstage/edit/master/docs/releases/v1.53.0.md","tags":[],"version":"stable","frontMatter":{"id":"v1.53.0","title":"v1.53.0","description":"Backstage Release v1.53.0"},"sidebar":"releases","previous":{"title":"v1.54.0","permalink":"/docs/releases/v1.54.0"},"next":{"title":"v1.52.0","permalink":"/docs/releases/v1.52.0"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.