Omni 1.9.0-beta.0 (2026-06-19)
Welcome to the v1.9.0-beta.0 release of Omni!
This is a pre-release of Omni
Please try out the release binaries and report any issues at
https://github.com/siderolabs/omni/issues.
Per-Class etcd Write Rate Limiting
You can now throttle etcd writes by payload size, with separate budgets for end users, infra providers, and internal callers. It is off by default and turns on via storage.rateLimits.etcd.*. Four new Prometheus series report throttle wait time, admitted writes, rejected writes, and rejected bytes, labeled by class. The failure counters also carry a reason of timeout or oversize.
KubeSpan Status View
A new graphical view shows KubeSpan peer status for a cluster machine.
Frontend Quality-of-Life Improvements
A round of UI improvements across Omni. The home screen has a reworked "Welcome to Omni" card. An unhealthy infrastructure provider shows its error on hover, the machine details panel shows the SMBIOS serial number, and kernel args editing moved into a modal. Config diffs have a sort-order toggle, version pickers sort newest first and scroll to the current selection, and Talos and Kubernetes update calls now report their errors. The disks view got several cleanups, pods sort by status, power-state icons have tooltips, Omni shows a loading indicator when it is slow to start, and the rewritten log viewer scrolls to the bottom reliably.
Static loadBalancerIP for the WireGuard Service in Helm
The Helm chart has a new service.wireguard.loadBalancerIP value for setting a static load balancer IP on the WireGuard Kubernetes Service. It is rendered only when the WireGuard service type is LoadBalancer.
Support for Image Factory Enterprise
Two new config options, registries.imageFactoryUsername and registries.imageFactoryPassword, let Omni authenticate to the Image Factory Enterprise with HTTP basic auth.
Kubernetes Manifests Status in the UI
The frontend now shows the status of a cluster's synced Kubernetes manifests.
Per-Machine Log Ingestion Rate Limit
Log ingestion now uses a per-machine token bucket, so one noisy machine can no longer overwhelm the log store. It is off by default to keep backwards compatibility.
Machine Config Patches in Maintenance Mode
Omni can now apply machine-level config patches while a machine is still in maintenance mode, not just after it joins a cluster. The patches go on top of the configuration the machine already runs, next to the SideroLink documents Omni manages, and Omni will not apply a document that installs Talos and pulls the machine out of maintenance. Omni also keeps whatever configuration a machine connects with as a low-priority, user-owned patch. So a machine that arrives with its own config (say a TrustedRootsConfig document) keeps it, and your own patches still win.
Install and Upgrade Talos in Maintenance Mode
A new streaming management API installs or upgrades Talos on machines booted in maintenance mode. It comes with omnictl install and upgrade subcommands and frontend modals that stream installer progress live. This feature uses Talos's LifecycleService API, which became available in v1.13.0. So it works with any Talos version starting from v1.13.0.
SBOM, VEX, and Vulnerability Scan on the Installation Media Wizard
The installation media wizard's confirmation page now shows SBOM and VEX links plus the vulnerability scan and modal, the same as the Image Factory. This shows up only when you use the Image Factory Enterprise.
Opt-In Skip of Kubernetes Node Audit
The Kubernetes node audit deletes nodes that no ClusterMachine backs. You can now skip it for individual nodes, which helps with virtual nodes such as VirtualKubelet. A node is skipped only when it has the omni.sidero.dev/node-audit-skip annotation and the cluster owner has turned on the matching cluster feature, so a workload cannot annotate its own way out of the audit.
Node Names and Locked Status in omnictl cluster status
The omnictl cluster status tree now prints each machine's Kubernetes node name in parentheses after its UUID, so you can match a machine to the upgrade status lines that reference node names. A "Locked" indicator shows up whenever a machine is locked.
Platform Tags Exposed as Machine Labels
Talos PlatformMetadata tags (for example EC2 instance tags) now appear as editable, removable machine labels in Omni. Omni fills them in once, when the machine first joins, and your own custom labels win on any key conflict.
Schematic Contents Preserved on Update
When Omni changes a machine's schematic, it now touches only the fields it manages (extensions and kernel args) and leaves the rest alone, instead of rebuilding the schematic from scratch. It reads the full schematic from the machine or the Image Factory and stores it as is.
Signed Images and SBOM Release Artifacts
Omni releases now ship an SBOM built from the Go modules as a release artifact, and Sidero Labs signs the published container images during release.
Talos Upgrade Targets Capped at the Latest Supported Release
Each Omni release now declares the latest Talos minor version it can support end to end. Cluster create and update, the maintenance upgrade API, the upgrade status computation, and every version picker in the UI all read this same cap, so you can no longer pick a Talos version newer than the running Omni supports.
Contributors
- Edward Sammut Alessi
- Utku Ozdemir
- Mateusz Urbanek
- Oguz Kilcan
- Artem Chernyshev
- Maja Bojarska
- Noel Georgi
- Andrey Smirnov
- Orzelius
- 0hlov3
- Bo Bobson
- Matthew Sanabria
- Sterling Koch
- Steve Francis
- fsgh42
Changes
97 commits
0f853e1brelease(v1.9.0-beta.0): prepare release060a4c75chore: bump deps and default versions43bf5856test: run integration-qemu against the image factory enterprise4b49029cfeat: support machine config patches in maintenance modeb9e40717fix: stabilize flaky talemu e2e EULA setup and preset downloads448ed9a6docs: update LICENSEb44f92effix: ignore the embedded-config meta extensione32307d8fix: allow empty list of extensions in cluster templatesb08c34acfeat: implement advanced healthchecks for the cluster1c125d3fchore: add Oguz to sops-encrypted secrets recipients9a736342fix: properly handle invalid UTF-8 strings in the machine statusesd77ee049fix: properly handle empty provider data in the common modulec55173effeat: validate Talos version on installation media config243f046efix(frontend): display correct units for byte valuesd9eebd7cfix(frontend): reset monitor chart on watch change7f02f41fchore(frontend): bump frontend dependencies27ef3dd0feat: install/upgrade Talos in maintenance mode18131edffeat(frontend): change machine tutorial into a welcome card4fdc0719feat(frontend): adjust action buttons on getting started card987b3ec1feat: reject control characters in join token names8bfc6c17fix(frontend): fix incorrect pxe boot urlead9840bfeat: validate user-supplied request IDs and kernel args1ebde6a4feat: validate bootstrap snapshot path on machine sets1ff04579feat: allow opt-in skip of Kubernetes node audit50dcd264feat: validate resource metadata at the state layer086a1964feat: preserve schematic contents1ab0c4e3feat(frontend): display infrastructure provider error when unhealthy5c67c7c9fix: read machine uncached when deciding whether to reset it098dac2crefactor: remove unused fields, fix print columns/comments of resourcesa29fba49fix: use correct help string in theomnictl jointoken deletecommand9505aabefeat(frontend): add kubespan status viewd1976887refactor: replace injectable clocks with real timeb5be9a77fix: prune expired public keys with finalizers or no owner64b02f4ffeat: cap Talos upgrade targets at the latest supported releasea1367d90feat: per-machine log ingestion rate limitbc0e5273refactor: move state validations into their own package33909b1bfix: keep exposed services reachable after a health check flap84649427feat(helm): support loadBalancerIP for WireGuard service4db44704fix: release config update slot while a machine waits to upgradee63ea1f0feat: add PostHog analytics to the Omni frontend5b520366chore: bump major go dependencies48a7f939fix: persist config status when update lock is contended59d9079crefactor(frontend): remove last cases of any in codebase665371f3refactor: drop unused field in create schematic gRPC requestc2f52d79fix: prevent deadlock between machine upgrade and config update86159433feat: nest omnictl, talosctl, scans under apif144020cfeat(frontend): show vulnerability items on installation media wizard68afcd08chore: rekresb3e038f8feat(frontend): generate talos types for frontend0610a408refactor(frontend): type tlist items4afaf514refactor(frontend): drop watchjoin998e803echore: bump go-kubernetes libraryccbc50bdfeat(omnictl): show node name and locked status in cluster status3edf383bchore: bump deps, rekres, Talos 1.13.3, Kubernetes 1.36.1429708f8feat(frontend): show join tokens in saved presets listc857af93feat(frontend): enable field-sizing content for kernel argsf62e044afeat(frontend): show errors for all update talos/k8s issues7ddd63b1feat(frontend): sort upgrade modal versions descending and scroll to selectedffcbf334refactor(frontend): refactor update talos + k8s to new modals9248b762test: mock clock in saml testd18726e9fix: lower minimum discovered Kubernetes version2dd7c880test: pick previous Omni upgrade version from the release line2bfe8c08chore: rekres and bump frontend deps3b9399fbfix: do not downgrade nodes header to single node15ad495atest: bump Talos to 1.13.325f5de5cfeat(frontend): allow changing config diff sort order0f060a44feat(frontend): add improvements to disks viewe297c4d4fix: hack/compose dlv tools install1704f004chore(hack): add delve debugger support30d5d286test: use up-to-date way to set node labels on the nodes in the tests72dfce9efix(frontend): remove lingering test code028a57e8feat(frontend): move editing logic for kernel args into a modal76ee6332feat(frontend): add tooltips to power state32992281feat: refactor logviewer to tanstack virtual1fafd378chore: bump dependencies988bc9e8chore: add missing syft version to kres065db696test(integration): bump readiness timeout durationsfc362b5ffeat: expose ec2 tags as machine labels6d61a546feat: add sign-images target to sign omni container image34473a7ffeat: generate SBOM as a release artifactfa2f11fcfix: fetch versions from registry with auth0a2641c6chore: bump deps to patch GO-2026-5027ddfa70a9feat: add per-class etcd write-bytes rate limiting69e4fe25feat(frontend): add some feedback when omni is loading5246ba33fix: ensure infra providers with new common module support the old Omni9ae98330feat(frontend): sort pods by status on pods listc8daa780fix(frontend): fix incorrect permissions-policy header7484972dfeat(frontend): load robot fonts from npmbb442ab7feat: add teardown RPCs and tighten state API accessc1126b47chore: fix linter issues120be2f1chore: rekres to secure slack workflows68624952fix: dont clean clients with active watches679ca301feat: support basic auth against the image factory2ce7140efeat: introduce UI for showing Kubernetes manifests status of clustersc990a082feat(frontend): change service finished state style to gray1b9177eefeat(frontend): show smbios serial info on machine details panel9dd6cb49refactor: drop compose 'version' (from hack)
Changes from siderolabs/go-api-signature
Changes from siderolabs/go-kubernetes
2 commits
cc8c2c9fix: return the apply results in a consistent order131a2bdfix: handle cluster-scoped resources with a ns correctly
Changes from siderolabs/go-talos-support
2 commits
59d47affeat: rewrite support bundle library around client provider8dd4326feat: support encryption of the support bundle using age
Changes from siderolabs/image-factory
26 commits
425e59erelease(v1.3.3): prepare releaseb5d3d92fix: vulnerability scans with extensions916bcf6feat: update go-vex9920386feat: update Image Factory with Talos 1.14.0-alpha.1d49e952feat: allow excluding Talos releases147a3e8feat: add scan report to factory client2887e78feat: add support for embedding machine configuration660ac01release(v1.3.2): prepare release38183fcfix: update golang.org/x/net9f6aee8fix: make PXE copyable on SecureBootd7377c5refactor: migrate to Tailwind CSS classes1e86750fix: update golang.org/x/* packages33c79e4test: move from kuttl to chainsawba34dabfeat: move SPDX cache to enterprise optionscd137edchore: disable authentication for local development4ea792ffix: build profile with versionfcf9d57release(v1.3.1): prepare release1d216c7docs: update the developing documentation4a60270fix(config): validate early and sort SPDX deterministically41d3947release(v1.3.0): prepare releaseae3ed04feat: add enterprise features with Helm chart support3fb0f96feat(enterprise): add vulnerability scanning endpoint92209b6feat: return normalized schematic on creationba2a46dfeat(enterprise): implement VEX endpoint9b40156feat: show schematic-id url parameter on the final wizard step114bb60fix(spdx): use configured external URL in document namespace
Dependency Changes
- github.com/ProtonMail/go-crypto v1.4.1 new
- github.com/ProtonMail/gopenpgp/v3 v3.4.1 new
- github.com/auth0/go-jwt-middleware/v3 v3.2.0 new
- github.com/aws/aws-sdk-go-v2 v1.41.7 -> v1.42.0
- github.com/aws/aws-sdk-go-v2/config v1.32.17 -> v1.32.25
- github.com/aws/aws-sdk-go-v2/credentials v1.19.16 -> v1.19.24
- github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.18 -> v1.22.28
- github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 -> v1.104.0
- github.com/aws/smithy-go v1.25.1 -> v1.27.2
- github.com/coreos/go-oidc/v3 v3.18.0 -> v3.19.0
- github.com/cosi-project/runtime v1.16.0 -> v1.16.1
- github.com/cosi-project/state-etcd v0.6.0 -> v0.7.0
- github.com/felixge/httpsnoop v1.0.4 -> v1.1.0
- github.com/fluxcd/cli-utils v1.2.0 -> v1.2.1
- github.com/fluxcd/pkg/ssa v0.74.0 -> v0.76.0
- github.com/golang-jwt/jwt/v5 v5.3.1 new
- github.com/google/go-containerregistry v0.21.5 -> v0.21.7
- github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 new
- github.com/prometheus/client_model v0.6.2 new
- github.com/prometheus/common v0.67.5 -> v0.69.0
- github.com/russellhaering/goxmldsig v1.6.0 new
- github.com/siderolabs/go-api-signature v0.3.12 -> v0.3.13
- github.com/siderolabs/go-kubernetes v0.2.37 -> v0.2.39
- github.com/siderolabs/go-talos-support v0.2.1 -> v0.3.0
- github.com/siderolabs/image-factory v1.2.0 -> v1.3.3
- github.com/siderolabs/omni/client v1.6.5 -> v1.8.1
- github.com/siderolabs/talos/pkg/machinery v1.13.2 -> v1.14.0-alpha.1
- github.com/stripe/stripe-go/v85 v85.1.0 -> v85.2.0
- go.etcd.io/etcd/client/pkg/v3 v3.6.11 -> v3.6.12
- go.etcd.io/etcd/client/v3 v3.6.11 -> v3.6.12
- go.etcd.io/etcd/server/v3 v3.6.11 -> v3.6.12
- golang.org/x/crypto v0.51.0 -> v0.53.0
- golang.org/x/net v0.54.0 -> v0.56.0
- golang.org/x/sync v0.20.0 -> v0.21.0
- golang.org/x/text v0.37.0 -> v0.38.0
- golang.org/x/tools v0.45.0 -> v0.46.0
- golang.zx2c4.com/wireguard f333402bd9cb -> ecfc5a8d5446
- google.golang.org/grpc v1.81.0 -> v1.81.1
- k8s.io/api v0.36.0 -> v0.36.2
- k8s.io/apimachinery v0.36.0 -> v0.36.2
- k8s.io/client-go v0.36.0 -> v0.36.2
- sigs.k8s.io/controller-runtime v0.24.0 -> v0.24.1
Previous release can be found at v1.8.0