Migrating from 1.1.x to 1.2.x
The 1.2.x line of @openchoreo/backstage-plugin* brings two coordinated changes for adopters who installed the plugins into their own Backstage host:
- Backstage
1.51.0is the new minimum. 1.1.x targeted1.43.3; every transitive@backstage/*peer-dep range moves to the 1.51 line, and@backstage/climinimum becomes^0.36.2. - New Frontend System (NFS) install path — each plugin now ships an
/alphaentry point that exports acreateFrontendPlugininstance. Adopters can drop--legacyfrom@backstage/create-app, install viacreateApp({ features: [...] }), and get every OpenChoreo entity tab and overview card mounted automatically — noEntityPage.tsxedits.
The default (legacy) plugin exports keep working unchanged. Existing 1.1.x adopters on the legacy frontend system can take just the Backstage bump and keep their EntityPage.tsx; opting into NFS is recommended but not required.
The upgrade commands on this page reference @openchoreo/<pkg>@^1.2.0, which will be the GA dist-tag of the 1.2.0 release. While 1.2.0 is still under active development, swap @^1.2.0 for @next in every command below to bump to the latest prerelease today. Once 1.2.0 GA is announced, switch back to @^1.2.0 to pin to the stable release.
Step 1 — Bump Backstage to 1.51
In your workspace root, run:
yarn backstage-cli versions:bump --release 1.51.0
This rewrites every @backstage/* caret range in your package.json files to the 1.51 line. Then replace the heavy resolutions block (carried over from the 1.1.x install guide) with the much smaller 1.2.x block. In your root package.json:
{
"resolutions": {
"@types/react": "^18",
"@types/react-dom": "^18",
"@mui/material": "^5.18.0"
}
}
The @mui/material pin is new — it fixes a material-ui-popup-state transitive resolution issue that surfaces with the newer scaffold. Without it Rspack fails to compile with Module not found: Can't resolve '@mui/material/version'.
Then:
rm -rf node_modules yarn.lock
yarn install
If anything in @backstage/* peer-deps fails to resolve after this, fall back to the compatibility matrix for the exact pinned set.
Step 2 — Bump OpenChoreo plugins to 1.2.0
yarn workspace app upgrade \
@openchoreo/backstage-design-system@^1.2.0 \
@openchoreo/backstage-plugin-common@^1.2.0 \
@openchoreo/backstage-plugin-react@^1.2.0 \
@openchoreo/backstage-plugin@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-ci@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-observability@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-workflows@^1.2.0
yarn workspace backend upgrade \
@openchoreo/openchoreo-client-node@^1.2.0 \
@openchoreo/openchoreo-auth@^1.2.0 \
@openchoreo/backstage-plugin-common@^1.2.0 \
@openchoreo/backstage-plugin-catalog-backend-module@^1.2.0 \
@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy@^1.2.0 \
@openchoreo/backstage-plugin-scaffolder-backend-module@^1.2.0 \
@openchoreo/backstage-plugin-backend@^1.2.0 \
@openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-ci-backend@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-observability-backend@^1.2.0 \
@openchoreo/backstage-plugin-openchoreo-workflows-backend@^1.2.0
(Drop the optional packs you don't have installed.)
Step 3 — Choose an install path
Option A: Stay on the legacy frontend system
If you have heavy EntityPage.tsx customization you want to keep, or you're not ready to move to NFS, you're effectively done. The default plugin exports from @openchoreo/*@^1.2.0 are API-compatible with 1.1.x — same createPlugin instances, same component exports (Environments, CellDiagram, ResourceDefinitionTab, Workflows, ObservabilityRuntimeLogs, etc.). Your existing App.tsx plugins: [...] array and EntityPage.tsx mounts continue to work.
Restart yarn start and verify the catalog still syncs and the entity tabs still render.
Option B: Switch to NFS (recommended)
NFS gives you simpler wiring (no EntityPage.tsx mounts, no per-tab imports) and is the path the install guide will continue to maintain. To switch:
-
Re-scaffold or migrate
App.tsx. The legacyApp.tsxbuildscreateApp({ apis, plugins, bindRoutes })and wraps<FlatRoutes>in<AppRouter>. NFS usescreateApp({ features: [...] })with feature contributions handling routing. Easiest path: scaffold a freshnpx @backstage/create-app@latesthost alongside your existing one, port yourapp-config.yaml, then follow install guide Section 4 to wire OpenChoreo features into the new host. Use the legacy host as a reference for any custom routes / sidebar items you need to recreate as NFS modules. -
Move
apis.tsfactories into acustomAppModule. EachcreateApiFactory({ api, deps, factory })becomes anApiBlueprint.make({ params: defineParams => defineParams({ api, deps, factory }) })inside acreateFrontendModule({ pluginId: 'app', extensions: [...] }). The shape is in install guide Section 4.3.2. -
Delete the per-tab
<EntityLayout.Route>mounts fromEntityPage.tsx. OnceopenchoreoPluginAlpha(and the opt-in packs' Alpha features) are increateApp({ features: [...] }), every OpenChoreo tab auto-mounts viaEntityContentBlueprint. Leaving the legacy mounts in produces duplicate tabs. -
Drop the legacy
<Route>for/workflowsif you mountedGenericWorkflowsPageby hand — under NFS,openchoreoWorkflowsPluginAlphacontributes/workflowsas aPageBlueprint. -
Update
.yarnrc.ymlto add@openchoreo/*tonpmPreapprovedPackagesso newly published prereleases install immediately instead of being blocked by the 3-day age gate:npmPreapprovedPackages:
- "@backstage/*"
- "@openchoreo/*"
Step 4 — Verify
yarn start
- Backend logs show
Plugin initialization completeforopenchoreo,catalog,permission,auth. NoMODULE_NOT_FOUNDorserviceRef{alpha.core.metrics}errors. - After ~30s:
Successfully processed N entities (X domains, Y systems, Z components, ...). - Browser → catalog renders, sign-in works, you can click into a Component and see the DEPLOY tab render real deployment data.
- Browser DevTools console: no "extension not discovered" or "missing api factory" warnings at boot. Under NFS, the
Sourcetab of every loaded extension should beloaded.
If you see duplicated tabs (e.g. two DEPLOY tabs), you're on the NFS path but left legacy EntityPage.tsx mounts in place — see Troubleshooting → NFS: duplicate Core tab.
What did NOT change between 1.1.x and 1.2.x
- The package set — same names, same default exports. Adopters on Option A above keep their
import { Environments } from '@openchoreo/backstage-plugin'lines unchanged. - Backend wiring shape —
index.tskeeps the sameimmediateCatalogServiceFactory,annotationStoreFactory,createIdpTokenHeaderMiddleware,OpenChoreoAuthModule, permission policy, and catalog/scaffolder modules. Only the@backstage/*versions move. app-config.yamlshape —openchoreo.baseUrl,openchoreo.features.*,openchoreo.auth.*, thepermission.enabledflag, and the catalog rules are all unchanged.OpenChoreoFetchApiandOpenChoreoPermissionApi— still the same classes; 1.2.x does not ship them. Adopters keep them inapis/(legacy) or move them into thecustomAppModule(NFS).- Catalog sync behavior — same
schedule.frequency/schedule.timeoutintegers, same entity-kind mapping, same client-credentials auth flow.
What did change
- Backstage minimum — 1.43.3 → 1.51.0.
@backstage/climinimum — 0.34.3 → 0.36.2.- Yarn scaffold version —
create-app@latestnow produces Yarn 4.13.x withnpmMinimalAgeGate: 3d. The install guide adds@openchoreo/*tonpmPreapprovedPackages. - NFS install path added — see install guide Section 4 — Core.
- Tab catalog additions —
Component → EVENTSandComponent → WIRELOGSare new tabs in the observability pack. They auto-mount under NFS; for legacy hosts add the corresponding<EntityLayout.Route>mounts (see entity-views legacy wiring). - Workflows
/alphacontributes a/workflowspage — under NFS the standalone Workflows page mounts viaPageBlueprint; no manual<Route path="/workflows">mount needed. - Notifications-removal cleanup is no longer required — the 1.43.3-era
@backstage/plugin-notificationscrash that the 1.1.x install guide Section 8 worked around is fixed in the 1.51 line. If you removed those packages on the old install you can re-add them; if you left them you're fine.