v1.55.0
These are the release notes for the v1.55.0 release of Backstage.
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.
Highlights
BREAKING: Removed deprecated catalog APIs and configuration
This release removes several deprecated features from @backstage/plugin-catalog-backend.
The catalog.enableRelationsCompatibility config option and its associated compatibility layer have been removed. Entity relations are now always returned in the standard format with only targetRef. If you were relying on the target field in relations, update your code to use targetRef instead.
The deprecated CodeOwnersProcessor and AnnotateScmSlugEntityProcessor have been removed. Replace their custom registrations with the corresponding community modules: @backstage-community/plugin-catalog-backend-module-codeowners and @backstage-community/plugin-catalog-backend-module-annotate-scm-slug.
Remove the deprecated catalog.stitchingStrategy.mode key from your configuration. Stitching continues to run asynchronously, with pollingInterval and stitchTimeout still supported.
BREAKING: Elasticsearch 8 upgrade
The @backstage/plugin-search-backend-module-elasticsearch package has upgraded its Elasticsearch client to version 8, requiring at least Elasticsearch 8.19 — the only 8.x release line still under support, following the end of life of Elasticsearch 7.x and earlier 8.x lines. Elasticsearch 7.x clusters are no longer supported.
If you use the elastic provider or connect to a plain Elasticsearch node, make sure your cluster is running Elasticsearch 8.19 or later before upgrading. The aws and opensearch providers keep using the OpenSearch client and are unaffected. Existing TLS settings continue to work without any configuration changes.
The methods of the ElasticSearchClientWrapper now return a normalized response that exposes body, statusCode, headers and warnings for both providers, instead of the client-specific response types. Code that relies on the raw client types or reads the meta property of a response needs to be adjusted.
Contributed by @axdotl in #34716
BREAKING: BUI routing and link navigation
Backstage UI link components have been updated to use the hosting application's client-side router, including relative destinations and the application's configured router base path, while preserving native browser navigation where required. ListRow, Tag, and table Row now retain client-side navigation when application and plugin packages load separate React Aria copies.
Anchor-based components no longer accept the React Aria render prop. BUI now owns the underlying anchor so routing behavior remains consistent across application and plugin package versions. Remove render props from ButtonLink, ComboboxItem, Link, MenuItem, MenuListBoxItem, SearchAutocompleteItem, SelectItem, and Tab. BUI now selects and renders the appropriate anchor or router link automatically.
BREAKING: TechDocs MkDocs plugin allowlist
TechDocs generation now removes MkDocs plugins outside the built-in allowlist and logs a warning before continuing the build. To retain additional plugins, review and add them to techdocs.generator.mkdocs.dangerouslyAllowAdditionalPlugins, or supply them through dangerouslyAllowAdditionalPlugins when creating the generator directly. Plugins configured through defaultPlugins are also permitted. Generation stops if the MkDocs configuration cannot be read, parsed, or updated.
BREAKING: Removed unused github:repo:create inputs
Unused inputs have been removed from the github:repo:create action schema. The following inputs were previously accepted but silently ignored: blockCreations, branch, bypassPullRequestAllowances, defaultBranch, dismissStaleReviews, gitAuthorEmail, gitAuthorName, gitCommitMessage, protectDefaultBranch, protectEnforceAdmins, requireBranchesToBeUpToDate, requireCodeOwnerReviews, requiredApprovingReviewCount, requiredCommitSigning, requiredConversationResolution, requiredLinearHistory, requiredStatusCheckContexts, requireLastPushApproval, restrictions, and sourcePath. If your templates pass any of these to github:repo:create, remove them. Most of these inputs are supported by the github:repo:push action for branch protection, git authoring, and content publishing.
Contributed by @victoriacheng15 in #35571
BREAKING: Incremental ingestion permissions
The incremental ingestion administrative routes in @backstage/plugin-catalog-backend-module-incremental-ingestion now enforce separate read and manage permissions. Installations with custom permission policies must add decisions for the new permissions.
BREAKING: Cloudflare Access provider requires audience
The Cloudflare Access auth provider now requires the application audience in its configuration. Before upgrading, set auth.providers.cfaccess.audience to the Audience (AUD) tag shown for your Backstage application in Cloudflare Zero Trust.
BREAKING: Sentry scaffolder action URL restriction
Sentry API requests in the scaffolder Sentry module are now restricted to the configured API base URL. Move custom action-level apiBaseUrl values to scaffolder.sentry.apiBaseUrl before upgrading.
Scaffolder task recovery
A new scaffolder.taskRecovery config section enables automatic recovery of scaffolder tasks that crash or time out. When enabled, tasks resume from the last completed step, task secrets are retained until the task reaches a terminal state, and completed step outputs are persisted. Actions used by recovered tasks should be idempotent or use checkpoints.
Workspace serialization for task recovery now requires installing a separate workspace provider module. For development use the new @backstage/plugin-scaffolder-backend-module-workspace-database package (50 MB limit, not recommended for production). On first startup, it migrates existing database workspace snapshots from the legacy task storage. For production use @backstage/plugin-scaffolder-backend-module-gcp or a similar external storage provider. The scaffolder rejects a configured provider that has not been installed and registered.
The new config consolidates previous experimental flags (EXPERIMENTAL_recoverTasks, EXPERIMENTAL_workspaceSerialization, EXPERIMENTAL_recoverTasksTimeout) which remain supported as fallbacks.
Contributed by @dyatko in #35224
Scaffolder permissions and credentials
A new scaffolder.requireScmUserCredentials configuration option requires user-provided credentials for supported SCM mutation and fetch actions. SCM provider modules for GitHub, GitLab, Bitbucket Cloud, Bitbucket Server, and Azure DevOps all support this setting.
The templateDryRunPermission is now applied to inline Software Template dry runs. Permission policies that deny unknown permissions must explicitly allow scaffolder.template.dry-run to retain existing dry-run access. New permissions for reading and managing catalog ingestion providers have been added to @backstage/plugin-catalog-common.
New package: @backstage/cli-module-package-manager-yarn
A new CLI module that adds backstage-cli pm verify-patches to validate Yarn patch references, local patch files, lockfile consistency, and patched Backstage package versions against the selected Backstage release. The command is included in @backstage/cli-defaults. It also reports root-level Yarn resolutions that no longer match any dependency request in the lockfile.
Lazy frontend entry points and smaller bundles
The initial app bundle size has been reduced across the board. Page and optional UI implementations for several core plugins — including catalog, home, search, TechDocs, user settings, DevTools, and catalog import — are now loaded only when their extensions render. The TechDocs LightBox addon's image viewer and the Kubernetes pod exec terminal (@xterm/xterm) are also lazily loaded. The Kubernetes entity content tab no longer loads its UI until the tab is opened.
The frontend bundle size is further reduced by letting bundlers tree-shake zod in @backstage/filter-predicates, which previously pulled every zod locale into the bundle. This takes effect on zod 4.5.0 and newer.
Contributed by @GabDug in #35287 and #35304
PostgreSQL improvements
A new schemaPrefix configuration option for pluginDivisionMode: schema allows prefixing PostgreSQL schema names to avoid conflicts with existing schemas. Contributed by @Fortune-Ndlovu in #35603
PostgreSQL connection churn during backend startup has been reduced: startup connections are lowered when many plugins initialize databases or schemas, database existence checks are reused when multiple plugins share a database, and scheduler polling overhead is reduced by batching readiness checks into one query per poll cycle. Catalog query planning has been improved by correcting entity cardinality statistics and using stable array parameters for filter predicates and refresh state lookups.
TechDocs CLI improvements
The techdocs-cli generate command now automatically computes a sha256 content hash of the generated site output and stores it as the etag in techdocs_metadata.json. A new --skip-if-unchanged flag on publish compares the local etag against the remote etag before uploading, skipping the publish step entirely when they match. This avoids redundant uploads in CI pipelines when docs haven't changed between builds. Contributed by @wscheep in #35227
A new --dangerouslyAllowAdditionalKeys option has been added to techdocs-cli generate. Contributed by @sid200727 in #35178
Support has also been added for techdocs.generator.pullOptions when pulling the TechDocs generator Docker image from private registries that require authentication. Contributed by @KarimSeoudy in #34277
Scaffolder template filtering and customization
The sub-page:scaffolder/templates extension now accepts a templateFilter field that lets you filter which templates are shown on the template list page. Contributed by @dotboris in #34624
New ui:options have been added to RepoUrlPicker for per-template customization: ownerLabel, ownerDescription, repoLabel, repoDescription to override field labels, and disableRepoAutocomplete to render a plain text input instead of the autocomplete dropdown. Contributed by @savitojs in #34894
Support has been added for registering a Template Outputs Component in the new frontend system. Contributed by @jkomendant in #34419
Faster GitLab merge request and push actions
The publish:gitlab:merge-request and gitlab:repo:push actions now make drastically fewer GitLab API requests. Under the default commitAction: 'auto', both actions previously downloaded the contents of every file already present on the target branch to determine which ones had changed. That comparison is now done locally using the repository listing they already fetch. For a merge request against a repository of a few hundred files this cuts the number of API requests from roughly 300 to under ten, reducing a step that took 5–15 seconds to about 3 seconds.
Contributed by @michael-todorovic in #35556
Kubernetes watcher interface
A new KubernetesWatcher interface has been added for streaming Kubernetes resource changes via an async iterator. The watcher is separated from KubernetesFetcher because watching is a long-lived streaming connection that only works with server-side auth providers. Watch supports all event types (ADDED, MODIFIED, DELETED, BOOKMARK, ERROR) with errors yielded as data rather than thrown.
Contributed by @gabemontero in #34294
Deprecated GitHub username sign-in resolver
The GitHub username sign-in resolver in @backstage/plugin-auth-backend-module-github-provider has been deprecated in favor of the stable user ID resolver. GitHub user ID catalog lookups now require an exact match and handle candidates that differ only by letter casing.
Backstage UI updates
Several improvements to Backstage UI components including fixed pagination state handling in useTable, Combobox opening suggestions on focus, FullPage scrollable layout fix with PluginHeader, TablePagination synchronization fixes, and locale-insensitive string handling across the framework.
Fixed an issue where using PluginHeader with FullPage caused the page to be unexpectedly scrollable. Contributed by @varshini03 in #35183.
Check the BUI Changelog for more details.
Additional fixes and improvements
- The
FixDialog,ContainerCard, andPodLogscomponents in@backstage/plugin-kubernetes-reactno longer accept an implicitchildrenprop, aligning with ADR006. Contributed by @suletetes in #35154. - Fixed the owner selected in the catalog import stepper being written to the generated
catalog-info.yamlas a display name instead of an entity reference. Contributed by @MFA-G in #35235. - Fixed
EntityOwnerPickercrashing with missing or empty kind errors when theownersquery parameter contains humanized entity refs. Contributed by @mythrilium in #35270. - Fixed
CopyTextButtonshowing its tooltip on hover/focus instead of only after clicking. Contributed by @reachsanjivbhagat-gif in #34920. - Added an optional
variantprop toCopyTextButtonfor configuring its visual style. Contributed by @victoriacheng15 in #35567. - Added an
onCopyLogprop to theLogViewercomponent that renders a copy button in the toolbar. Contributed by @tobiasp284 in #35006. - Added support for rendering custom link elements inside
HeaderIconLinkRow. - Fixed
app.extensionsshorthand anddisabledfield to accept boolean-ish strings so environment variable substitution can toggle extensions. Contributed by @tanaysingh2512 in #35261. - Fixed a bug where overriding a plugin extension with
withOverridesmoved the overridden extension to the end of the plugin's extension list. Contributed by @gustavolira in #35613. - Fixed a bug where plugin packages installed through feature discovery were loaded before the app's own code ran. Contributed by @kuangp in #35053.
- The default MCP server at
/api/mcp-actions/v1is now always exposed even when named servers are configured. Contributed by @majdsalman2 in #35383. - Added an unread notifications home page card and new frontend system home widget. Contributed by @ciiay in #34869.
- The
gitlab:issues:createaction now accepts a full project path forprojectId, andprojectIdis optional. Contributed by @kersten in #34544. - Added an
autoMergeboolean input topublish:gitlab:merge-request. Contributed by @PG2000 in #34947. - Fixed
gitlab:repo:pushfailing with a 400 error when the workspace has no file changes to commit. Contributed by @Naga15 in #34480. - Fixed
GitlabDiscoveryEntityProviderto only process push events targeting the configured branch. Contributed by @iamEAP in #35255. - The GitHub multi-org entity provider now logs a clear warning when no GitHub App installation is found for an org. Contributed by @Dasmat13 in #34833.
- Fixed the scaffolder task worker silently giving up after a transient failure, where a single error while picking up a task would stop the backend from running any further templates. Contributed by @Mahanmmi in #35359.
- The
workspace:template*actions are now exported by default. Contributed by @mbenson in #34915. - Restored support for intrinsic string, number, array,
Map, andSetmethods in software templates. - Software template inline conditionals without an
elsebranch now render an empty string when their condition is false, matching Nunjucks behavior. - Fixed a connection leak in the scaffolder event stream where unsubscribing did not abort the underlying SSE connection. Contributed by @carlerikjohan in #35401.
- Fixed several issues with scaffolder task event stream reconnection. Contributed by @carlerikjohan in #35401.
- Fixed the scaffolder wizard not scrolling to the top on step change in the new frontend system. Contributed by @sohailriyas01 in #35318.
- The
catalog:query-catalog-entitiesaction now acceptslimitandoffsetas strings, coercing them to numbers before validation. Contributed by @anshgoyalevil in #34954. - Fixed
AwsS3UrlReaderandAwsCodeCommitUrlReaderto resolve account-specific AWS credentials when an assume role ARN is configured. Contributed by @beatleboy501 in #34938. - Added optional
accountIdconfig tosearch.elasticsearchfor resolving account-specific AWS credentials. Contributed by @beatleboy501 in #34938. - Fixed Bitbucket Server file operations failing when the branch name contains special characters. Contributed by @suletetes in #35638.
- Fixed reading a duration from configuration so that an all-zero ISO 8601 duration yields a consistent zero value. Contributed by @suletetes in #35542.
- Fixed catalog model relations to inherit the source entity namespace when no default namespace is configured.
- Fixed a bug where catalog entities could fail to process when catalog model sources mix
backstage.io/v1alpha1andbackstage.io/v1beta1for the same kind. Contributed by @GabDug in #34552. - Fixed WebSocket upgrade error responses in the signals backend to prevent load balancers from returning 502 on auth failures. Contributed by @jlawrie in #34761.
- Fixed accumulating abort listeners on
MicrosoftGraphClient. Contributed by @csuich2 in #35321. - Fixed
CardExtensionto avoid requiring app context when a customRendereris provided. Contributed by @ciiay in #34869. - Fixed AWS S3 publishing to paginate existing objects to properly remove all stale TechDocs files. Contributed by @alecjacobs5401 in #35391.
- Fixed local TechDocs generation when temporary source paths resolve through filesystem aliases.
- Use the catalog presentation API for TechDocs document titles and owner labels. Contributed by @AarishMansur in #34760.
- Fixed
techdocs-cli servesilently stopping live reload detection withclick8.3.x. Contributed by @GabDug in #35160. - Fixed home clock configuration handling. Contributed by @NithinU2802 in #35192.
- Fixed ownership card catalog links to filter by stable entity references instead of display titles.
- Added
resolveNotificationLinkutility for resolving relative notification links to absolute URLs. Contributed by @gaelgoth in #33845. - Added support for calling Connections
findwithoutauthMethods. Contributed by @neoreddog in #35253. - The JSON Schema exported for filter predicates can now be compiled by RE2-based validators. Contributed by @rhart in #35631.
- Added Kubernetes actions to get clusters and entity resources. Contributed by @drodil in #33832.
- Increased the test database cleanup timeout to 60 seconds. Contributed by @mtlewis in #35607.
- Significantly improved the performance of
build-workspacewhen packaging many Backstage packages.
Security Fixes
This release contains security fixes for the following packages, please upgrade to the latest versions:
@backstage/plugin-auth-backend-module-cloudflare-access-provider@backstage/plugin-auth-backend-module-oidc-provider@backstage/plugin-auth-node@backstage/plugin-catalog-backend-module-bitbucket-server@backstage/plugin-proxy-backend@backstage/plugin-scaffolder-backend-module-sentry@backstage/plugin-techdocs-node
Contributors
Big shoutout to all of the amazing folks who contributed to this release: @AarishMansur, @Dasmat13, @Fortune-Ndlovu, @GabDug, @KarimSeoudy, @MFA-G, @Mahanmmi, @Naga15, @Naycon, @NithinU2802, @PG2000, @Yasser-Ameur, @alecjacobs5401, @anshgoyalevil, @apc-kamezaki, @axdotl, @beatleboy501, @carlerikjohan, @ciiay, @csuich2, @deejay1, @djanickova, @dotboris, @drodil, @dyatko, @gabemontero, @gaelgoth, @gustavolira, @hudsonb, @iamEAP, @jkomendant, @jlawrie, @jroebu14, @kersten, @kuangp, @majdsalman2, @mbenson, @michael-todorovic, @mtlewis, @mythrilium, @neoreddog, @piyushtripathi9424, @reachsanjivbhagat-gif, @rhart, @savitojs, @sid200727, @sohailriyas01, @suletetes, @tanaysingh2512, @tobiasp284, @varshini03, @victoriacheng15, @wscheep
Upgrade path
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 keeping Backstage updated.
Links and References
Below you can find a list of links and references to help you learn about and start using this new release.
- Backstage official website, documentation, and getting started guide
- GitHub repository
- Backstage's versioning and support policy
- Community Discord for discussions and support
- Changelog
- Backstage Demos, Blog, Roadmap and Plugins
Sign up for our newsletter if you want to be informed about what is happening in the world of Backstage.