v1.9.0-beta.1
Pre-releaseOmni 1.9.0-beta.1 (2026-06-24)
Welcome to the v1.9.0-beta.1 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.
Cluster Health Check Jobs
Cluster templates now support health check jobs that gate Talos upgrades. Omni creates the jobs when a Talos upgrade is running and re-runs them on an interval until they succeed, re-creating a job whenever it fails. The checks run before each node upgrade in the upgrade status controller, and if any defined health check fails Omni drops the available upgrade quota to zero, blocking further upgrades until the checks pass. You can read more about this feature on the docs.
Embedded Machine Config for Installation Media
Installation media can now carry an embedded machine configuration, so a machine applies it on first boot before it ever reaches Omni. You can set it from the frontend or with omnictl when creating installation media, and Omni stores it on the schematic request alongside the rest of the media config. The option is exposed only where the underlying stack reports support for it, through a new supports_embedded_config quirk.
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.
Talos Extension Names Validated Against the Catalog
Extension names on installation media configs, machine request sets, and extensions configurations are now validated against the Talos extensions catalog for the relevant Talos version. Unknown names, duplicates, and oversized lists are rejected, and when no Talos version is set the default version's catalog is used so the names still get checked. Names without a namespace are looked up under siderolabs/, so older clients that send the documented short form keep working. The omnictl installation media create command now resolves short or partial extension names to canonical form before sending, replacing the client-side catalog check it used to do.
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. Machine patches no longer offer the cluster-machine patch option and surface an error when a machine is not part of a cluster.
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
118 commits
3455e7430release(v1.9.0-beta.1): prepare release8bea9d98dfeat(frontend): add expandable code editor for extra overlay options4121e730ffeat(frontend): add expandable code editor for embedded machine config22318022dfeat(frontend): add more default editor options and remove default class00e99c4d5refactor(frontend): refactor code editor to use v-model454daba78chore: bump default talos version to 1.13.5cb74aa700feat: support embedded machine config in installation media CLI86af10d45fix: get rid of the race in the UUID conflict resolution flow55bda4979refactor: only log schematic id when ensuringc2b067a1ffeat(frontend): allow specifying embedded machine config for installation media574daf6d5feat: add embedded_machine_config to create schematic request1a8c85b88feat: add embedded_machine_config to installation media config spec687e56ae1feat: add supports_embedded_config quirk to virtual resources2fa8855c6feat: validate Talos extensions against the catalog807fe47a7feat: register destroy controllers for user-managed resource typesc3c511acbchore: bump containerd to 1.7.33af44779aechore(frontend): bump dependencies17b2b30ecfix: prevent API requests from hanging after idle periods240c48323feat(frontend): remove cluster machine patch option from machine patches498e8c0b4feat(frontend): show error if machine not part of clustera66f1ae3afeat(frontend): use machine status link snapshot for recent machines phase0f853e1bbrelease(v1.9.0-beta.0): prepare release060a4c759chore: bump deps and default versions43bf5856etest: run integration-qemu against the image factory enterprise4b49029cbfeat: support machine config patches in maintenance modeb9e407174fix: stabilize flaky talemu e2e EULA setup and preset downloads448ed9a69docs: update LICENSEb44f92efefix: ignore the embedded-config meta extensione32307d8efix: allow empty list of extensions in cluster templatesb08c34ac8feat: implement advanced healthchecks for the cluster1c125d3f4chore: add Oguz to sops-encrypted secrets recipients9a736342dfix: properly handle invalid UTF-8 strings in the machine statusesd77ee0495fix: properly handle empty provider data in the common modulec55173efcfeat: validate Talos version on installation media config243f046e0fix(frontend): display correct units for byte valuesd9eebd7c4fix(frontend): reset monitor chart on watch change7f02f41f3chore(frontend): bump frontend dependencies27ef3dd03feat: install/upgrade Talos in maintenance mode18131edfdfeat(frontend): change machine tutorial into a welcome card4fdc07191feat(frontend): adjust action buttons on getting started card987b3ec18feat: reject control characters in join token names8bfc6c17dfix(frontend): fix incorrect pxe boot urlead9840b7feat: validate user-supplied request IDs and kernel args1ebde6a44feat: validate bootstrap snapshot path on machine sets1ff045796feat: allow opt-in skip of Kubernetes node audit50dcd264cfeat: validate resource metadata at the state layer086a1964cfeat: preserve schematic contents1ab0c4e32feat(frontend): display infrastructure provider error when unhealthy5c67c7c9bfix: read machine uncached when deciding whether to reset it098dac2c3refactor: remove unused fields, fix print columns/comments of resourcesa29fba498fix: use correct help string in theomnictl jointoken deletecommand9505aabecfeat(frontend): add kubespan status viewd19768879refactor: replace injectable clocks with real timeb5be9a779fix: prune expired public keys with finalizers or no owner64b02f4f6feat: cap Talos upgrade targets at the latest supported releasea1367d90efeat: per-machine log ingestion rate limitbc0e5273brefactor: move state validations into their own package33909b1b9fix: keep exposed services reachable after a health check flap84649427bfeat(helm): support loadBalancerIP for WireGuard service4db447046fix: release config update slot while a machine waits to upgradee63ea1f0efeat: add PostHog analytics to the Omni frontend5b5203660chore: bump major go dependencies48a7f9394fix: persist config status when update lock is contended59d9079c7refactor(frontend): remove last cases of any in codebase665371f3arefactor: drop unused field in create schematic gRPC requestc2f52d799fix: prevent deadlock between machine upgrade and config update861594332feat: nest omnictl, talosctl, scans under apif144020c0feat(frontend): show vulnerability items on installation media wizard68afcd086chore: rekresb3e038f8dfeat(frontend): generate talos types for frontend0610a4088refactor(frontend): type tlist items4afaf514brefactor(frontend): drop watchjoin998e803ecchore: bump go-kubernetes libraryccbc50bdafeat(omnictl): show node name and locked status in cluster status3edf383b6chore: bump deps, rekres, Talos 1.13.3, Kubernetes 1.36.1429708f84feat(frontend): show join tokens in saved presets listc857af939feat(frontend): enable field-sizing content for kernel argsf62e044aafeat(frontend): show errors for all update talos/k8s issues7ddd63b1afeat(frontend): sort upgrade modal versions descending and scroll to selectedffcbf3342refactor(frontend): refactor update talos + k8s to new modals9248b762btest: mock clock in saml testd18726e9cfix: lower minimum discovered Kubernetes version2dd7c8807test: pick previous Omni upgrade version from the release line2bfe8c08achore: rekres and bump frontend deps3b9399fbafix: do not downgrade nodes header to single node15ad495adtest: bump Talos to 1.13.325f5de5c6feat(frontend): allow changing config diff sort order0f060a449feat(frontend): add improvements to disks viewe297c4d47fix: hack/compose dlv tools install1704f0047chore(hack): add delve debugger support30d5d2868test: use up-to-date way to set node labels on the nodes in the tests72dfce9e5fix(frontend): remove lingering test code028a57e84feat(frontend): move editing logic for kernel args into a modal76ee6332ffeat(frontend): add tooltips to power state329922816feat: refactor logviewer to tanstack virtual1fafd3781chore: bump dependencies988bc9e81chore: add missing syft version to kres065db6960test(integration): bump readiness timeout durationsfc362b5fcfeat: expose ec2 tags as machine labels6d61a546efeat: add sign-images target to sign omni container image34473a7f5feat: generate SBOM as a release artifactfa2f11fc0fix: fetch versions from registry with auth0a2641c6cchore: bump deps to patch GO-2026-5027ddfa70a9cfeat: add per-class etcd write-bytes rate limiting69e4fe255feat(frontend): add some feedback when omni is loading5246ba332fix: ensure infra providers with new common module support the old Omni9ae983308feat(frontend): sort pods by status on pods listc8daa7805fix(frontend): fix incorrect permissions-policy header7484972dffeat(frontend): load robot fonts from npmbb442ab7efeat: add teardown RPCs and tighten state API accessc1126b471chore: fix linter issues120be2f10chore: rekres to secure slack workflows686249525fix: dont clean clients with active watches679ca3014feat: support basic auth against the image factory2ce7140ecfeat: introduce UI for showing Kubernetes manifests status of clustersc990a0820feat(frontend): change service finished state style to gray1b9177ee8feat(frontend): show smbios serial info on machine details panel9dd6cb490refactor: drop compose 'version' (from hack)
Changes since v1.9.0-beta.0
21 commits
3455e7430release(v1.9.0-beta.1): prepare release8bea9d98dfeat(frontend): add expandable code editor for extra overlay options4121e730ffeat(frontend): add expandable code editor for embedded machine config22318022dfeat(frontend): add more default editor options and remove default class00e99c4d5refactor(frontend): refactor code editor to use v-model454daba78chore: bump default talos version to 1.13.5cb74aa700feat: support embedded machine config in installation media CLI86af10d45fix: get rid of the race in the UUID conflict resolution flow55bda4979refactor: only log schematic id when ensuringc2b067a1ffeat(frontend): allow specifying embedded machine config for installation media574daf6d5feat: add embedded_machine_config to create schematic request1a8c85b88feat: add embedded_machine_config to installation media config spec687e56ae1feat: add supports_embedded_config quirk to virtual resources2fa8855c6feat: validate Talos extensions against the catalog807fe47a7feat: register destroy controllers for user-managed resource typesc3c511acbchore: bump containerd to 1.7.33af44779aechore(frontend): bump dependencies17b2b30ecfix: prevent API requests from hanging after idle periods240c48323feat(frontend): remove cluster machine patch option from machine patches498e8c0b4feat(frontend): show error if machine not part of clustera66f1ae3afeat(frontend): use machine status link snapshot for recent machines phase
Changes from siderolabs/go-api-signature
Changes from siderolabs/go-kubernetes
2 commits
Changes from siderolabs/go-talos-support
2 commits
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