Chapter 1. New features This section highlights new features in Red Hat Developer Hub 1.3. 1.1. Customizing the deployment by using the custom resource With this update, when deploying Red Hat Developer Hub by using the operator, you can configure the Developer Hub Deployment resource. The Developer Hub Operator Custom Resource Definition (CRD) API Version has been updated to rhdh.redhat.com/v1alpha2 . This CRD exposes a generic spec.deployment.patch field, which allows you to patch the Developer Hub Deployment resource. 1.2. Using nested conditions in RBAC conditional policies With this update, as a Developer Hub administrator, you can create and edit nested conditions in RBAC conditional policies by using the Developer Hub web UI. 1.3. Persisting the audit log With this update, you can persist the audit log: You can send Red Hat Developer Hub audit logs to a rotating file. You can send logs to a locked down file with append only rights. When using the Helm chart, Developer Hub writes logs to persistent volumes. 1.4. Allow Dynamic Configuration of Keycloak User/Group Transformers With this update, you can provide transformer functions for users and groups to mutate entity parameters from Keycloak before their ingestion into the catalog. This can be done by creating a new backend module and using the added keycloakTransformerExtensionPoint. 1.5. Expose extension points for the keycloak-backend plugin With this update, you can provide transformer functions for user/group to mutate the entity from Keycloak before their ingestion into the catalog with the new Backstage backend. Procedure Create a backend module. Provide the custom transformers to the keycloakTransformerExtensionPoint extension point exported by the package. == All public endpoints in core and plugins have OpenAPI specs With this update, OpenAPI Specs are available for all components, including the rbac-backend plugin. 1.6. RBAC Backend plugin module support With this update, Developer Hub can load roles and permissions into the RBAC Backend plugin through the use of extension points with the help of a plugin module. 1.7. Force catalog ingestion for production users By default, it is now required for the user entity to exist in the software catalog to allow sign in. This is required for production ready deployments since identities need to exist and originate from a trusted source (i.e. the Identity Provider) in order for security controls such as RBAC and Audit logging to be effective. To bypass this, enable the dangerouslySignInWithoutUserInCatalog configuration that allows sign in without the user being in the catalog. Enabling this option is dangerous as it might allow unauthorized users to gain access. 1.8. RBAC UI enhancements With this update, the RBAC UI has been improved: The Create role form and the Role overview page display the total number of conditional rules configured. The Role list page displays accessible plugins. 1.9. Updated Backstage version With this update, Backstage was updated to version 1.29.2. Additional resources: Backstage 1.27 release notes Backstage 1.27 changelog Backstage 1.28 release notes Backstage 1.28 changelog Backstage 1.29 release notes Backstage 1.29 changelog RHIDP-2794 RHIDP-2847 RHIDP-2796 == Authenticating with Microsoft Azure The Microsoft Azure Authentication provider is now enterprise ready. To enable this, enhancements and bug fixes were made to improve the authentication and entity ingestion process. Note, the existence of user entity in the catalog is now enforced. 1.10. Deploying on OpenShift Dedicated on Google Cloud Provider (GCP) Before this update, there was no automated process to deploy Developer Hub on OpenShift Dedicated (OSD) on Google Cloud Platform (GCP). With this update, you can install Red Hat Developer Hub on OpenShift Dedicated (OSD) on Google Cloud Platform (GCP) by using either Red Hat Developer Hub Operator or Red Hat Developer Hub Helm Chart. 1.11. Visualize Virtual Machine nodes on the Topology plugin With this update, you can visualize the Virtual Machine nodes deployed on the cluster through the Topology plugin. 1.12. Customizing the Home page With this update, you can customize the Home page in Red Hat Developer Hub by passing the data into the app-config.yaml file as a proxy. It is now possible to add, reorganize, and remove cards, including the search bar, quick access, headline, markdown, placeholder, catalog starred entities and featured docs that appear based on the plugins you have installed and enabled. 1.13. Customizing the main navigation sidebar This update introduces a configurable and customizable main navigation sidebar in Developer Hub, offering administrators greater control over the navigation structure. Previously, the sidebar was hard-coded with limited flexibility, and dynamic plugins could only contribute menu items without control over their order or structure. With this feature, administrators can now configure the order of navigation items, create nested sub-navigation, and provide users with a more organized and intuitive interface. This enhancement improves user experience and efficiency by allowing a more tailored navigation setup. Backward compatibility is maintained, ensuring existing dynamic plugin menu item contributions remain functional. A default configuration is provided, along with example configurations, including one with an external dynamic plugin. Documentation has been updated to guide developers on customizing the navigation. 1.14. Surfacing Catalog Processing Errors to Users With this update, the @backstage/plugin-catalog-backend-module-logs plugin has been made available as a dynamic plugin to help surface catalog errors into the logs. This dynamic plugin is disabled by default. 1.15. Configuring conditional policies by using external files With this release, you can configure conditional policies in Developer Hub using external files. Additionally, Developer Hub supports conditional policy aliases, which are dynamically substituted with the appropriate values during policy evaluation. For more information, see Configuring conditional policies . 1.16. Restarting Red Hat Developer Hub faster Before this update, it took a long time for Developer Hub to restart because Developer Hub bootstraps all dynamic plugins from zero with every restart. With this update, Developer Hub is using persisted volumes for the dynamic plugins. Therefore, Developer Hub restarts faster. 1.17. Monitoring active users on Developer Hub With this update, you can monitor active users on Developer Hub using the licensed-users-info-backend plugin. This plugin provides statistical data on logged-in users through the Web UI or REST API endpoints. For more information, see Authorization . 1.18. Loading a custom Backstage theme from a dynamic plugin With this update, you can load a custom Backstage theme from a dynamic plugin. Procedure Export a theme provider function in the dynamic plugin, such as: import { lightTheme } from &#39;./lightTheme&#39;; // some custom theme import { UnifiedThemeProvider } from &#39;@backstage/theme&#39;; export const lightThemeProvider = ({ children }: { children: ReactNode }) =&gt; ( &lt;UnifiedThemeProvider theme={lightTheme} children={children} /&gt; ); Configure Developer Hub to load the them in the UI by using the new themes configuration field: dynamicPlugins: frontend: example.my-custom-theme-plugin: themes: - id: light # &lt;1&gt; title: Light variant: light icon: someIconReference importName: lightThemeProvider <1> Set your theme id. Optionally, override the default Developer Hub themes specifying following id value: light overrides the default light theme and dark overrides the default dark theme. Verification The theme is available in the "Settings" page. This update also introduced the ability to override core API service factories from a dynamic plugin, which can be helpful for more specialized use cases such as providing a custom ScmAuth configuration for the Developer Hub frontend. 1.19. Manage concurrent writing on install dynamic plugins Previously, running multi-replica RHDH with a Persistent Volume for the Dynamic Plugins cache was not possible due to potential write conflicts. This update mitigates that risk

Commands:
import { lightTheme } from &#39;./lightTheme&#39;; // some custom theme import { UnifiedThemeProvider } from &#39;@backstage/theme&#39;; export const lightThemeProvider = ({ children }: { children: ReactNode }) =&gt; ( &lt;UnifiedThemeProvider theme={lightTheme} children={children} /&gt; );
dynamicPlugins: frontend: example.my-custom-theme-plugin: themes: - id: light # &lt;1&gt; title: Light variant: light icon: someIconReference importName: lightThemeProvider