github kubernetes-sigs/headlamp v0.46.0
0.46.0

latest release: headlamp-helm-0.46.0
6 hours ago

Headlamp 0.46.0 introduces alpha support for Kubernetes Dynamic Resource Allocation, making device classes, GPU claims, and claim templates visible in the dashboard. New hierarchical workload views, Job suspend and resume actions, a configurable details drawer, and a guided Endpoints form simplify everyday cluster work, while service port-forwards reconnect automatically after pod restarts. The release also improves OIDC login and logout, strengthens plugin credential isolation and release signing, and expands integration points for desktop products. Accessibility, localization, frontend build tooling, and reliability improvements round out the release across web and desktop.

🌟 Dynamic Resource Allocation (alpha): see how workloads get GPUs and other devices

Headlamp now shows Kubernetes Dynamic Resource Allocation (DRA), the Kubernetes API that workloads use to request GPUs and other devices. A new Devices section appears on clusters that serve resource.k8s.io/v1 (Kubernetes 1.34+). DRA support is in alpha.

Devices section and Device Classes

Browse the device classes your cluster offers, with their CEL selectors, driver settings, and extended resource names, in a Devices section that only appears where DRA is served.

Headlamp Devices section showing the Device Classes list with class names, selector counts, drivers, and extended resources

Device Class details

See the CEL selectors a class uses to pick devices, shown exactly as written, along with its extended resource name and driver settings.

DeviceClass big-gpu.example.com details showing its extended resource and two CEL selector expressions

Resource Claims

See whether each claim is waiting for a device, allocated, or in use, along with the devices it was granted and the node they are on.

Resource Claims list showing pending and in-use GPU claims with their device classes, allocated devices, and nodes

Resource Claim Templates

Templates describe the devices a Pod asks for, and Kubernetes makes a new claim from them for every Pod. See each template's namespace, how many requests it makes, and which device classes it uses.

Resource Claim Templates list showing template names, namespaces, request counts, and GPU device classes

Implemented across #7724, #7820, and #7971. Thanks to @Anjali-Chauhan1. Feedback is welcome on #4831.






✨ Enhancements (part 1)

Adds an OIDC auto-login server flag and Helm setting so users are redirected straight to the identity provider without clicking a login button, fixing post-login redirect bugs along the way. Thanks to:
@Suyog241005
@mudit06mah.
Thanks to @menardorama for reporting.
#7071
Adds Suspend and Resume actions for Jobs in the details header and table row menu, so users can toggle spec.suspend without editing YAML or using kubectl. Thanks to @PixelRobots.
#7698
Adds a setting to open the details drawer on the right, left, or bottom instead of a hardcoded right side, letting users place the panel where they prefer, with the choice saved locally. Thanks to @WasThatRudy.
Thanks to @jasoncologix for reporting.
#7126
Added French translations for 75 missing strings, mostly in the new create forms and address validation messages, so French-speaking users see these forms in their language while Kubernetes API values stay untranslated. Thanks to @berlewis.
#7902
The desktop build manifest now accepts a product-owned company name and a separate Linux maintainer contact, mapped to Electron Builder metadata, so branded products can set their own publisher details. Thanks to @illume.
#7746
Products can now declare an explicit approvedCommands list separate from plugin-authorized commands, giving product-owned defaults without seeding user settings or auto-approving every shipped plugin command. Thanks to @illume.
#7685
Added a guided create form for Endpoints that edits subsets, addresses and ports and validates them like the API server, so users avoid hand-writing YAML and catch errors such as loopback IPs before submitting. Thanks to @vyncent-t.
#7666

Adds Suspend and Resume actions for Jobs in the details header and table row menu, so users can toggle spec.suspend without editing YAML or using kubectl.

Headlamp Jobs page with the headlamp-suspend-demo details drawer and its suspend action in the toolbar






✨ Enhancements (part 2)

Added CompositePodGroup views for hierarchical gang scheduling, so users can see the nested pod group tree and tell which part of a nested workload failed to schedule. Thanks to @Anjali-Chauhan1.
#7542
Browser document titles now include the configured product name, so branded Headlamp builds remain identifiable in tabs and browser history. Thanks to:
@illume
@sniok.
#7298
Branded Headlamp builds can now set an optional distribution product version that the top-bar menu shows, while the version dialog keeps the Headlamp version and Git commit for clear identification. Thanks to:
@illume
@joaquimrocha.
#7287
Adds a validated registry for desktop OAuth callback providers that routes startup, second-instance and macOS protocol callbacks to them, while unmatched product URLs keep using the existing deep-link path. Thanks to:
@illume
@gambtho.
#7281
Exporting stable IDs for the built-in project creation choices lets plugins replace the namespace or YAML option with their own creator, while additional plugin choices stay after the two built-in ones. Thanks to:
@illume
@gambtho.
#7280
Project overview cards from plugins are now hidden when their component renders nothing, so users no longer see empty cards while populated sections keep the standard three-column layout. Thanks to:
@illume
@sniok
@ashu8912.
#7279
The desktop app now reads checkForUpdates from the packaged build manifest, falling back to HEADLAMP_CHECK_FOR_UPDATES, so downstream builds can configure update checks at packaging time. Thanks to:
@illume
@sniok.
#7278
Service-backed port-forwards now reconnect automatically by resolving a new pod through the Endpoints API after a pod restart, so rolling updates no longer leave them stopped and needing a manual restart. Thanks to @Slambot01.
#7273
The desktop app now reads its protocol scheme from product metadata and rejects malformed or other-product deep links, so branded builds handle only their own links while headlamp remains the default. Thanks to:
@illume
@gambtho.
#7252

Added CompositePodGroup views for hierarchical gang scheduling, so users can see the nested pod group tree and tell which part of a nested workload failed to schedule.

PodGroup prefill-0 details showing gang policy, minimum count, workload, composite pod group, and scheduled condition

Project overview cards from plugins are now hidden when their component renders nothing, so users no longer see empty cards while populated sections keep the standard three-column layout.

Project overview before the fix, with an empty custom card beside populated sections






✨ Enhancements (part 3)

Headlamp's custom Table now honors enableTopToolbar={false} and enableRowSelection={false}, so hidden toolbars stay hidden and independent checkbox cells keep their native behavior. Thanks to:
@illume
@sniok.
#7051
Plugins can register custom project namespace grouping through registerProjectGrouping, while default grouping and repeated project IDs stay distinct so namespaces are not wrongly merged. Thanks to:
@illume
@yolossn.
#6905
LogViewer gains a Copy to Clipboard action, allowing users to copy log output directly without downloading it first. Thanks to @Priyanshu-rgbb.
#6813






🐞 Bug fixes (part 1)

Adds RP-initiated OIDC logout for server-owned contexts so signing out ends the provider's SSO session instead of silently signing the same user straight back in. Thanks to:
@big-appled
@skoeva.
Thanks to @manujayanth for reporting.
#5972
Quiets the kubeconfig watcher when kubeconfig files are missing, so a default in-cluster Headlamp no longer fills its pod log with misleading ERROR lines when nothing is wrong. Thanks to @govindup63.
Thanks to @NoamBrodie and @BigFlagBurito for reporting.
#5731
Checks the latest Helm release revision instead of only deployed ones, so failed or pending releases can be viewed, rolled back, or uninstalled and missing releases correctly return 404. Thanks to @NachiketPatil26.
Thanks to @ghost for reporting.
#7859
Service pod lookup for port-forwarding now uses the service resource's own cluster, so the port-forward button no longer goes missing when service details are opened from a project view. Thanks to @tejhan.
#7958
EndpointSlices are now matched to Services via the kubernetes.io/service-name label before falling back to ownerReferences, so API-server-created slices like the default kubernetes one link to their Service. Thanks to @aashu2006.
#7931
Editing a container port in the create resource form now preserves other ports and the edited port's fields like name and protocol, preventing silent data loss and crashes on partially typed YAML rows. Thanks to @HarshPopat23.
#7914
Fixed a crash in the Service details view when an EndpointSlice has null endpoints, so services with no ready backends, such as a Deployment scaled to 0, still display correctly. Thanks to @Pradyuman-aviator.
#7909
Service External IP now shows the external name for ExternalName services and <pending> for LoadBalancers without ingress, matching kubectl instead of showing a misleading "-". Thanks to @Aarti-panchal01.
#7907
Diagnostics now surface negative-polarity conditions like ReplicaFailure=True, so workloads blocked by a ResourceQuota or admission controller from creating pods show the explanatory failure message. Thanks to @HarshPopat23.
#7904
StorageClass now recognizes the beta is-default-class annotation as well as the GA one, so default classes show as default in list and details views, matching kubectl get sc. Thanks to @NachiketPatil26.
Thanks to @ghost for reporting.
#7900

EndpointSlices now link to their Services

Headlamp resource map showing the kubernetes Service connected to its Endpoints and EndpointSlice






🐞 Bug fixes (part 2)

The PVC create form now keeps the StorageClass input visible while its text is being edited, so replacing a name no longer hides the field and creates the PVC with the default StorageClass instead. Thanks to @9p-tech.
#7897
Replica count helpers now tolerate workloads with no status, such as JobSets waiting on a Kueue MultiKueue manager cluster, preventing the Workloads overview from crashing. Thanks to @glassharbor.
#7893
Custom resource date printer columns are now formatted only when the field has a value, so unset dates show an empty cell instead of "Invalid Date". Thanks to @Aarti-panchal01.
#7892
The log viewer search now subscribes to result changes before running findNext, so the match count updates correctly while typing instead of showing "Too many matches" or a stale count. Thanks to @9p-tech.
#7889
Docker extension releases now build, publish and sign the image without pushing a version bump to main, which Prow rejects, so the extension can update beyond 0.35.0 again. Thanks to @govindup63.
Thanks to @skoeva for reporting.
#7877
The desktop app's deep-link handler now adds a missing slash after the # in the URL, so returns from flows like OAuth route to the correct page. Thanks to @sapnilbiswas.
#7872
The Home Warnings column now merges results from every allowed namespace per cluster instead of keeping only the last, so warning counts are correct with multiple namespaces. Thanks to @9p-tech.
#7866
Renaming a cluster back to its original name now works and clears the saved custom name, instead of failing with a 'custom name already in use' error. Thanks to @h55n.
Thanks to @9p-tech for reporting.
#7843
Backend start scripts now run through cross-env, so npm start works on Windows where cmd.exe can't parse POSIX-style variable prefixes and the backend previously never started. Thanks to @carterpewpew.
Thanks to @Adi-204 for reporting.
#7839
Request tracing and metrics middleware are now attached to the router that actually serves requests, restoring HTTP spans with -tracing-enabled while keeping streaming responses working. Thanks to @dlanov.
Thanks to @silvioincalza for reporting.
#7762






🐞 Bug fixes (part 3)

Node Details now shows all capacity and allocatable resources instead of a hardcoded key list, so extended resources such as GPUs and hugepages are visible to users. Thanks to @Anushka-2905.
Thanks to @jayaprajapatii for reporting.
#7603
The Release Notes dialog now keeps GitHub's zero-height table header images and their sizing instead of stripping them, so release note tables and images render readably. Thanks to @NachiketPatil26.
Thanks to @sniok for reporting.
#7573
Settings now reads the app's live theme through useTheme() instead of importing a test-only fixture, so production code no longer depends on TestHelpers and follows the real theme. Thanks to @Priyanshu-rgbb.
#7493
Safe requests are now retried after client-go refreshes an exec credential following a transient 401, so users no longer see the token login dialog when the next request would succeed. Thanks to @nungster.
#7483
The macOS tray icon now uses 16×16 and 32×32 template images in place of the 22×22 and 44×44 ones, so it matches the size of neighboring menu-bar icons instead of looking oversized. Thanks to @nova9.
#7476
CronJob Spawn Job now binds the request to the CronJob's own cluster, so the Job is no longer created on the wrong cluster when the URL cluster differs after the grace period. Thanks to:
@YousufFFFF
@yolossn.
#7304
Desktop runCommand IPC listeners are now released when commands exit or are rejected, preventing leaked subscriptions and making plugin manager command cleanup consistent. Thanks to:
@illume
@tejhan.
#7277
Lowercase k is now parsed as kilo in byte quantities, so Kubernetes values like 500k read as 500000 bytes instead of being silently under-reported by 1000x. Thanks to:
@omlahore
@skoeva.
#7073
Query retries now stop immediately for permanent HTTP errors below 500 while still retrying temporary ones like 408 and 429, avoiding pointless repeat requests that cannot succeed. Thanks to:
@illume
@sniok.
#6907

Release notes render tables and images correctly

Headlamp Release Notes dialog displaying formatted tables and images






🐞 Bug fixes (part 4)

Electron Zoom In, Zoom Out, and Reset menu actions are restored after plugin menu serialization strips callbacks, so users can zoom the app again from the menu. Thanks to:
@illume
@skoeva.
#6891
Byte-quantity parsing now handles micro (u) and nano (n) suffixes, so fractional values no longer fall through as raw bytes and skew memory usage percentages by about 1000x. Thanks to @Pratikdeb07.
#6817
MCP clients no longer restart when only secondary selected clusters are reordered, avoiding unnecessary disruption while keeping the current cluster first and backend context order deterministic. Thanks to @rootp1.
#6536






🔒 Security

Added grouped weekly Dependabot updates for Go modules, GitHub Actions and Docker base images, so dependencies and pinned actions stay current without manual work or one PR per backend module. Thanks to @skoeva.
#7864
Release signing now works for checksums, container images and release tags, dropping the broken GPG signature, so users can verify releases and tags are signed consistently. Thanks to @skoeva.
#7858
Added a provider-neutral cluster registration framework to the desktop app, allowing authorized product plugins to retrieve cluster credentials and safely register clusters in the user's kubeconfig. Thanks to @illume.
#7744
Service proxy requests with a relative URI now keep the configured URIPrefix base path and block encoded traversal, so requests like /status resolve under /api/v1/proxy instead of the host root. Thanks to @zanarellidev.
#7594
Desktop plugins can now use Electron safeStorage through a frozen pluginSecureStorage API with per-plugin namespaces and token-based access, so each plugin's encrypted values stay isolated from others. Thanks to:
@illume
@gambtho.
#7253
MCP desktop debug logging is now off by default and redacts values when HEADLAMP_MCP_DEBUG=true, so arguments and cluster metadata no longer leak into logs. Thanks to @rootp1.
#6529
Desktop MCP child processes now get only the SDK's default platform environment plus explicitly configured server env values, so the full Headlamp process environment is no longer inherited. Thanks to @rootp1.
#6521






♿ Accessibility

Adds alt+shift+p and alt+shift+d hotkeys for Pods and Deployments that keep the selected namespace filter, so users no longer have to re-select it after keyboard navigation. Thanks to @aditya-c7.
Thanks to @Rucha0901 for reporting.
#7851
Removes a stale RestartMultipleButton entry from the accessibility baseline, so CI strictly enforces the already-fixed aria-required-parent rule and catches regressions. Thanks to @Bhargava-Ram-Thunga.
Thanks to @illume for reporting.
#7395
Cluster Overview pod and node status pie charts now link to filtered list views, so users can jump straight to unready pods, cordoned nodes, or unready nodes when troubleshooting. Thanks to @Suyog241005.
Thanks to @kriswuollett for reporting.
#6748
Removed the resolved scrollable-region-focusable entry from the Storybook accessibility baseline for ClusterChooserPopup, keeping the baseline accurate now that the list is keyboard-focusable and axe-core no longer flags it. Thanks to @ubermensch177.
Thanks to @illume for reporting.
#7898
DropZoneBox now uses a theme-aware border instead of hardcoded pure black, so the drop area outline stays visible in dark mode. Thanks to @Priyanshu-rgbb.
#7551
The editor dialog now asks for confirmation before discarding unsaved changes via Close, X, Escape or backdrop, preventing accidental loss of edits while pristine editors still close immediately. Thanks to @Adi-204.
#7443
VersionDialog now falls back to 'Headlamp' when the product name is unset and stale axe baseline entries are removed, so the dialog always has an accessible name and title. Thanks to @Bhargava-Ram-Thunga.
Thanks to @illume for reporting.
#7425
Project Details can now grow past the viewport, the resources grid keeps a 300 px minimum height and the category list is capped and scrollable, keeping content usable at high zoom. Thanks to:
@illume
@gambtho.
#7293
ShowHideLabel's expand/collapse button now sits outside the label element and carries the aria-expanded and aria-controls attributes, fixing an accessibility issue for assistive technology users. Thanks to @Alok-work23.
Thanks to @illume for reporting.
#7267
Stale label-title-only entries were removed from the accessibility baseline for the Settings stories, so the baseline reflects the fixed Debug Image field and no longer lists resolved violations. Thanks to @Bhargava-Ram-Thunga.
Thanks to @illume for reporting.
#7224
Resource-map labels now reflow instead of using fixed sizing, preventing content from being clipped at 200% text zoom. Thanks to:
@illume
@gambtho.
#6910
Kubeconfig load dialog errors now use the themed MUI Alert component instead of a hardcoded red box, so they follow the active theme and include an error icon rather than relying on color alone. Thanks to @Satyam087.
#7751

Visible file upload borders in dark mode

File upload area in dark mode with a visible dashed border and readable selection text

Confirmation before discarding unsaved edits

Confirmation dialog asking whether to discard unsaved editor changes

Themed kubeconfig error alerts

Kubeconfig load dialog showing a themed error alert with an error icon






⚡ Performance and Build Speed

Table filters now reuse stable row models and cache dropdown options on demand, avoiding repeated work while restoring Status and Namespace filters on large clusters with their memory safeguards intact. Thanks to @srebb.
#7486
Makes Rsbuild the default frontend builder while keeping Vite scripts available, addressing build crashes on low-memory CI and slow or broken dev mode on Windows. Thanks to @illume.
Thanks to @vyncent-t for reporting.
#7712
Packaging no longer runs an intermediate unpacked Electron Builder pass and adds a prepared-assets path, so repeated package preparation is avoided and builds with prebuilt assets skip redundant work. Thanks to @illume.
#7727
The Build App workflow now caches npm and Go dependencies and cancels superseded runs on new pushes, making one of the slowest PR checks faster and avoiding wasted builds. Thanks to @skoeva.
#6210
Removed the dead base-branch coverage step from the backend-test workflow, so PRs run the test suite once instead of twice and save roughly 40-50 seconds. Thanks to @skoeva.
#6190






📖 Documentation

The identity-aware proxy guide now includes a Pomerium example with Ingress Controller setup and Headlamp Helm values, helping users configure it and understand the shared service account for API access. Thanks to @desimone.
#7227






💻 Development (part 1)

Wraps the SettingsCluster loading text in the translation function, so the loading indicator appears in the user's chosen language like other loaders. Thanks to @Priyanshu-rgbb.
#7553
Bundled Plugin Catalog updated from 0.4.4 to 0.4.5 with its new archive SHA-256 checksum pinned, so builds ship the latest catalog release with a verified archive. Thanks to @illume.
#7979
Added the missing Portuguese translation key for the table filter message, so the frontend i18n check passes again on main. Thanks to @Aarti-panchal01.
#7953
Terminal storybook snapshots now normalize xterm's counter-based ids in injected style tags, making the storyshots independent of how many xterm instances were created earlier in the test run. Thanks to @Priyanshu-rgbb.
#7908
Added unit tests for the BackLink component covering its label, styling and back navigation, so regressions in this shared navigation element are caught early. Thanks to @sapnilbiswas.
#7895
Added unit tests for the SectionBox layout component covering its content and title rendering, so regressions in this widely used common component are caught early. Thanks to @sapnilbiswas.
#7884
Added unit tests for the EmptyContent component covering string and ReactNode children and color forwarding, helping catch regressions in how it renders. Thanks to @sapnilbiswas.
#7868
Packaging now reports start times and elapsed durations for backend, app assembly, post-pack and artifact build phases, making it easier for developers to see where build time goes. Thanks to @illume.
#7731






💻 Development (part 2)

The product manifest's display name is now applied to the Electron runtime before storage modules load, so branded development builds use their own default profile directory instead of sharing Headlamp's. Thanks to @illume.
#7615
Adds empty batch/v1 Job and CronJob list responses to the frontend and plugin-template Storybook mocks, so workload list stories no longer depend on unhandled Kubernetes API requests. Thanks to:
@illume
@skoeva.
#7473
Expands Storybook apps/v1 workload mocks to cover namespaced and cluster-prefixed requests, with end-to-end regressions for all four apps workload list pages so these stories render reliably. Thanks to:
@illume
@skoeva.
#7438
Desktop command execution now reports distinct exit codes (-1, -2, -3) for invalid data, rejected permission secrets and denied consent, letting renderer callers tell these rejections apart. Thanks to:
@illume
@tejhan.
#7294
Added regression tests for ActivitiesRenderer's route-change policy, so ordinary split-right activities stay visible while blocking activities and details drawers are minimized as intended. Thanks to @illume.
#6323






💻 Development (part 3)

Frontend product name, version and source revision are now generated from the selected build manifest and safely escaped for Vite's dotenv format, so packaged-source metadata is preserved without comment or expansion corruption. Thanks to @illume.
#7474
Added TypeScript declarations and test coverage for the shared i18next parser and runtime configuration, making locale selection and right-to-left direction verifiable for developers. Thanks to:
@illume
@sniok.
#7066
Added a Storybook story for the EventsLifetimeInfo component, giving it snapshot test coverage through the repo's storybook tests where it previously had none. Thanks to @xonas1101.
#6507
The warning bar in the PerformanceTest2000Pods story now uses full width and border-box sizing, so it stays aligned when Change % is set to 25% or 50%. Thanks to @anurag-p6.
#7477

Added TypeScript declarations and test coverage for the shared i18next parser and runtime configuration, making locale selection and right-to-left direction verifiable for developers.

Headlamp General Settings with Arabic selected and the interface displayed right to left

Container image: 🐳 ghcr.io/headlamp-k8s/headlamp:v0.46.0
Desktop Apps:

⚠️ Important: Information on warnings from Windows when running Headlamp unsigned apps.

🐧 Flatpak / Linux (AMD64)
🐧 Linux AppImage AMD64, ARM64, ARMv7l
🐧 Linux Tarball AMD64, ARM64, ARMv7l
🐧 Debian / Linux AMD64
🍏 Mac (AMD64)
🍏 Mac (ARM/M1)
🟦 Windows (AMD64)
🟦 Windows (ARM64)

Don't miss a new headlamp release

NewReleases is sending notifications on new releases.