Omni 1.13.0-beta.0 (2026-10-21)
Welcome to the v1.13.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.
Urgent Upgrade Notes (No, really, you MUST read this before you upgrade)
The BoltDB storage backend (storage.default.kind: boltdb, --storage-kind boltdb) is deprecated and will be removed in a future release. It keeps working in this release and Omni logs a warning at startup when it runs on it. There is no automated migration between the two backends, so if your Omni runs on BoltDB, plan the move to etcd, which is the default, before the removal lands.
The metrics endpoint now listens on 127.0.0.1:2122 by default instead of 0.0.0.0:2122. If you scrape the Omni metrics from another host or from outside the Omni container (e.g., through a published Docker port), set services.metrics.endpoint (--metrics-bind-addr) to 0.0.0.0:2122 explicitly. The Helm chart still binds it to 0.0.0.0:2122 when metrics.enabled is set.
The embedded etcd server no longer listens on any address by default, Omni connects to it in-memory. Previously, it listened on storage.default.etcd.endpoints (http://localhost:2379 by default) without TLS, and backups taken with etcdctl relied on it. To access the embedded etcd from outside, set storage.default.etcd.embeddedCertFile and embeddedKeyFile (--etcd-embedded-cert-path, --etcd-embedded-key-path), and optionally embeddedCaFile (--etcd-embedded-ca-path). The embedded etcd server then listens on the storage.default.etcd.endpoints addresses with TLS, and only accepts clients with a certificate signed by the given CA. When no CA is set, the certificate file must contain a single certificate, which is used as the CA, so clients can use the same certificate and key.
Client Address in Audit Logs
Audit log entries now record the address of the client that made the request. This includes requests to the Kubernetes proxy. The audit log page shows the address next to the actor.
Config Changes Applied in Try Mode
On machines running Talos 1.14 or later, Omni now applies config changes in try mode. It confirms a change only when the machine is still reachable after it. When a config patch cuts a machine off from Omni (e.g., incorrect network configuration), Talos rolls it back, and the machine does not stay unreachable.
After 2 rolled back attempts, Omni stops and reports the error on the machine. Changing the config starts over. The first config, which takes a machine out of maintenance mode, is still applied without try mode.
Errors when applying a config to a machine in maintenance mode are now shown in the machine list and on the machine details page.
Default Version Label
The TalosVersion and KubernetesVersion resources that Omni uses as its defaults now carry the omni.sidero.dev/default-version label. Clients can find the default versions with a label query.
Upgrades Between Unsupported Talos Versions in Maintenance
A machine in maintenance mode that runs a Talos version Omni no longer supports can now be upgraded to another unsupported version. This way, an old machine can go through the intermediate versions Talos requires (e.g., 1.7 to 1.8 to 1.9) until it reaches a supported one.
EULA Acceptance
The EULA page in the UI is removed. The End User License Agreement is now accepted with the --eula-accept-name and --eula-accept-email flags (eulaAccept in the config file, config.eulaAccept in the Helm chart).
Omni does not start until the EULA is accepted. Once accepted, it stays accepted, so a new installation needs the flags only on its first start. Setting them again with different values updates the stored name and email. Installations that already accepted the EULA need no changes.
UI Improvements
The UI marks the Talos versions served from an enterprise image factory. The enterprise label is also shown on the cluster overview and in the Talos update, upgrade and install dialogs.
The cluster security page now says why scans are not available: either the cluster does not run enterprise images, or the factory has no scan report for its schematic yet. Installation media downloads show a loading state, and a message when the enterprise factory does not support the selected Talos version.
Every page has its own browser tab title, e.g., "Overview · my-cluster · Clusters · Omni". The version selectors group Talos versions by minor version. Users with no avatar from the identity provider get one generated from their name or email.
SideroLink Join Configuration in the Schematic
Every machine's schematic now carries its SideroLink join configuration, so an install or a Talos upgrade no longer loses the connection to Omni when the join args were only on the machine's kernel command line. From Talos 1.12 on, the join configuration is embedded machine configuration instead of kernel args, also in new installation media. Existing machines move to the new schematic at their next install or upgrade. Deploying this release does not install, upgrade or reboot any machine. Each cluster member gets one config update without a reboot, as the install image in its config changes to the new schematic.
If you give Talos 1.12+ machines their configuration through another source, such as cloud user-data, the talos.config URL, or the talos.config.early and talos.config.inline kernel args, include the join documents in it (omnictl jointoken machine-config prints them), since that configuration replaces the embedded one.
The new omni_machine_siderolink_join_config metric counts the machines by where their SideroLink join configuration is: embedded_config, kernel_args, machine_config or unknown. It shows how many machines already have the join configuration in their schematic.
Machine Labels Through Join Tokens
A join token can now carry machine labels, set with omnictl jointoken machine-config|kernel-args --set-labels key=value. A machine that joins with such a token gets these labels as user labels, so they can be changed later like any other user label. A machine that already has user labels keeps them.
Local Resource Service Removal
The local resource service, which served Omni resources on a local listener, is removed. Consumers should reach Omni through its regular API with a service account instead. Its services.localResourceService settings and flags have no effect.
Minimum Talos Version
New clusters now require Talos 1.10.0 or later. The minimum was 1.9.0 before.
OIDC Identity Labels and Roles
OIDC logins now get identity labels, like SAML logins. The groups and roles claims of the ID token become labels on the identity, e.g., oidc.omni.sidero.dev/groups/devs. They are synced on every login. The existing SAMLLabelRule resources apply to these labels too, so a rule assigns a role to an OIDC user the same way it does to a SAML user.
By default, OIDC users are still not created on their first login. To create them like SAML users, set auth.oidc.autoCreateUsers (--auth-oidc-auto-create-users). Only do this when every account of the identity provider belongs to the organization.
The labels are shown in the users list of the UI and in omnictl user list.
Identity Provider Session Reuse
Every new public key (for the UI, the CLI or the workload proxy) requires a fresh login at the identity provider. Setting auth.requireReauthForNewKeys: false lets the identity provider reuse its existing session instead, while the first login after an Omni logout still requires a fresh one. This lowers security, so only turn it off when the identity provider limits how long its sessions last.
With the setting on, Omni logs a warning when an OIDC or SAML identity provider ignores the request for a fresh login. Additionally, with OIDC, Omni now only accepts an ID token issued in the last few minutes to confirm a new key.
Resource Browser
The UI has a new resource browser. It lists every Omni and Talos resource the user can read, with search and export, and is meant for debugging.
Signed SAML Requests
Omni can now sign the SAML AuthnRequest and LogoutRequest. To enable it, register a certificate at the identity provider, then set auth.saml.certFile and auth.saml.keyFile (--auth-saml-cert, --auth-saml-key). Omni publishes the certificate in /saml/metadata.
The LogoutRequest is sent over the HTTP-Redirect binding when the identity provider supports it, and over HTTP-POST otherwise.
Secrets Through Environment Variables
The OIDC client secret can now be set with the OMNI_AUTH_OIDC_CLIENT_SECRET environment variable, like the image factory passwords.
The flags that take a secret as their value are deprecated: --auth-oidc-client-secret, --primary-factory-password, --secondary-factory-password and --image-factory-password. Use the environment variables or a config file instead. --config-path can be given more than once, and the files are merged.
Service Account Key Revocation
A single key of a service account can now be revoked, and the service account and its other keys stay. Use omnictl serviceaccount revoke-key <name> <public-key-id>, or the list of keys on the service accounts page in the UI.
UI Design Refresh and Themes
The UI now uses the fonts and colors of the Talos design system. Each status has its own glyph, so states differ in shape and not only in color. Labels are neutral, with a glyph for their group.
The UI now has a light theme, and a second dark theme, Dim, which uses Omni's original blue-grey colors. The theme menu at the right end of the top bar offers Light, Dark, Dim and System. System is the default and follows the operating system.
Config history and pending updates use a new diff view with split and inline modes. Code blocks have syntax highlighting.
Contributors
- Utku Ozdemir
- Edward Sammut Alessi
- Oguz Kilcan
- Mateusz Urbanek
- Andrey Smirnov
- Sterling Koch
- immanuwell
- Artem Chernyshev
- Andy Longwill
- Maja Bojarska
- Matt Van Horn
- Oscar Wieman
- Olli Hauer
- Steve Wills
Changes
145 commits
b423fa6arelease(v1.13.0-beta.0): prepare released990cf7efeat: read /proc/cmdline on machines without the KernelCmdline resource6611f41dfeat: add a metric for where the SideroLink join config of machines isb658048efeat: move the SideroLink join config into the machine schematic0468ea01feat: rekres and specify js.Toolchain extraPackagesf8bfdb4afix: mount node_modules in a dedicated volume for compose555bd2e6chore: bump depsd6b38662chore: bump default and minimum talos versions865a315cchore: rekres and bump gof8f13618fix: honor TTL flags for service account keys7911b2cafix: generate the join config by the running Talos version38eac0d3test: retry the ConfigMap update in the advanced healthcheck test814962f8fix: add missing context timeout to the delete upgrade meta key call41cadf21fix: validate label selectors of access policiesb19d5e42feat: sync identity labels and roles from OIDC claims4adde371fix: keep the CLI key of a user created by the logina52d8778feat(frontend): listen for patch creation on kubespan pagee8881693fix: preserve the initial versions of an imported cluster7eb8d7bdfeat: accept the EULA only with flagsb67b2496chore(frontend): bump frontend dependenciesc11e4e05refactor: use the Talos client factory directly for internal callers91592a27test: use testutils.WithRuntime for machine teardown test1b9f57fcfix: skip machine wipe when the machine is disconnectedab474432feat: apply config changes in try mode on Talos 1.14 and later5adabd78fix: preserve the recovery file when omnictl edit is canceled4d3eba50feat: record the client address in audit logs8c45aaf9test: fix two flakes in the integration testse23680fefeat: allow TLS access to the embedded etcdf5c95144feat: connect to the embedded etcd in-memoryb889e9d4fix(frontend): fix incorrect ul color on installation media wizard6b31aaa2chore(frontend): allow customizing dev server host49b61b7drefactor(frontend): move specific spacing onto design system spacing79884c9drefactor(frontend): switch to design system spacinga57d5e91fix: limit the public key registrations per source addressc048e285feat(frontend): use design system fontsc381e12bfix: bind the metrics endpoint to localhost by default770817f3fix: do not trust client-sent X-Forwarded-For entriesb45aea18feat: allow reusing the identity provider session for new keys10b46bb5chore: rekres and bump go0cb223c9feat(frontend): add list of keys to service accounts pageb124cf64feat(omnictl): add a revoke-key command to omnictl service accounts62fa33a7feat: add grpc method for revoking a service account key1de34f43fix: keep registered public keys in memory until they are confirmed75bf1484fix: do not forward the workload proxy cookies to the exposed service801d26f2chore: remove unused codee6edbd3cchore: remove the auth disabled code path3f001d73chore: deprecate the boltdb storage backenddc8e57a2fix: restore the grpc scheme of the default machine API URLef6fa4bcfix: return only the unauthenticated error for an unsigned requestad590da9feat: add an env var for the OIDC client secret, deprecate the secret flagsa09249b9fix: redact config secrets and clear the stored OIDC client secretc602da5dfix: forward only known headers to the Kubernetes apiserver6ce453e5refactor(frontend): inline all icons3cce6c5bchore(frontend): remove unused components46359a48refactor(frontend): drop heroicons and standardize icons6a17a14ffix: remove conflicting join token renew aliasca2dbb06chore: bump deps64f095adchore: bump default versions25932e76refactor: drop the per-key roled9b2a064fix: replace incorrect design system release304d438efix: require a confirmed key for workload proxy access46b6481fchore(frontend): use talos-design-system lint rulese7898764chore(frontend): remove old unused icons9ce034c0fix(frontend): fix sizing of no connection iconfbfe3b89feat(frontend): add Dim, a second dark theme6bae87d9feat(frontend): add the light theme and a light, dark and system theme menu420858f5fix: make a resource's cluster label agree with its target0d276077fix: extract the cluster ID from label query terms correctlyc12f7181fix(frontend): draw hover, disabled, focus and scrim states with color rolesa0644fbefix(frontend): give cards a border8200e8d9feat: allow upgrading one deprecated Talos to another one in maintenance2f90c334fix: do not allocate machines with outdated schematics into a clustere48c13c0fix(frontend): move code, diffs and search matches onto the syntax and highlight rolesa7d49689feat(frontend): make labels neutral chips with a glyph per group06d44673feat: sign SAML requests and the SLO cookieb10a3c8cfix: reject unknown Talos versions on the talosctl downloads endpoint1d9d02d0feat: remove the local resource servicecddaf5d4fix(frontend): color chart segments by state, and by series otherwisefbc37b69chore(frontend): bump dependenciesa1a826f7chore: bump go.opentelemetry.io/otel/exporters/otlp/otlptrace67d56d21fix: resolve node headers only for the runtime that uses themc181ad30feat(frontend): render statuses as pills with a glyph per state537f1ea7fix: read local resource server stream metadata from its own context47af5b36fix: verify the caller before reporting a resolution failure8aed896bfix: check access before rejecting a request that names several nodes9af87e6cfix: record the outcome of Talos access in the audit log540c4c42fix: parse the role of a public key request before any lookupe202dcefrefactor(frontend): rename palette classes to design system color rolesdaed1f4achore(frontend): vendor the Talos design system color tokens7f49d7c2fix: return only the access error for a denied requestefb2b313fix: return the same error for a missing and an inaccessible target50c54240fix(frontend): add v prefix to installer image tagaec660d6fix(frontend): make some style fixes on cluster list1add4ee3feat(frontend): add a resource browser to the UIfb8ed2a8fix: reconnect machines which lose META during the Talos install0c92a23ffix(frontend): check kubespanlink instead of kubespanconfig8a33e78echore: rekres and skip the frontend build output in the license check8ef475fefix: do not allow concurrent upgrades for talos and kubernetesb7f2441dfix: cache the schematics Omni ensures on the image factoriese93ef2a8fix: allow the Talos MD and LVM teardown APIs1551ae75feat: label the default Talos and Kubernetes versionsdf7cf37dfix: assign a new SideroLink address when the WireGuard key changes48317b5efix: allow dotted output directories in omnictl downloadsca06102bfix: manage the lifetime of the cached Talos clients with explicit leases512c3f6afix: don't give a pending machine the address of another machine's linkf2a84e3ffeat(frontend): add enterprise labels to maintenance modalsc6d27890refactor(frontend): replace apexcharts with d3.js742e3493refactor(frontend): rewrite RadialBar to use SVGs9a4993fefix: ignore the ACS query for unsolicited SAML responses9537978dfix: keep the cached Talos clients alive while they are in useb601b93cfeat(frontend): add syntax highlighting to code block77eb3909fix: reject unknown omnictl config contexts3b21eba7feat(frontend): use @pierre/diffs for config historyf2d2634arefactor(frontend): migrate TButtonGroup to reka-uie92fa49cfix: stop the upgrade loop caused by protected args in KernelArgs4c90feb9fix: do not report k8s manifests as deleting when Omni does not own them383a9251feat(frontend): add page titles to all omni pagesd022e670fix(frontend): show enterprise label for cluster on overviewd5c5168cfeat(frontend): show a generic text based fallback avatara5ac0271fix: forbid changing roles to or from InfraProviderad7039c7fix: honor context override in omnictl config infodd2a7e63feat: support adding user labels through join tokensd2f3a105refactor(frontend): replace some detached scopes with createSharedComposable4d136658test(frontend): add e2e-talemu suite for enterprise testsfeb98267fix: stop using the plain Talos installer image for installs52b75392fix: do not keep a stale schematic ID for machines not yet installedb09a7028fix: correct handling of Wireguard peers and tunnel mode8c20c4f6feat: validate undefined group references in AccessPolicy rules9eeeb0e5chore: bump deps, rekres, Talos 1.14.1, Kubernetes 1.37.0e4041f80test: add the image factory migration integration test4d2ec274feat(frontend): show a message that cluster security UI requires enterprise2c5757bafeat(frontend): add enterprise label to cluster overviewe2393ba4feat: copy enterprise label to more resources597a2a7ffeat(frontend): handle not found scan reports in uiee6fbebbfix(frontend): make security docs link _blankaf38fa7efeat(frontend): group talos versions by minorb07c96b1feat(frontend): add enterprise label to talos select lists9e2860ecrefactor(frontend): extract all select components into individual files93425e99refactor(frontend): create a singular talos version select component299ebecafix: allow image removal API83658d3bfix: remove incomplete installation media downloadse9e00a62feat(frontend): add loading state for image download links9b09485erefactor: normalize factory urls at input onlya8e640cefix: keep the untouched machines out of a canceled Talos upgradebcc5bb86test: drop MinIO usage in the tests
Changes from siderolabs/discovery-service
7 commits
1f4c8c9release(v1.1.3): prepare release828e951fix: do not report live affiliates as deleted on endpoint expiry90d0dcarelease(v1.1.2): prepare release293c000feat: optimize memory usage of Discovery Servicededbdb1chore: update golang, direct deps, generate3f6e594chore: rekres14ae016feat: add flag to configure log level
Changes from siderolabs/gen
2 commits
cbd9518chore: rekres and update deps26ccee1feat: provide new YAMl unmarshal validator for null values
Changes from siderolabs/go-kubernetes
2 commits
1a7f4fbfix: set a logger on the ssa controller-runtime clientf752bb3feat: add Kubernetes 1.38 compatibility
Changes from siderolabs/image-factory
21 commits
f3d984drelease(v1.7.2): prepare release79b67d7chore: add cdn hmac verificationa54d48arefactor(http): remove shared dependency bag983ec95refactor(http): isolate registry services015a950refactor(http): isolate OCI routing58b4086refactor(http): isolate browser adaptersdf928e0refactor(http): isolate image services7c5173erefactor(http): unify route authentication55a9fffrefactor(http): isolate endpoint ownersae77d98feat(http): declare route ownershipbe369f1refactor(http): declare route metadata77ecb9erelease(v1.7.1): prepare releasefec432dfeat: update dependenciesc99ce3afeat: improve the token UI73f93b2test: switch to SeaweedFS instead of minio for testingc35986afeat: add 'On Premises' role to the token UI42d9b84fix(scanner): wait for database replacementfeaf2f6fix: download 1.14.05da8c30release(v1.7.0): prepare release513036cfix: cache unauthenticated iPXE scripts, dedupe cache signing5fec48btest: characterize HTTP frontend behavior
Changes from siderolabs/siderolink
2 commits
755a982chore: update dependencies and rekres5d6e09ffix: rework keying of the streams to the peers
Dependency Changes
- cel.dev/cel-go v0.32.0 new
- github.com/ProtonMail/go-crypto v1.4.1 -> v1.5.2
- github.com/ProtonMail/gopenpgp/v3 v3.4.1 -> v3.5.2
- github.com/auth0/go-jwt-middleware/v3 v3.3.0 -> v3.4.0
- github.com/aws/aws-sdk-go-v2 v1.46.0 -> v1.47.3
- github.com/aws/aws-sdk-go-v2/config v1.33.3 -> v1.33.9
- github.com/aws/aws-sdk-go-v2/credentials v1.20.3 -> v1.20.9
- github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.3 -> v0.4.17
- github.com/aws/aws-sdk-go-v2/service/s3 v1.111.0 -> v1.114.3
- github.com/aws/smithy-go v1.28.1 -> v1.28.5
- github.com/beevik/etree v1.8.1 new
- github.com/cenkalti/backoff/v7 v7.0.1 new
- github.com/dustin/go-humanize v1.0.1 -> v1.1.0
- github.com/fluxcd/cli-utils v1.3.0 -> v1.4.0
- github.com/fluxcd/pkg/ssa v0.77.0 -> v0.80.0
- github.com/go-jose/go-jose/v4 v4.1.5 -> v4.1.6
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 -> v2.32.0
- github.com/mattn/go-shellwords v1.0.14 -> v1.0.16
- github.com/prometheus/client_golang v1.24.1 -> v1.25.0
- github.com/prometheus/common v0.71.0 -> v0.72.1
- github.com/siderolabs/discovery-service v1.1.1 -> v1.1.3
- github.com/siderolabs/gen v0.8.7 -> v0.8.8
- github.com/siderolabs/go-kubernetes v0.2.41 -> v0.2.43
- github.com/siderolabs/image-factory 4520b38a89a6 -> v1.7.2
- github.com/siderolabs/siderolink v0.3.17 -> v0.3.18
- github.com/siderolabs/talos/pkg/machinery 5c5fd29e95f7 -> v1.15.0-alpha.1
- github.com/stripe/stripe-go/v86 v86.4.2 new
- github.com/zitadel/oidc/v3 v3.49.6 -> v3.51.16
- go.etcd.io/etcd/client/pkg/v3 v3.7.1 -> v3.7.2
- go.etcd.io/etcd/client/v3 v3.7.1 -> v3.7.2
- go.etcd.io/etcd/pkg/v3 v3.7.1 -> v3.7.2
- go.etcd.io/etcd/server/v3 v3.7.1 -> v3.7.2
- golang.org/x/crypto v0.56.0 -> v0.58.0
- golang.org/x/net v0.58.0 -> v0.61.0
- golang.org/x/oauth2 v0.36.0 -> v0.37.0
- golang.org/x/sync v0.22.0 -> v0.24.0
- golang.org/x/text v0.41.0 -> v0.43.0
- golang.org/x/time v0.15.0 -> v0.16.0
- golang.org/x/tools v0.49.0 -> v0.52.0
- golang.zx2c4.com/wireguard ecfc5a8d5446 -> 2631ce99a06f
- google.golang.org/grpc v1.83.2 -> v1.84.0
- k8s.io/api v0.37.0 -> v0.37.1
- k8s.io/apimachinery v0.37.0 -> v0.37.1
- k8s.io/client-go v0.37.0 -> v0.37.1
- sigs.k8s.io/controller-runtime v0.25.0 -> v0.25.2
Previous release can be found at v1.12.0