Skip to content
Release Radar

Headlamp

Kubernetes

A Kubernetes web UI that is fully-featured, user-friendly and extensible

v0.45.023 days after v0.44.0
View on GitHub

Release history

v0.45.0

CompareGitHub

Headlamp 0.45.0 reduces desktop startup memory and unnecessary background requests, while adding new scheduling and Gateway API views, guided resource creation forms, and more flexible plugin and product customization. Security updates protect desktop APIs, verify external plugin archives, and close command-consent and dependency vulnerabilities. Accessibility improvements make high-zoom layouts, keyboard controls, and custom theme contrast more usable, alongside 31 bug fixes across authentication, port forwarding, Resource Map, tables, and the desktop app.

⚡ Performance

<img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="800" height="0" alt=""><img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="200" height="0" alt="">
Plugin i18n now fetches only the active locale's translation file instead of all declared locales, preventing a flood of 404 requests when a plugin declares multiple languages.Thanks to:<br>@YousufFFFF<br>@r0hansaxena.<br>Thanks to @mjeanrichard for reporting.<br>#7363
Desktop startup now defers optional work, retains smaller Kubernetes objects, and tunes garbage collection, reducing memory by about 60 MiB RSS across combined isolated measurements.Thanks to @illume.<br>#7358
Replaced the manual setInterval in useClustersVersion with React Query's useQueries, so polling pauses when the browser tab is hidden and unnecessary network requests to connected clusters are avoided.Thanks to:<br>@shreyas-acharya<br>@illume.<br>#6707

✨ Enhancements (part 1)

<img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="800" height="0" alt=""><img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="200" height="0" alt="">
Added target container selection for ephemeral debug containers, allowing users to share the process namespace and filesystem of a specific container in multi-container pods during debugging.Thanks to:<br>@Suyog241005<br>@yush-1018.<br>Thanks to @eightfourseventwo for reporting.<br>#7245
Added a 'Keep Large Graph Groups Expanded' setting that persists namespace group expansion state across sessions, eliminating repetitive manual expansion clicks on large cluster resource maps.Thanks to:<br>@Suyog241005<br>@mudit06mah.<br>Thanks to @syorito-hatsuki for reporting.<br>#7156
A right-click context menu with copy and paste options has been added to the pod terminal, so users can copy and paste text without workarounds.Thanks to @rootp1.<br>Thanks to @jimmyjones2 for reporting.<br>#7121
Added a form-based UI for creating PersistentVolumeClaims, including multi-select access mode support, so users can provision storage directly from the Storage section without writing raw YAML.Thanks to @anoopw3bdev.<br>#5333
Validated legal documents from the build manifest now appear in About and Legal tabs, letting desktop products present licenses and third-party notices in the app.Thanks to:<br>@illume<br>@joaquimrocha.<br>#7299
Exposed the host operating-system platform through the context-isolated desktop preload API, allowing frontend plugin authors to write platform-aware behavior in Electron builds.Thanks to:<br>@illume<br>@sniok.<br>#7291
Products can now configure custom titles and graphics for error and not-found pages at build time, allowing branded distributions to replace Headlamp's default error content without modifying source code.Thanks to:<br>@illume<br>@joaquimrocha.<br>#7288
The backend app name is configurable through --app-name or HEADLAMP_CONFIG_APP_NAME, letting branded distributions customize version output and User-Agent headers without maintaining a fork.Thanks to:<br>@illume<br>@sniok.<br>#7248
The Azure AKS plugin now receives its required script permissions from app configuration, allowing it to run without manual permission setup.Thanks to @sniok.<br>#7144

Target a specific container when debugging a pod

Choose which application container an ephemeral debug container targets, making its processes and filesystem available for more effective troubleshooting.

<img width="1470" height="724" alt="Dialog for selecting the target container when debugging a pod" src="https://github.com/user-attachments/assets/e50d44b1-0be2-4e3d-85fb-5ea20181cbec" />

Cordoned and Drained node status indicators

See at a glance when a node is unavailable for scheduling instead of mistaking every Ready node for an active one.

<img width="70%" height="auto" alt="frontend: Show Cordoned and Drained status indicators" src="https://github.com/user-attachments/assets/9e38932c-7b6a-491d-8809-f5296e3f2d4a" />

TCPRoute and UDPRoute resource views

Browse and inspect Gateway API TCPRoute and UDPRoute resources directly alongside Headlamp's other Kubernetes resources.

<img width="1280" height="720" alt="frontend: Add TCPRoute and UDPRoute views" src="https://github.com/user-attachments/assets/6ad723f7-0c1c-4ec3-9903-3749476998bf" />

Delete or evict pods

Choose eviction when maintenance should respect disruption safeguards, while retaining direct deletion when it is explicitly needed.

<img width="1470" height="831" alt="Pod action menu offering both Delete and Evict" src="https://github.com/user-attachments/assets/a182ee53-0394-4476-be89-4709185c699e" />

PodGroup and Workload scheduling views

Inspect scheduling resources and their status in dedicated views, making batch workload placement easier to understand.

<img width="1917" height="797" alt="PodGroup and Workload scheduling views" src="https://github.com/user-attachments/assets/e04ecede-f73d-4b21-a667-6f60cf64e4aa" />

<br><br> <br><br>

✨ Enhancements (part 2)

<img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="800" height="0" alt=""><img src="https://raw.githubusercontent.com/kubernetes-sigs/headlamp/main/docs/images/icon.png" width="200" height="0" alt="">
Node list and detail views now display Cordoned and Drained status indicators, making it immediately clear when nodes are unschedulable without requiring users to inspect node conditions manually.Thanks to @tejhan.<br>Thanks to @sarg3nt for reporting.<br>#7100
Plugins can replace or wrap the no-clusters Home page through registerClusterEmptyState, enabling custom onboarding while retaining Headlamp's default actions.Thanks to:<br>@illume<br>@sniok.<br>#7075
Pods without a scheduled node are now grouped under an Unscheduled node in the Resource Map when grouping by node, so pending pods remain visible instead of disappearing from the view.Thanks to:<br>@illume<br>@gambtho.<br>#7069
Desktop plugin and kubeconfig directories are now isolated by product name using a new --kubeconfig-dir option, preventing data collisions between different branded distributions sharing the same machine.Thanks to:<br>@illume<br>@yolossn.<br>#7068
JobSetList now probes the cluster for the JobSet API before rendering, showing a clear unavailable state with install docs when JobSet is not present instead of a confusing generic error.Thanks to @Pritz395.<br>#7016
TCPRoute and UDPRoute resources now have dedicated list and detail views in the Gateway API section, giving users full L4 route visibility alongside the existing HTTPRoute and GRPCRoute support.Thanks to @areycruzer.<br>#7002
GraphView and KubeIcon are now exported through pluginLib, allowing plugin authors to embed the resource map's graph renderer and icon set directly in their own pages.Thanks to @rootp1.<br>Thanks to @danbruno101 for reporting.<br>#6992
The Service details view now lists the pods matched by the service selector, making it immediately obvious when a selector is misconfigured or targets no pods without manually cross-referencing endpoints.Thanks to @krsatyamthakur-droid.<br>Thanks to @jimmyjones2 for reporting.<br>#6972
Hover-to-copy buttons have been added to IP and address table cells, allowing users to grab Pod IP, Cluster IP, External IP, and Endpoint addresses without manually selecting text.Thanks to:<br>@rootp1<br>@pallava-joshi.<br>Thanks to @joaquimrocha for reporting.<br>#7097

Terminal context menu

Copy and paste from a pod terminal using a familiar right-click menu instead of relying only on keyboard shortcuts.

<img width="1900" height="950" alt="Right-clicking in the terminal opens a Copy and Paste context menu" src="https://raw.githubusercontent.com/rootp1/headlamp/rootp1/pr-7146-screenshots/pr-7121-after.png" />

Custom cluster empty states

Plugins can replace or extend the no-clusters screen, allowing distributions to provide onboarding that fits their environment.

Custom cluster empty state

Resource Map plugin APIs

Plugins can reuse Headlamp's graph view and Kubernetes icons to build visualizations that remain consistent with the rest of the interface.

GraphView rendered standalone in Storybook with Resource Map controls

High-resolution system tray icon

The desktop tray icon now stays sharp on high-density displays instead of appearing soft or pixelated.

<img width="54" height="35" alt="app: Add retina system tray icon" src="https://github.com/user-attachments/assets/4a6f614c-60c8-4dd2-8260-4016ea64ad89" />

StatefulSet creation form

Create StatefulSets through a structured form with guided fields instead of writing the complete manifest by hand.

<img width="1900" height="994" alt="frontend: CreateStatefulSetForm: Add create form

…(truncated)

Need for speed! :racing_car: :dash:  Headlamp 0.44.0 extends practical cluster support beyond 30,000 pods. Resource Map remains usable at this scale, Pod lists fetch 1,000 items at a time, Cluster Overview avoids unbounded watch traffic, and Brotli pre-compression reduces typical JavaScript and CSS transfers by 75-80% and server load for compression to 0%. Got dozens of clusters? Headlamp doesn't try to connect to all of them at startup anymore (potentially opening several browser login windows). Four new structured forms cover DaemonSets, CronJobs, Jobs, and ReplicaSets, while ConfigMap binaryData, ServiceAccount permission visibility, Gateway API v1.5.1, and new plugin controls expand day-to-day capabilities. The release includes 99+ bug fixes, including protections against white-screen startup failures when developing Headlamp on Windows, more accurate workload health reporting, stable large-manifest editing on large busy clusters, and actionable cluster connection errors. Accessibility work restores macOS zoom, improves WCAG AA contrast in a few spots, and broadens automated a11y checks. Security and documentation updates add github cosign of release checksums, safer redirects, tested in-cluster kubeconfig examples, and ready-to-use MCP configurations.

These changes were contributed by over 100+ people. Thanks! :tada:

⚡ Performance

ResourceMap performance improved with iterative BFS, graph simplification, and incremental WebSocket updates — 59% faster initial load and 86% faster updates at 2,000 pods, and clusters with 20,000+ pods are now usable where they previously crashed the browser.Thanks to @illume. Also thanks to @itpick for reporting the issue. #4991
Cluster overview now polls pod, node, and event data every minute instead of using persistent watch streams, preventing browser OOMs on large clusters.Thanks to @Aamod007. Also thanks to @lucas-jackson for reporting the issue. #6021
Optimized sidebar rendering to eliminate UI lag and main thread blocking caused by unnecessary DOM nodes and layout thrashing during CSS transitions.Thanks to @Psykii22. #6233
Frontend and plugin static assets are now precompressed with Brotli and served as .br sidecars — JS/CSS bundles are 75–80% smaller over the wire, WASM assets ~60% smaller, and runtime CPU compression overhead drops to zero.Thanks to @illume. #6004
Fixed a memory leak where Backstage receiver event listeners accumulated on each remount of the Home component, improving stability during navigation.Thanks to @Rohith-Saran. #5775
Fixed unbounded memory growth in OIDC login by evicting abandoned state tokens that were never cleaned up when users left the login flow.Thanks to @ayushmaan-16. #5866
Reduced per-message memory allocations in the WebSocket multiplexer hot path by replacing reflection-based decoding and fmt.Sprintf with typed structs and string concatenation.Thanks to @Slambot01. #6294
Reduced memory allocations in the k8cache hot path by checking error status before marshalling and replacing fmt.Sprintf with string concatenation, improving cache performance.Thanks to @Slambot01. #6420
Replaced repeated linear metrics searches with a memoized namespace/name-keyed Map in the Pod List, reducing CPU overhead during metric lookups.Thanks to @skools-here. #6011
Added pagination to the Pods list with a 1000-item budget and a load-more button, preventing out-of-memory crashes on clusters with tens of thousands of pods.Thanks to @drewbailey. #5660

ResourceMap performance improved with iterative BFS, graph simplification, and incremental WebSocket updates.

20,000+ pods — all operations under 37ms, where previously the browser would crash:

<img width="1700" alt="Resource Map showing 20,000+ pods with all operations under 37ms" src="https://github.com/user-attachments/assets/0f208f59-635a-40ba-a964-a828c418729a" />

Added pagination to the Pods list with a 1,000-item budget and a load-more button, preventing out-of-memory crashes on clusters with tens of thousands of pods.

<img width="1700" alt="Pod list showing 1,000 of ~35,600 pods with a Load more button" src="https://github.com/user-attachments/assets/fbb5e598-693d-4538-a1ea-2a0d70c033c0" /> <img width="336" height="71" alt="lots of pods" src="https://github.com/user-attachments/assets/7cbc2b5c-70d0-409f-b234-3dbb9dc9efe0" />

<br><br> <br><br>

📱 Mobile

A mobile audit was done, and a number of improvements were made.

Tables now hide least-important columns first on narrow viewports instead of squashing them, keeping visible data readable at high zoom levels.Thanks to @skoeva. #6468
Fixed several mobile UI issues including overflow-menu, dialog, terminal, editor, and temporary-sidebar behaviour, making the interface more reliable on small screens.Thanks to @illume. #5739

Tables now hide least-important columns first on narrow viewports instead of squashing them.

<img width="390" alt="Resource table keeping important columns readable on a narrow viewport" src="https://github.com/user-attachments/assets/53cdc2d7-32f1-4c4c-bbe4-dd23321b205a" />

Mobile overflow menus and terminal dialogs now use the available screen space more effectively.

<img width="390" alt="Mobile overflow menu with labelled Settings and Account actions" src="https://github.com/user-attachments/assets/0417f3e6-21ab-4f54-afea-0123664b45ef" /> <img width="390" alt="Full-screen terminal dialog using the available mobile viewport" src="https://github.com/user-attachments/assets/42754076-c3c9-47fa-bc98-e0477ad8c81a" />

<br><br> <br><br>

✨ Enhancements (part 1 of 2)

Administrators can now set a custom default node shell image via a --node-shell-image flag and Helm value, useful for airgapped or restricted deployments.Thanks to @aryanraj45. #6056
The ServiceAccount detail page now lists all RoleBindings and ClusterRoleBindings that reference the account, making it easy to audit granted permissions.Thanks to @sudhidutta7694. Also thanks to @jcpunk for reporting the issue. #6040
Added a structured creation form for DaemonSets, letting users create DaemonSet resources through the UI form alongside the existing YAML editor.Thanks to @vyncent-t. #6514
Added a structured CreateCronJobForm for CronJob resources, letting users configure schedule, time zone, concurrency policy, and job template fields through the UI.Thanks to @vyncent-t. #6422
Added a structured create form for Job resources with field validation, reusable metadata fields, and a new boolean/checkbox field type.Thanks to @vyncent-t. #6343
In-cluster context name is now automatically derived from the kubeadm-config ConfigMap, removing the need to manually set --in-cluster-context-name.Thanks to @Anjali-Chauhan1. Also thanks to @jcpunk for reporting the issue. #6342
Added support for the binaryData field in ConfigMap detail and list views, so binary entries are now displayed, editable, and counted alongside data.Thanks to @dabico. #6264
Node debugger settings now show the actual default Docker image and namespace as dynamic placeholders, matching backend configuration including custom overrides.Thanks to @dabico. #6253
Added Arabic, Hebrew, and Russian localizations to the data table component so users of those languages see correctly translated table UI strings.Thanks to @Priyanshu-rgbb. #6226
YAML syntax errors in EditorDialog now display a red squiggly underline at the exact line and column, making it easier to spot and fix invalid YAML before applying.Thanks to @Psykii22. #5954

Added support for the binaryData field in ConfigMap detail and list views, so binary entries are now displayed, editable, and counted alongside data.

<img width="2976" height="1822" alt="ConfigMap detail view showing binaryData field alongside data" src="https://github.com/user-attachments/assets/27d18def-bdb9-4895-a09e-347392ed6794" />

Added a structured creation form for DaemonSets, letting users create DaemonSet resources through the UI form alongside the existing YAML editor.

<img width="2058" height="1248" alt="DaemonSet structured creation form" src="https://github.com/user-attachments/assets/94cefc8a-e5ff-40c3-b8f6-35173511faee" />

YAML syntax errors in EditorDialog now display a red squiggly underline at the exact line and column, making it easier to spot and fix invalid YAML before applying.

<img width="1700" alt="Monaco editor showing red squiggly underline on YAML syntax error" src="https://github.com/user-attachments/assets/b7f731f8-b5bd-41d0-ac98-3589a9e5caa7" />

<br><br> <br><br>

✨ Enhancements (part 2 of 2)

Headlamp now auto-connects only to recently-used clusters on startup, avoiding slow or disruptive credential prompts for users with many clusters in their kubeconfig.Thanks to @skoeva. #6169
Added a --node-shell-namespace flag and Helm value so admins can configure the namespace used for node shell pods instead of defaulting to 'default'.Thanks to @aryanraj45. #6072
Added a structured create form for ReplicaSets with Metadata, Spec, and Pod Template sections, so users no longer need to write raw YAML to create one.Thanks to @vyncent-t. #5995
Added 100 as a rows-per-page option in resource tables, reducing the number of paginations needed when browsing namespaces with more than 50 resources.Thanks to @ibshafique. #5971
Added a color-coded usage progress bar to the ResourceQuota detail view, making it easy to spot quota pressure at a glance.Thanks to @beep-boopp. #5875
Added a desktop setting to optionally hide the system tray icon, giving users who prefer no tray presence an easy opt-out.T

…(truncated)

✨ Enhancements

  • Added opt-in service account token auth for in-cluster deployments, enabling Headlamp to work behind OIDC or other external auth proxies. Thanks to @0xMH and @unixpariah. Also thanks to @yolossn for reporting the issue.
  • Helm chart probes now support a configurable scheme (HTTP/HTTPS) and full timing settings, enabling correct probe behavior when backend TLS is enabled. Thanks to @gambtho. Also thanks to @mbasha86 for reporting the issue.
  • Added alpha support for ClusterProfile discovery via the Cluster Inventory API, enabling automatic multi-cluster registration without manual kubeconfig setup. Thanks to @kahirokunn.
  • Added hostAliases support to the Helm chart pod template, allowing custom host-to-IP mappings to be configured via chart values. Thanks to @VijayabaskarR-06. Also thanks to @geochip for reporting the issue.
  • Added Russian language support to the frontend, making Headlamp more accessible for Russian-speaking users. Thanks to @Future998.
  • Added proxy auth support so Headlamp can read authentication headers injected by middleware proxies for seamless cluster access. Thanks to @ageekymonk.
  • Added dry-run preview for rollbacks, letting users inspect the resulting resource YAML before applying a rollout undo. Thanks to @alokdangre. Also thanks to @illume for reporting the issue.
  • Added a node upgrade visualization panel showing Cordon, Drain, Delete, Reimage, Complete progress for managed nodes. Support for visualising upgrades in more k8s distros and systems coming soon. Thanks to @Jenniferyingni
  • Added RTL layout support and new locales for Arabic, Urdu, and Hebrew, with the UI direction switching automatically based on the selected language. Thanks to @mahmoodalisha.
  • Completed missing Hindi translations for UI strings, ensuring users with a Hindi locale see a fully translated interface. Thanks to @mahmoodalisha.
  • Added a batch scale action to the multi-select toolbar, letting users scale multiple Deployments, StatefulSets, or ReplicaSets at once. Thanks to @RajPrakash681.
  • Added registerProjectApiResource() to the plugin API, enabling plugins to include custom CRDs in Project resource fetching. Thanks to @NAME-ASHWANIYADAV.
  • Added a diagnostics section to Pod and workload detail pages that surfaces deterministic troubleshooting hints from Kubernetes status, events, and container data. Thanks to @Utkarshpandey0001.
  • Added a Dry Run option to the YAML editor, letting users validate manifests against the Kubernetes API before applying them. Thanks to @Vikaspal8923.
  • Made the Back button on the cluster authentication chooser keyboard-accessible by adding tab focus and Enter/Space key handling. Thanks to @YadavAkhileshh.
  • Added missing French translations, improving UI localization coverage and keeping Kubernetes terms like "cluster" technically accurate. Thanks to @codeurluce.
  • Integrated @typescript/native-preview for frontend type checking, cutting type-check time from ~18-20 seconds down to ~3-4 seconds. Thanks to @sniok.
  • Advanced Search queries can now be saved to browser local storage and restored, renamed, or deleted from the toolbar. Thanks to @Utkarshpandey0001.
  • Added a dedicated Job details view surfacing completions, parallelism, backoff limit, active/succeeded/failed counts, and more, replacing the generic workload view. Thanks to @beep-boopp.
  • Added remark-gfm to the headlamp-plugin do-not-copy list to prevent it from being incorrectly bundled into plugin builds. Thanks to @illume.
  • Added ReadHeaderTimeout and IdleTimeout to the backend HTTP server, reducing slow-request attack risk while keeping logs and WebSockets unaffected. Thanks to @ayushmaan-16.
  • Helm chart now supports setting a default pod debug image via values, used as the fallback when no per-cluster override is configured. Thanks to @harrshita123.
  • Events table on the cluster overview page now includes a Node column showing which node emitted each event. Thanks to @VijayabaskarR-06. Also thanks to @trashhead for reporting the issue.
  • Job details view now includes a Logs button, letting you view logs from related pods without leaving the Job page. Thanks to @ChunyiLyu.
  • Added a container query parameter to pod log and exec deep-links, letting users link directly to a specific container's logs or terminal. Thanks to @jordanly.
  • Resource detail views now show additional fields matching kubectl describe output, including port info for NodePort services. Thanks to @joaquimrocha.
  • Added a Create Deployment form to the UI, letting users create Deployments directly alongside the existing Pod creation workflow. Thanks to @vyncent-t.
  • Helm repository add and update operations now support authentication fields including username, password, and TLS options for private repositories. Thanks to @Athang69.
  • Added --default-light-theme and related CLI flags so administrators can configure the default UI theme at runtime based on OS preference. Thanks to @guillaumebernard84.
  • Added Windows Arm64 desktop builds, expanding native platform coverage to Arm-based Windows devices. Thanks to @illume.
  • Added Bengali language support to the frontend and translated technical Kubernetes jargon, improving localization for Bengali-speaking users. Thanks to @Pratik-050.
  • Node List and Details views now show the node pool, with a new getNodePool() method on the node model and Nodes added as a source to the Cluster group in the resource map. Thanks to @illume.
  • Added an opt-in Chromium remote debugging port to the Electron app, enabling devtools and MCP integrations. Thanks to @yolossn
  • Added a kubeconfig secretreader example to the Helm chart, pinned the Cluster Inventory provider images, and allowed Cluster Inventory commands to run under plugin mounts. Thanks to @kahirokunn.

Added alpha support for ClusterProfile discovery via the Cluster Inventory API

<img width="800" height="352" alt="Headlamp UI showing alpha ClusterProfile discovery via the Cluster Inventory API" src="https://github.com/user-attachments/assets/674137f5-99db-4d7f-ab50-d91b19202704" />

Added RTL layout support and new locales for Arabic, Urdu, and Hebrew

<img width="1918" height="972" alt="Headlamp UI with right-to-left layout and Arabic locale" src="https://github.com/user-attachments/assets/9882af74-6fb2-452c-980a-f74a99da269e" />

Added a node upgrade visualization panel

<img width="1624" height="360" alt="AKS node upgrade visualization panel summary view" src="https://github.com/user-attachments/assets/a12720c3-f1e2-4c51-a63b-55dabb051f89" />

<img width="1889" height="946" alt="AKS node upgrade visualization panel detailed view" src="https://github.com/user-attachments/assets/16d666ed-6f91-4780-b3fd-0136da201892" />

Added Russian language support to the frontend

<img width="1920" height="955" alt="Headlamp frontend displayed with Russian language support" src="https://github.com/user-attachments/assets/a686aff5-43c1-4a97-b309-86341922641e" />

Added proxy auth support for middleware proxies

<img width="1037" height="433" alt="Proxy authentication settings for middleware proxies" src="https://github.com/user-attachments/assets/0eab409e-622c-425e-87da-2e7203f319dd" />

Added a diagnostics section to Pod and workload detail pages

<img width="1256" height="1060" alt="Diagnostics section on a Pod and workload detail page" src="https://github.com/user-attachments/assets/002a4ad0-462d-4095-a0c4-59bde8ec65af" />

Job details view now includes a Logs button

<img width="839" height="420" alt="Job details view with a Logs button" src="https://github.com/user-attachments/assets/a2fd6e4c-0607-4648-a697-c2a77e520f95" />

Added a Create Deployment form to the UI

<img width="1646" height="926" alt="Create Deployment form in the Headlamp UI" src="https://github.com/user-attachments/assets/e7dc37e6-5e92-4d4c-bb3e-0c1c5c9a0701" />

Added a dedicated Job details view

<img width="807" height="397" alt="Dedicated Job details view in the Headlamp UI" src="https://github.com/user-attachments/assets/9a03471b-0738-4e88-97a6-66318f29156b" />

🐞 Bug Fixes

  • Switched macOS notarization back to electron-builder, combining codesign, notarize, and staple into a single step using APPLEID credentials. Thanks to @joaquimrocha.
  • Fixed OIDC login failures when no custom CA cert is configured, so public providers like Entra ID, Okta, and Google now work correctly. Thanks to @beep-boopp. Also thanks to @muhammad9970 for reporting the issue.
  • Fixed parseRam and parseDiskSpace silently dropping decimal portions (e.g., '289.9Mi'), so memory and disk quantities are now parsed accurately. Thanks to @WasThatRudy. Also thanks to @thehandsomezebra for reporting the issue.
  • Fixed the Electron app on Linux and Windows to fully quit when the window is closed instead of continuing to run in the background. Thanks to @Mohammed-Thaha. Also thanks to @Hronom for reporting the issue.
  • Fixed stale Pod status icons in the list view that stayed yellow/warning even after a Pod had passed its readiness checks. Thanks to @RustamSheoran. Also thanks to @vikash7485 for reporting the issue.
  • Fixed the Helm chart release workflow failing when it attempted to push provenance files as gzipped archives. Thanks to @onedr0p. Also thanks to @joryirving for reporting the issue.
  • Table rows-per-page selection is now saved to localStorage, so the preference persists across page refreshes. Thanks to @ChayanDass. Also thanks to @illume for reporting the issue.
  • Fixed missing edges in the resource map when nodes move between cloud and namespace-specific views. Thanks to @gattytto.
  • Fixed a crash that prevented Headlamp from loading on Firefox browsers by removing problematic i18n normalisation. Thanks to @DhairyaMajmudar.
  • Fixed a data race on the portforward Status and Error fields by introducing a mutex and thread-safe accessors, improving port-fo

…(truncated)

Hitch hikers guide to Headlamp 0.42.0

Deep-link support was added for pod terminals (?view=exec) and log views (?view=logs), letting users bookmark or share direct links to specific UI states. Resources can now be searched by label in all list views, the Log Viewer gains a severity filter dropdown, and a delete button has been added directly to the plugins list. Node Details received two new sections for pod capacity usage and resource allocation, and the Resource Map now renders status badges on plugin-provided nodes and includes previously missing configuration resources. GRPCRoute details reach full parity with HTTPRoute, and a guided form-based resource creation UI (starting with Pods) is now available alongside the YAML editor.

On the reliability side, a silent cache desync that caused permanently stale cluster data was fixed, along with a lock-order inversion deadlock that could freeze WebSocket connections under load, and a wave of React hooks rule violations across more than a dozen frontend components. Several backend panics were fixed in port-forwarding, kubeconfig parsing, cache key generation, and Helm chart type handling, alongside debounced log aggregation to prevent UI freezes in All Pods mode. Security hardening includes path traversal prevention in the service proxy and dependency bumps.

✨ Enhancements (part 1)

Enhancements
Added deep-link support for pod exec via ?view=exec query parameter, letting users bookmark or share direct links to open a terminal into a specific pod.Thanks to @justinas-wix. #4941
Added a hidden 'labels' column to all resource list views so users can search resources by label (e.g. app=test) using the existing search bar.Thanks to @sniok. Also thanks to @illume for reporting the issue. #5035
Resource map graph nodes now support optional status metadata, allowing plugin-provided nodes to display warning and error badges like built-in resources.Thanks to @mahmoudmagdy1-1. #5349
Added a pod capacity usage tile to the node details view so users can see how many pods are scheduled versus the node's allocatable pod limit.Thanks to @Vikaspal8923. Also thanks to @jimmyjones2 for reporting the issue. #5039
Extended a8r.io annotation support from Services to all Kubernetes resources, letting users see human-readable service discovery metadata on any annotated resource.Thanks to @mastermaxx03. #5007
Added a severity filter dropdown to the Log Viewer, letting users quickly filter logs by level (ERROR, WARN, INFO, DEBUG) to cut through noisy streams.Thanks to @Utkarshpandey0001. #5338
Added a delete button directly to the plugins list page, so users can remove plugins without navigating to the detail page first.Thanks to @rickbrouwer. #5314
Added ?view=logs deep-link support on Deployment, ReplicaSet, DaemonSet, and StatefulSet detail pages, letting users open the logs view directly from a URL.Thanks to @bhat-ganesh. #5312
Added missing configuration resources to the Resource Map graph so they are now fully visible in the Configuration group.Thanks to @vishnukothakapu. #5223

Added a hidden 'labels' column to all resource list views so users can search resources by label (e.g. app=test) using the existing search bar.

<img width="1361" height="471" alt="frontend: ResourceTable: Add new 'labels' column to all list views to allow searching by label" src="https://github.com/user-attachments/assets/81e57f3f-5124-41e2-9e81-b68b31bc6bc8" />

Added a delete button directly to the plugins list page, so users can remove plugins without navigating to the detail page first.

<img width="1556" height="347" alt="frontend: Add delete button to plugin list" src="https://github.com/user-attachments/assets/58dc151b-b211-4a00-bebb-71e3e43f7875" />

Added a guided form-based UI for creating Kubernetes resources (starting with Pods), accessible from the sidebar and Pod list page alongside the existing YAML editor workflow.

<img width="2104" height="1021" alt="frontend: CreateResourceForm: Add resource form create feature and CreateResourceForm" src="https://github.com/user-attachments/assets/1c871ccd-8d59-4748-89f1-f8934df991d6" />

<br><br> <br><br>

✨ Enhancements (part 2)

Enhancements
Added ephemeral storage usage chart to the Node Details view, giving users visibility into ephemeral storage consumption alongside other node stats.Thanks to @Vikaspal8923. Also thanks to @jimmyjones2 for reporting the issue. #5169
Added a 'Review changes' tab to the resource editor dialog so users can diff the original manifest against their edits before applying.Thanks to @Vikaspal8923. #5018
Added a background janitor to evict expired Kubernetes clientsets, fixing an unbounded memory leak that could cause OOM crashes on busy clusters.Thanks to @Joshna907. #5286
Wrapped the Reconnect button label in LogViewer with the translation function and added the key to all 12 locale files, enabling full i18n support.Thanks to @NAME-ASHWANIYADAV. #5176
GRPCRoute details view now shows rules, hostnames, matches, backendRefs, and filters, bringing it to full parity with HTTPRoute details.Thanks to @NAME-ASHWANIYADAV. #5174

Resource map graph nodes now support optional status metadata, allowing plugin-provided nodes to display warning and error badges like built-in resources.

<img width="1800" height="844" alt="docs: frontend: resourceMap: Add status support for map nodes" src="https://github.com/user-attachments/assets/1465f71a-e020-49f4-96d0-ac57427f398a" />

Added ephemeral storage usage chart to the Node Details view, giving users visibility into ephemeral storage consumption alongside other node stats.

<img width="3072" height="1728" alt="Screenshot from 2026-04-20 14-32-54" src="https://github.com/user-attachments/assets/5e5cb349-00e2-45f1-8b88-51d752acd880" />

Added a download YAML button to the resource table, letting users export any resource manifest directly from the table view.

<img width="3072" height="1728" alt="Screenshot from 2026-04-12 19-27-27" src="https://github.com/user-attachments/assets/c339986b-cb9d-4c91-a2ad-e90add022e97" />

Improved global search UX by adding a clear button to the search input and showing a pointer cursor on hover over search results.

<img width="2495" height="1390" alt="Screenshot from 2026-03-25 13-18-28" src="https://github.com/user-attachments/assets/bcac7e08-b364-4f2c-bbb0-ff4092fcbe03" />

<br><br> <br><br>

✨ Enhancements (part 3)

Enhancements
Added a toast notification when port-forwarding fails so users are explicitly informed instead of errors being silently logged to the console.Thanks to @itvi-1234. #5145
Added a download YAML button to the resource table, letting users export any resource manifest directly from the table view.Thanks to @Vikaspal8923. #5126
Added UI support for the Kubernetes VolumeAttributesClass resource in the Storage section, including list and detail views.Thanks to @Vikaspal8923. #5119
Added service.extraServicePorts and matching Ingress backend support to the Helm chart, allowing sidecar containers to be exposed without a separate Service resource.Thanks to @Soli0222. #5078
Added a Resource Allocation section to Node Details showing total CPU/Memory requests, limits, and their percentage of node capacity alongside existing usage metrics.Thanks to @itvi-1234. #5048
Added a guided form-based UI for creating Kubernetes resources (starting with Pods), accessible from the sidebar and Pod list page alongside the existing YAML editor workflow.Thanks to @vyncent-t. #5044
Container port names are now displayed alongside protocol and port number in the containers list, providing more complete port information at a glance.Thanks to @itvi-1234. Also thanks to @trashhead for reporting the issue. #4956

Added a pod capacity usage tile to the node details view so users can see how many pods are scheduled versus the node's allocatable pod limit.

<img width="3066" height="1535" alt="Screenshot from 2026-04-02 23-21-10" src="https://github.com/user-attachments/assets/5ab9d7cc-4621-4b4b-bbc7-c1868bd4b9c2" />

Added a 'Review changes' tab to the resource editor dialog so users can diff the original manifest against their edits before applying.

<img width="3071" height="1555" alt="frontend: EditorDialog :add yaml diff view in editor to compare original manifest against edited" src="https://github.com/user-attachments/assets/0b197298-e8f5-4045-85e4-92113d6397dc" />

Added UI support for the Kubernetes VolumeAttributesClass resource in the Storage section, including list and detail views.

<img width="3072" height="1728" alt="Screenshot from 2026-04-11 13-59-36" src="https://github.com/user-attachments/assets/b652251d-1df3-40c4-8f79-1c1f665fd3a9" />

Container port names are now displayed alongside protocol and port number in the containers list, providing more complete port information at a glance.

<img width="761" height="740" alt="frontend:Show container port name if available" src="https://github.com/user-attachments/assets/a352f8ab-a631-48e4-9cfe-b0fc97e0d02a" />

<br><br> <br><br>

✨ Enhancements (part 4)

Enhancements
Aligned frontend duration/age formatting with Kubernetes apimachinery logic, ensuring consistent age display matching kubectl behavior.Thanks to @ChayanDass. Also thanks to @joaquimrocha for reporting the issue. #4931
Improved global search UX by adding a clear button to the search input and showing a pointer cursor on hover over search results.Thanks to @Vikaspal8923. #4965

Extended a8r.io annotation support from Services to all Kubernetes resources, letting users see human-readable service discovery metadata on any

…(truncated)

✨ Enhancements

  • Implement rollback for Deployment, DaemonSet, StatefulSet. Including to specific revision and Revision history view. Thanks to @alokdangre
  • Add multi-cluster user logout. Thanks to @alokdangre
  • Enable cluster deletion in browser. Thanks to @alokdangre
  • Display environment variables for containers in pod details views. Thanks to @gambtho
  • Added Toggle Switch to filter helm secrets. Thanks to @mudit06mah
  • Add session-ttl flag and logic. Thanks to @mudit06mah
  • Allow OIDC cookies when in-cluster is false via flag. Thanks to @beep-boopp
  • Add MCP server support for plugins including the ai-assistant. Thanks to @illume
  • Add support for traefik or any reverse proxy handling auth through middlewares. Thanks to @ageekymonk

🐞 Bug Fixes

  • Fix flaky PodDetailsView Storybook test. Thanks to @mahmoudmagdy1-1
  • Fix ARIA menu role in ClusterChooserPopup. Thanks to @mahmoudmagdy1-1
  • Correct aria attributes in ShowHideLabel component. Thanks to @greedy-wudpeckr
  • Fix PluginSettings heading hierarchy. Thanks to @greedy-wudpeckr
  • Fix a11y roles in ClusterChooserPopup for screen readers. Thanks to @mahmoudmagdy1-1
  • Fix alignment in narrow layouts for NameValueTable. Thanks to @mahmoudmagdy1-1
  • Fixed ignored k8cache error handling. Thanks to @greedy-wudpeckr
  • Add crossorigin to manifest link. Thanks to @zyzzmohit
  • Fix age column sorting in ObjectEventList. Thanks to @greedy-wudpeckr
  • Auto-detect platform for Apple Silicon Macs. Thanks to @Mandalorian7773
  • Add translatable aria-label fallback to Loader for screen readers. Thanks to @mastermaxx03
  • Ensure complementary landmark has valid label in Activity. Thanks to @mastermaxx03
  • Fix new project heading a11y issue. Thanks to @vyncent-t
  • Default to init container if main container not yet running. Thanks to @mastermaxx03
  • Add responsive width to ConfirmDialog. Thanks to @ChayanDass
  • Fix alignment name and button in clusterRename. Thanks to @ChayanDass
  • Remove inert property from Sidebar. Thanks to @sniok
  • Populate empty DialogTitle in AuthTypeoidc story. Thanks to @CODEAbhinav-art
  • Wrap MenuItem in MenuList for RestartMultipleButton. Thanks to @Vaishnav-Dhaval
  • Add dialog title to HaveClusters story. Thanks to @CODEAbhinav-art
  • Add missing properties to HeadlampTables interface. Thanks to @pallava-joshi
  • Correct broken cluster settings navigation. Thanks to @emmanuel-ferdman
  • Remove empty h1 from ClusterDialog. Thanks to @aravind4799
  • Fix narration for Default Namespace in SettingsCluster. Thanks to @vyncent-t
  • Disable close on select in PureNamespaceAutocomplete. Thanks to @YotamKorah
  • Cascade delete Pods when deleting Jobs. Thanks to @beep-boopp
  • Fix cluster rename bug for clusters with special characters. Thanks to @StevenPG
  • Avoid invalid field selector for pod metrics. Thanks to @wingerx
  • Persist rows-per-page selection to localStorage on change in Table. Thanks to @Trulsaa
  • Preserve original URL after OIDC authentication. Thanks to @justinas-wix
  • Fix scheme conversion and logging in multiplexer. Thanks to @illume
  • Stop watcher goroutines on server shutdown. Thanks to @zyzzmohit
  • Fix picking the hash for chocolatey version bump. Thanks to @joaquimrocha
  • Fix showing corrupt file on Mac. Thanks to @mastermaxx03
  • Add make cluster list scrollable to improve usability for keyboard users. Thanks to @mahmoudmagdy1-1

💻 Development

  • Support apiGroup + kind for registerKindIcon. Thanks to @aadhil2k4
  • Update app, backend, frontend, headlamp-plugin dependencies. Thanks to @skoeva
  • Move HeadlampConfig to headlampconfig package. Thanks to @krrish-sehgal
  • Add update and delete coverage to informer tests for k8cache. Thanks to @ChayanDass
  • Refactor ts: made customResourceDefinition optional in CRClassArgs. Thanks to @pallava-joshi
  • Lift up tableSettings helpers and add localStorage to ClusterTable. Thanks to @StevenPG
  • Fix translations by using fs-backend with frontend locales path. Thanks to @sniok
  • Replace execSync with execFileSync in headlamp-plugin/scripts. Thanks to @skoeva
  • Fix delete error handling to show correct success/failure messages. Thanks to @gambtho
  • Bundle source with esbuild, upgrade to vitest. Thanks to @sniok
  • Refactor NavigationTabs component so it doesn't require cloning. Thanks to @sniok
  • Add .cmd shim for Windows to headlamp-plugin. Thanks to @skoeva
  • Add tests and stories for AuthToken Component. Thanks to @aravind4799
  • Add test for terminal.tsx file. Thanks to @ChayanDass
  • Add Storybook stories for ResourceTableColumnChooser. Thanks to @mastermaxx03
  • Add stories for SettingsClusters and SettingsCluster. Thanks to @greedy-wudpeckr
  • Add test for LogsButton.tsx file. Thanks to @aravind4799
  • Provide automatic aria-labelledby for Dialog accessibility. Thanks to @mastermaxx03
  • Update Terminal snapshots. Thanks to @mastermaxx03
  • headlamp-plugin: Bump to 0.13.1

📖 Documentation

  • Add documentation for Oracle K8s Engine support. Thanks to @jaiakash
  • Add OpenUnison configuration guide. Thanks to @mlbiam
  • Add many more plugin development tutorials including for List and Detail views. Thanks to @yolossn
  • Fix some typos in contributing guide. Thanks to @gmarav05

<!-- end-release-notes --> Container image: :whale: ghcr.io/headlamp-k8s/headlamp:v0.41.0 Desktop Apps:

:penguin: Flatpak / Linux (AMD64) :penguin: Linux AppImage AMD64, ARM64, ARMv7l :penguin: Linux Tarball AMD64, ARM64, ARMv7l :penguin: Debian / Linux AMD64 :green_apple: Mac (AMD64) :green_apple: Mac (ARM/M1) :blue_square: Windows (AMD64)