Skip to main content
Version: v3

DevPortal 3.1.0 release sheet

Release date: 2026-10-15. Chart 1.1.1: 2026-10-20.

What changed​

New features and enhancements​

  • Backstage 1.54.9 replaces Backstage 1.52. The portal keeps the frontend system it uses in 3.0.x.
  • The 18 plugins enabled by default now come from the plugin catalog index instead of the image. A plugin update is published as a new index, so it does not need a new image. The versions are in Default plugin versions.
  • Marketplace backend 0.3.1 and Marketplace frontend 0.3.2 are enabled by default.
  • The image is built on Red Hat UBI 10.2.

Breaking changes and upgrade notes​

Check these before you upgrade. The full upgrade steps are on the upgrade page.

  • Values file includes. If global.dynamic.includes still lists /opt/app-root/src/dynamic-plugins.veecode.yaml, remove that entry and keep dynamic-plugins.default.yaml. The 3.1 image has no such file. The installer skips it with a warning.
  • Chart upgrades. Do not move to chart 1.1.0 with helm upgrade --reuse-values. It reuses the values of the previous release, so the 3.0.3 image and the old catalog index stay in place. Pass explicit values, or use --reset-then-reuse-values (Helm 3.14 or later).
  • Former local plugin paths. Search global.dynamic.plugins and any mounted dynamic-plugins.yaml for ./dynamic-plugins/dist/. Replace each entry with the plugin's oci:// reference, or remove it. The installer skips these paths and still exits 0, so the plugin is missing without an error.
  • Marketplace selections. The upgrade does not convert the rows in marketplace_installations whose package_name starts with ./dynamic-plugins/dist/. After the upgrade, wait until the Marketplace lists the 3.1 version of each of these plugins, then reinstall it from the Marketplace with its saved YAML, and disable the new selection if the old row had disabled set to true. Before that, a reinstall stores the old path again. The Marketplace does not remove the old row. Once the new selection is in place (the plugin loads, or it shows as disabled when the old row was disabled), delete the old one from the marketplace_installations table in the Marketplace plugin's database, backstage_plugin_extensions with the default backend.database.prefix. When pluginDivisionMode is schema, the table is in a schema of the portal's database: find it with SELECT table_schema FROM information_schema.tables WHERE table_name = 'marketplace_installations'; and qualify the table with it. DELETE FROM marketplace_installations WHERE package_name = './dynamic-plugins/dist/<plugin>';. If the two rows hold different pluginConfig, the install init container stops with defined differently for 2 dynamic plugins, so give the new row the saved YAML.
  • RBAC pair. RBAC backend 8.1.4 is in the image, and RBAC frontend 2.3.1 comes from the catalog index. They move together. If you pin the RBAC frontend in global.dynamic.plugins to an older version, remove the pin or use 2.3.1. Backend 8 refuses the conditional-policy writes of frontend 1.52.4, and frontend 2.3.1 writes conditions that backend 7.12.5 refuses.
  • Plugins that moved to a new major version. Several plugins in the catalog index moved to a new major version, for example Argo CD 3.1.3, Tekton 4.0.5 and bulk import 9.1.1. None of these three is enabled by default. Of the 18 plugins enabled by default, two moved to a new major version: the global header to 3.1.0 and the RBAC frontend to 2.3.1. If you override pluginConfig for a plugin that moved, compare your override with the default of the new version.
  • Azure DevOps. If you enable the plugin, the backend requires azureDevOps.pullRequestDashboard.organizations, a list of entries with organization and host. Add it before the upgrade.
  • Bulk import. If you enable bulk import, bulk import backend 9.x requires short-lived GitHub App installation tokens for the Orchestrator import mode. It refuses a classic personal access token in that mode.
  • Derived images. If your image or an init script is built on the DevPortal image and uses UBI 9 packages or paths, check them against UBI 10.

Deprecated and removed features​

  • The image no longer has the dynamic-plugins/ directory. The catalog index has an OCI artifact for 40 of the 41 plugins that 3.0.x shipped in it. 12 of those 40 are enabled by default, and the other 28 are disabled by default. The catalog index has no entry for red-hat-developer-hub-backstage-plugin-extensions-backend.
  • The image no longer has dynamic-plugins.veecode.yaml. It has factory-plugins.yaml, a list of the names of the plugins enabled by default. The plugin definitions come from the catalog index.

Fixed issues​

  • The Marketplace saves the YAML typed on a plugin's install or edit page. Before, the portal stored the configuration already saved or the package's first example. An entry that comes without pluginConfig still gets the package's first example.
  • The Marketplace refuses YAML with a syntax error when you install a plugin or save its configuration. The install page shows the line and column of the first error.
  • Chart 1.1.1 moves the catalog index to bs_1.54.9_20261020T201546 and keeps image 3.1.0. The new index fixes the MCP tools of three plugins. The index ships these plugins disabled, so the fixes apply when you enable them with an {{inherit}} entry in global.dynamic.plugins. A plugin enabled from the Extensions page keeps the artifact digest stored at its first install, so the new index does not reach it; this comes from the installer code and was not tested:
    • scaffolder-mcp-extras 0.4.5-veecode.1: list-scaffolder-actions and validate-scaffolder no longer fail with Missing credentials.
    • techdocs-mcp-extras 0.2.7-veecode.2: fetch-techdocs and retrieve-techdocs-content report the real build date. Chart 1.1.0 reported a date in the year +058772.
    • announcements-backend 0.28.2-veecode.1: list-announcements, get-announcement and create-announcement accept an announcement without on_behalf_of. Chart 1.1.0 failed with Expected string, received null. The REST API still returns on_behalf_of: null for such an announcement.

Fixed security issues​

  • CVE-2026-106501 (GHSA-g2v8-7jhw-pp8p), critical, in @backstage/plugin-scaffolder-backend. 3.0.3 ships 4.0.1, which is affected. 3.1.0 ships 4.1.0, which fixes it. The advisory was published on 2026-10-07.
  • CVE-2026-88932 (GHSA-3pph-fpjx-jg34), medium, in multer. Aborted uploads could leave orphaned disk writes, which allowed denial of service. multer moves from 2.3.0 to 2.4.0.

What goes together​

Use these values together. Pin the image by its digest.

PartValue
Imagedocker.io/veecode/devportal:3.1.0@sha256:fe33373b7e5dc536f04d1878519bb53862a769b46869f78f829b198a30e5246b
Image digestsha256:fe33373b7e5dc536f04d1878519bb53862a769b46869f78f829b198a30e5246b
Chartdevportal 1.1.1 (1.1.0 on 2026-10-15)
Chart checksum (SHA-256)c011e1af3899aa4d5c7e13123071623a0e934a875a32d15484a7bfd21d4ac0bb (1.1.1); 061ab853c41cf05d5cc537d5c7c331290c6dd9c46cc756a6e6546a7acdc06a3e (1.1.0)
Backstage version1.54.9
Plugin tag linebs_1.54.9
Catalog indexquay.io/veecode/plugin-catalog-index:bs_1.54.9, qualified at sha256:b6e517e20575ec05618efb02ed86f8f4817403bf4763492a757516a0286008e9 (chart 1.1.1) and sha256:26bd062a8fad8c204b1a175e775a4549d599a2a57acd849f083d6591ed2a917d (chart 1.1.0)
Catalog index tag for pinningquay.io/veecode/plugin-catalog-index:bs_1.54.9_20261020T201546 (chart 1.1.1); bs_1.54.9_20261015T183630 (chart 1.1.0)
Qualified onKubernetes 1.35.0, PostgreSQL 16 (image postgres:16)

bs_1.54.9 is the tag under which the plugins and the catalog index are published, and it names the Backstage version they are built for. The catalog index tag moves when the catalog is republished. The chart pins the catalog index by digest, so an installation keeps the same index until you move to a new chart version. To pin this index by its timestamped tag instead of its digest, set global.catalogIndex.image.repository to veecode/plugin-catalog-index and global.catalogIndex.image.tag to bs_1.54.9_20261020T201546 (chart 1.1.1) or bs_1.54.9_20261015T183630 (chart 1.1.0). The two indexes differ only in the three plugins listed under Fixed issues, so the default plugin versions below hold for both.

Backstage packages​

The table lists the Backstage packages that the portal's backend declares directly, at the versions of the image's source commit. It does not list the packages that come in through other packages.

PackageVersion
@backstage/backend-app-api1.7.3
@backstage/backend-defaults0.17.8
@backstage/backend-dynamic-feature-service0.8.6
@backstage/backend-plugin-api1.10.0
@backstage/catalog-client1.16.1
@backstage/catalog-model1.10.0
@backstage/cli-node0.3.4
@backstage/config1.3.8
@backstage/plugin-app-backend0.5.17
@backstage/plugin-auth-backend0.30.0
@backstage/plugin-auth-backend-module-atlassian-provider0.4.18
@backstage/plugin-auth-backend-module-auth0-provider0.4.4
@backstage/plugin-auth-backend-module-azure-easyauth-provider0.2.23
@backstage/plugin-auth-backend-module-bitbucket-provider0.3.18
@backstage/plugin-auth-backend-module-bitbucket-server-provider0.2.18
@backstage/plugin-auth-backend-module-cloudflare-access-provider0.4.18
@backstage/plugin-auth-backend-module-gcp-iap-provider0.4.18
@backstage/plugin-auth-backend-module-github-provider0.5.6
@backstage/plugin-auth-backend-module-gitlab-provider0.4.6
@backstage/plugin-auth-backend-module-google-provider0.3.18
@backstage/plugin-auth-backend-module-guest-provider0.2.22
@backstage/plugin-auth-backend-module-microsoft-provider0.3.18
@backstage/plugin-auth-backend-module-oauth2-proxy-provider0.3.2
@backstage/plugin-auth-backend-module-oidc-provider0.4.20
@backstage/plugin-auth-backend-module-okta-provider0.2.18
@backstage/plugin-auth-backend-module-onelogin-provider0.3.18
@backstage/plugin-auth-node0.7.5
@backstage/plugin-catalog-backend3.9.1
@backstage/plugin-catalog-backend-module-logs0.1.25
@backstage/plugin-catalog-backend-module-openapi0.2.25
@backstage/plugin-catalog-backend-module-scaffolder-entity-model0.2.23
@backstage/plugin-events-backend0.6.5
@backstage/plugin-events-backend-module-gitlab0.3.15
@backstage/plugin-events-node0.4.25
@backstage/plugin-permission-backend0.7.15
@backstage/plugin-proxy-backend0.6.17
@backstage/plugin-scaffolder-backend4.1.0
@backstage/plugin-search-backend2.1.6
@backstage/plugin-search-backend-module-catalog0.3.18
@backstage/plugin-search-backend-module-pg0.5.58
@backstage/plugin-user-settings-backend0.4.6

Default plugin versions​

The catalog index enables these 18 plugins. Protected plugins cannot be disabled from the Marketplace. The other plugins can be disabled from it.

ArtifactVersionProtected
quay.io/veecode/veecode-platform-plugin-veecode-homepage1.0.3no
quay.io/veecode/red-hat-developer-hub-backstage-plugin-global-header3.1.0no
quay.io/veecode/backstage-community-plugin-rbac2.3.1no
quay.io/veecode/veecode-platform-backstage-plugin-about1.2.1no
quay.io/veecode/veecode-platform-backstage-plugin-about-backend1.2.0no
quay.io/veecode/red-hat-developer-hub-backstage-plugin-catalog-backend-module-extensions0.18.0yes
quay.io/veecode/devportal-marketplace-backend0.3.1yes
quay.io/veecode/devportal-pending-changes-dynamic0.3.0yes
quay.io/veecode/devportal-marketplace-frontend-dynamic0.3.2yes
quay.io/veecode/backstage-plugin-techdocs1.18.0no
quay.io/veecode/backstage-plugin-techdocs-backend2.2.5no
quay.io/veecode/backstage-plugin-techdocs-module-addons-contrib1.1.39no
quay.io/veecode/backstage-plugin-notifications0.5.20no
quay.io/veecode/backstage-plugin-signals0.0.34no
quay.io/veecode/backstage-plugin-notifications-backend0.6.8no
quay.io/veecode/backstage-plugin-signals-backend0.3.18no
quay.io/veecode/backstage-community-plugin-tech-radar1.22.0no
quay.io/veecode/backstage-community-plugin-tech-radar-backend1.21.0no

Vulnerability report​

  • Image scanned: docker.io/veecode/devportal@sha256:fe33373b7e5dc536f04d1878519bb53862a769b46869f78f829b198a30e5246b
  • Scanner: Trivy 0.74.0, database dated 2026-10-15.
  • Critical vulnerabilities with a fix and no live exception: 0.
  • Qualification run: https://github.com/veecode-platform/devportal-chart/actions/runs/38808478011.
  • Chart 1.1.1: the qualification of the published package (devportal-1.1.1.tgz, SHA-256 c011e1af…), https://github.com/veecode-platform/devportal-chart/actions/runs/39499796663, scanned the same image with the database dated 2026-10-20. It found 0 critical vulnerabilities with a fix and no live exception, and 11 high (9 with a fix), 51 medium and 7 low findings that no exception covers. The table below is the scan at release.
SeverityReportedWith a fixAccepted as an exception
CRITICAL000
HIGH8612
MEDIUM50500
LOW770
UNKNOWN000

Reported counts the findings that no exception covers. Accepted as an exception counts the findings that an exception covers.

A release does not ship with a critical vulnerability that has a fix and no live exception.

Exceptions​

IDPackageSeverityReasonExpires
CVE-2026-67422pymdown-extensionsHIGHThe fix is a major update to 11.0.1.2026-12-30
CVE-2026-12151undiciHIGHThe fixes are major updates to 6.27.0, 7.28.0 or 8.5.0.2026-12-30
CVE-2026-1526undiciHIGHThe fixes are major updates to 6.24.0 or 7.24.0.2026-12-30
CVE-2026-2229undiciHIGHThe fixes are major updates to 6.24.0 or 7.24.0.2026-12-30
CVE-2026-55553urllibHIGHThe 4.9.1 fix is a major update, and the 2.44.1 fix would downgrade the installed version. This exception covers two findings.2026-12-30
CVE-2025-66418urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30
CVE-2025-66471urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30
CVE-2026-21441urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30
CVE-2026-44431urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30
CVE-2026-97687urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30
CVE-2026-97689urllib3HIGHpython/requirements.in and python/requirements-build.in pin urllib3 2.2.2, so pip-tools cannot compile the fix. The hatchling and setuptools-scm build-tool pins may also need raising; this was not tested.2026-12-30

An exception expires on the date shown. After that date the finding counts again and blocks a release.

Plugins enabled by default​

The plugins enabled by default are separate artifacts. Each one is scanned by digest. This scan is a report and does not block a release.

ArtifactDigestPackagesCriticalHighMediumLowUnknownCritical with a fixResult
quay.io/veecode/backstage-community-plugin-rbac36cc13d76a4a1000000scanned
quay.io/veecode/backstage-community-plugin-tech-radar-backendc727ce2f8f7678012200scanned
quay.io/veecode/backstage-community-plugin-tech-radar32bbb54039331000000scanned
quay.io/veecode/backstage-plugin-notifications-backendd48f3ff2f2d4109002000scanned
quay.io/veecode/backstage-plugin-notifications1919932ddf6a1000000scanned
quay.io/veecode/backstage-plugin-signals-backendfba0c367d0fa83012000scanned
quay.io/veecode/backstage-plugin-signals5386b0ef4af61000000scanned
quay.io/veecode/backstage-plugin-techdocs-backend17238af383db42601412100scanned
quay.io/veecode/backstage-plugin-techdocs-module-addons-contrib9a0a16aa62481000000scanned
quay.io/veecode/backstage-plugin-techdocs6cd5aa0c27271000000scanned
quay.io/veecode/devportal-marketplace-backend7948f276b64078003100scanned
quay.io/veecode/devportal-marketplace-frontend-dynamicaa9e50d1b2821000000scanned
quay.io/veecode/devportal-pending-changes-dynamic6891aa72fa561000000scanned
quay.io/veecode/red-hat-developer-hub-backstage-plugin-catalog-backend-module-extensions1913ab2bf352150113100scanned
quay.io/veecode/red-hat-developer-hub-backstage-plugin-global-header2ef7191074461000000scanned
quay.io/veecode/veecode-platform-backstage-plugin-about-backend3b3a20e3d94710000000scanned
quay.io/veecode/veecode-platform-backstage-plugin-about7997870037681000000scanned
quay.io/veecode/veecode-platform-plugin-veecode-homepagefe312abc6c231000000scanned

Known limitations​

The first two items were found after release, and DevPortal 3.1.1 with chart 1.1.2 fixes them. The Red Hat dynamic Home page and offline install limitations carry over from 3.0.x. The RBAC limitation is specific to 3.1.0. The Marketplace window was first observed in the upgrade to chart 1.1.0, and it was not checked on 3.0.x.

  • A vulnerability database update on 2026-10-21 reports a critical finding with a fix in the 3.1.0 image: GHSA-6q48-6c7w-9gw2 in certifi 2024.7.4. Upgrade to 3.1.1 (use chart 1.1.2 for Helm installs), which fixes it.
  • VeeCode homepage 1.0.3, which charts 1.1.0 and 1.1.1 enable, loses the spacing of the Home page cards when another dynamic plugin sets the v5- class name prefix on the MUI copy that the portal shares. The cards then move under the header and past the left edge of the page. Chart 1.1.2 enables homepage 1.0.4, which fixes it.
  • After an upgrade, the Marketplace can list the packages of the previous catalog index for up to 30 minutes. A package installed from the Marketplace during that window keeps the previous artifact until you reinstall it, and a former ./dynamic-plugins/dist/ entry is skipped. Wait until the Marketplace shows the 3.1 versions before you install plugins.
  • The default plugins ship the Red Hat dynamic Home page entry disabled. Enabling it leaves the portal's pages empty. Keep it disabled. This was not re-tested on 3.1.0.
  • An offline install must mirror the catalog index as well as the plugin artifacts. This was not re-tested on 3.1.0.
  • RBAC backend 8.1.4 adds no database migration. An upgrade from a database written by RBAC backend 7.12.5 was not tested.