Features
- The all-in-one container image is now published for
linux/arm64as well
aslinux/amd64. It previously ran only on amd64, so it could not be used
on arm64 Kubernetes nodes or on Apple Silicon without building it locally.
The release payload now carries one Linux binary per architecture and the
Dockerfile selects onTARGETARCH.
Bug Fixes
- Fixed the documentation site serving a stale search index. The search
plugin derives the index's cache-busting hash by scanningdocsDirand
blogDir, which were left at their defaults and pointed at directories
this site does not have. With no files to scan the hash came back empty
and the index was fetched from an unversioned URL, so a returning
visitor kept whatever their browser had cached from an earlier build. - The
manifest.ymlin the repository root pushed the source tree through
the retiredstratos-buildpack, staging a build on the platform and
asking for 1512M. The documented path pushes the prebuilt package under
binary_buildpackat 256M and builds nothing during staging, so a
clone-and-push took the stale route at six times the memory. The manifest
now points atdist/cf-package, the directorymake build release cf
stages, with the command and buildpack that go with a prebuilt payload. - Sized the console at
512M. Both packaged manifests claimed256M, a figure
dating from 2017 that was never checked against a running console; known
production deployments run at512M, and the Korifi manifest generated by the
same script already said512M. Disk stays at1024Mfor log growth. The
Memory Usage documentation still presented the old1512Msource-push figure
as a requirement, when it was staging headroom for compiling Angular during
cf push.
The README example and the two manifests on the CF troubleshooting page
named the same retired buildpack and have been corrected. - An endpoint registered with a CA certificate is now reached using it. The CA
was stored on the endpoint but never passed to the CF API client or to the
OAuth and OIDC token calls, so against a foundation using a private CA —
a lab, or Cloud Foundry on Kubernetes — connecting failed and every read
returnedx509: certificate signed by unknown authority. The console
reported this as the endpoint being unreachable, which pointed at the network
rather than at certificate trust. AUTO_REG_CF_URLhad no way to supply a CA certificate, so on a foundation
using a private authority the auto-registered endpoint reported itself
connected and then failed every read with
x509: certificate signed by unknown authority, while the same endpoint
registered by hand with its CA worked.SKIP_SSL_VALIDATIONwas not a
substitute: the CF API client will not honour it.
AUTO_REG_CF_CA_CERTnow takes the PEM inline andAUTO_REG_CF_CA_CERT_PATH
reads it from a file, mirroringCONSOLE_PROXY_CERTand
CONSOLE_PROXY_CERT_PATH. The path form is what a Kubernetes deployment
wants, where the CA is a mounted secret; it wins over the inline value, and a
path that cannot be read fails the registration rather than silently creating
a CA-less endpoint.- The endpoint connect dialog overwrote an auth form's default configuration
withundefinedwhenever the auth type supplied none, and those templates
read fields such as the help text without guarding. Every auth type shipped
today supplies a configuration, so nothing was broken in practice — but the
field is optional, the form component declares a default for exactly that
case, and only coincidence stood between them. - Jetstream crashed at startup when
ENCRYPTION_KEY_VOLUMEwas configured
withoutENCRYPTION_KEY_FILENAME. The filename was indexed before being
checked, so an empty one raised an index-out-of-range panic, and the guard
meant to require both settings only rejected the case where neither was
given. That combination is what the DevOps guide's own example showed. An
empty filename is now a clear error. - Terminal dimensions sent by the browser to the application SSH session were
used without validation, so a negative value wrapped to a very large one and
an oversized value was truncated when converted for the window-change
request. Rows and columns are now clamped to a sensible range.
Maintainability
- Removed the
Docker Build and Pushworkflow and the base-image push
workflow. Thestratos-uiandstratos-backendcomponent images build
from SUSE-erasplatformbases carrying Node 12, which cannot compile the
current source, so the workflow failed on every release and never pushed an
image; the base-image workflow had been a silent no-op for years. The
all-in-one image is unaffected and still publishes from the release
workflow. See #5907. - Synced the Angular versions declared by the frontend package manifests
with the version the application actually installs. The manifests under
src/frontend/packages/still named 22.0.8 while the root manifest and
lockfile had moved to 22.1.5. Nothing installs from those files — the
devkit reads them for dependency names only — but the stale numbers were
enough for dependency scanning to report five advisories against Angular
packages that ship at a patched version, two of them rated high. The
manifests were re-synced to 22.1.6 and then 22.1.7 as the root moved;
they carry no lockfile of their own, so every root bump has to be
followed by hand. - Removed the
korifibuild modifier and the matchingrelease-cf.sh
mode. Korifi is retired — RFC-0060 was accepted on 2026-07-10 — and CF
on Kubernetes is its replacement.make build korifiwas the only
consumer ofzigin the build, needed for a static cgo cross-compile
back when the sqlite driver required cgo; the pure-Goncrucesdriver
removed that need some time ago, so no build path asks for a C
cross-compiler any more. The packager loses itsMODEparameter along
with the alternate Paketo procfile manifest it generated. - Removed
e2e/secrets.yaml, a developer's local E2E credentials file
committed by accident. Nothing read it: the supported layout is a
gitignoredsecrets.yamlat the repository root, created from
e2e/secrets.yaml.template. The path is now in.gitignoreso the
copy cannot come back. - Quietened the
make audit secretsscan.gitleaks dirwalks the
filesystem rather than the git index, so every run reported the
developer's own gitignored credentials and the third-party Helm chart
cache. Those paths are allow-listed by exact path, leaving the scan
clean and any finding in a trackable file visible. make audit secretsnow fails when gitleaks reports a finding, instead
of printing it and exiting 0. The full-history scan
(make audit history) stays advisory: it carries years of accepted
SUSE-era test fixtures.- Removed
autoprefixerfrom the root manifest. The Tailwind v4 migration
dropped it from the PostCSS plugin list and left the dependency entry
behind, so nothing had resolved it since. The application builds through
@angular/build, which carries no autoprefixer reference at all — vendor
prefixing comes from esbuild, whose target is derived from the
browserslist file. Removing the entry also collapses a duplicate
resolution: autoprefixer now appears once, as the build tooling's own
transitive dependency, instead of twice at two versions. The emitted
stylesheet is byte-identical with and without it. - Pin drift between the frontend package manifests and the root manifest
now fails the lint check instead of being found later. The files under
src/frontend/packages/install nothing, but Dependabot security
updates scan every manifest in the repository regardless of the
directory list independabot.yml, so a pin left behind the shipped
tree raises advisories against packages that already ship at a patched
version. That had been corrected by hand three times. Four non-Angular
pins that the manual syncs never covered —core-js,markedand the
two@analogjspackages — were brought into line at the same time.
Chores
- Corrected the deployment documentation, which promised a Helm chart in the
release artifacts and a chart repository atcloudfoundry.github.io/stratos.
Neither exists. The Kubernetes pages and the component-image instructions in
the DevOps and release guides now state that this path does not currently
work and point at the working Cloud Foundry and all-in-one options. - The devkit install no longer rewrites its own lockfile.
ensure-devkit
rannpm install --legacy-peer-depsagainst apackage-lock.json
generated without that flag, so every root install — CI included —
silently dropped the ten peer entries the lockfile records. It now runs
npm ci, which installs exactly what the lockfile says and never writes
to it. - Removed
deploy/ci/automation/cfpushtest.sh, which targeted the
discontinued PCF Dev and had been producing a manifest with a duplicated
env:key since the diagnostics setting was added. Nothing invoked it. - Added live-foundation tests for endpoint capability detection. A Cloud
Foundry with the V2 API disabled still answers 200 from/v2/info, so the
behaviour could not be reproduced from fixtures and had to be confirmed
against real foundations. Each test skips unless its foundation is named in
STRATOS_LIVE_CForSTRATOS_LIVE_CF_V2OFF, so an ordinary test run is
unaffected, and the expectations are read from what the foundation itself
advertises rather than any particular installation's values. make audit backendandmake audit testsreported success when the gosec
scanner had not run at all. gosec exits non-zero both when it finds issues
and when it cannot start, and every invocation tolerated failure so findings
stayed advisory — which also hid a scanner built against an older Go
aborting on every package. Findings remain advisory; a scanner that did not
run is now an error naming the cause and the rebuild command.- Moved the frontend unit tests to Vitest 5.0.1, together with
@vitest/coverage-v8and@vitest/ui, which Vitest 5 requires at the
same exact version. Two changes made it work.@oxc-project/runtimeis
now installed, because Vitest 5 emits the decorator helper for
decorated classes in the test setup as an import rather than inlining
it. Each test project invitest.config.tsalso sets its ownroot:
Vitest 5 ignores the root in the package config that a project extends,
so every package would otherwise have run the whole tree without its
Angular compiler setup. The suite results are unchanged: 666 test files
pass and 2 are skipped. - The build no longer downloads
tsxfrom the npm registry every time it
runs. The pre-build step ran the backend plugin generator through
npx tsx, and becausetsxis not a dependency, npx fetched whatever
version was newest on each build. Node now runs the generator directly,
and the generatedextra_plugins.gois unchanged. The two e2e
screenshot report scripts, which usedbunx tsxthe same way, now run
with Node as well. - Dependency updates: the Angular framework from 22.1.5 to 22.1.7, with
the Angular CLI and build tooling from 22.1.7 to 22.1.8 (including the
devkit's own lockfile);@types/nodefrom 24.2.1 to 26.4.1;js-yaml
from 5.4.1 to 5.4.2; andglobfrom 11.1.0 to 13.0.6 in the
prebuild-application builder.
Security Updates
- Two CVEs were cleared in the build tooling. The devkit's
js-yaml
override moved 4.3.1 to 4.3.2 (CVE-2026-84375, high): the devkit
resolves through its ownpackage-lock.json, so the root workspace's
earlier move to js-yaml 5 never reached it.adm-zipmoved 0.6.0 to
0.6.1 (CVE-2026-76845): the advisory covers extraction following
symlinks at the destination, which the build never does — it only
creates archives — but 0.6.1 also stopsaddLocalFolderfollowing
symlinks out of the folder being archived, and that is the call the
prebuild zip step makes.