✨ 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 an AKS node upgrade visualization panel showing Cordon, Drain, Delete, Reimage, Complete progress for managed nodes. 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
Added RTL layout support and new locales for Arabic, Urdu, and Hebrew
Added an AKS node upgrade visualization panel
Added Russian language support to the frontend
Added proxy auth support for middleware proxies
Added a diagnostics section to Pod and workload detail pages
Job details view now includes a Logs button
Added a Create Deployment form to the UI
Added a dedicated Job details view
🐞 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-forwarding stability. Thanks to @NAME-ASHWANIYADAV.
- Fixed broken plugin tests caused by removed ArtifactHub packages and a macOS-incompatible shebang, restoring reliable CI runs. Thanks to @skoeva.
- Helm chart now warns when image.tag is pinned during upgrades, preventing users from unknowingly running an outdated image after a chart update. Thanks to @ManthanNimodiya. Also thanks to @lyc0221 for reporting the issue.
- Backend HTTP transports now clone DefaultTransport when customizing TLS, preserving proxy support and connection timeouts that were previously silently dropped. Thanks to @beep-boopp.
- Fixed backend test failures on Windows by consistently using filepath.Join for all filesystem path operations. Thanks to @PrakharJain345.
- Fixed a React rules-of-hooks violation in ContainerEnvironmentVariables by moving hooks before the early return, eliminating potential rendering bugs. Thanks to @nidhi-9900. Also thanks to @illume for reporting the issue.
- Fixed failing daemonset snapshot tests in main to restore a passing CI build. Thanks to @illume.
- Fixed missing az and gh command support in runPlugin and added proper handling of child process error events. Thanks to @illume.
- Added unit tests for OpenTelemetry metrics initialization to verify that core metrics like RequestCounter and PluginLoadCount are correctly instantiated. Thanks to @CygnusMaximillian.
- Fixed the website trigger workflow to authenticate using GH_TOKEN, resolving failures in the gh api dispatch call. Thanks to @skoeva.
- Fixed useKubeObjectList to strip only the List suffix from kind names, preventing garbled names for resource types like Tekton's EventListener. Thanks to @sniok.
- Fixed a crash when typing partial YAML (e.g., a lone '-') under containers: in the Create Resource dialog, preventing a TypeError from taking down the whole app. Thanks to @WasThatRudy. Also thanks to @lucasgolino for reporting the issue.
- Fixed a memory leak in LogViewer where xterm search addon event listeners accumulated on every effect re-run without being cleaned up. Thanks to @vmridul.
- Dependency installation steps added to development docs, and npm run install:all now includes npm install, streamlining new contributor setup. Thanks to @yuki681.
- Hides the Gateway (beta) filter in the resource map when Gateway API CRDs aren't installed, preventing an infinite-loading state on unsupported clusters. Thanks to @skoeva.
- Node drain operations now stop cleanly when the Headlamp server shuts down, preventing orphaned goroutines from continuing to make Kubernetes API calls indefinitely. Thanks to @RajPrakash681.
- Restored the ?view=logs deep-link for Job details so navigating directly to a Job URL with that parameter now auto-launches the logs view. Thanks to @beep-boopp.
- Stop logging unrelated outer-scope error on missing state in oidc-callback. Thanks to @govindup63. Also thanks to @krsatyamthakur-droid for reporting the issue.
- Fixed a crash in ProjectList when a namespace lacked metadata labels, preventing the Projects page from going blank during cache refreshes. Thanks to @govindup63. Also thanks to @erfanium for reporting the issue.
- Fixed a bug in KubeObjectNode where hover-expand would still trigger after moving the mouse away, by replacing clearInterval with clearTimeout. Thanks to @YadavAkhileshh.
- Fixed a drain-status polling leak in Node Details so timers clean up correctly when navigating away or switching nodes, preventing stale state updates. Thanks to @PrakharJain345. Also thanks to @Shreya2005-2005 for reporting the issue.
- Fixed unsafe token assertions in RefreshAndSetToken() that could panic if an OIDC provider returns a token without access_token or id_token. Thanks to @NAME-ASHWANIYADAV.
- Fixed a stale closure in ShowHideLabel by adding maxChars to the useMemo dependency array, ensuring label truncation updates correctly. Thanks to @rajeshsingh241.
- POST /parseKubeConfig now returns 400 Bad Request when the request body is missing, empty, or contains a null kubeconfigs entry. Thanks to @harrshita123.
- Fixed createRouteURL to handle missing route params gracefully, preventing crashes when plugin routes with :namespace/:name params are initialized. Thanks to @WasThatRudy. Also thanks to @arx666x for reporting the issue.
- Fixed a backend panic from invalid glob patterns in /externalproxy and pre-compiles allowed URL patterns once to speed up proxy request validation. Thanks to @ayushmaan-16.
- Fixed a localStorage leak in PortForwardContent where a failed port-forward restart left a stale entry that reappeared incorrectly on page refresh. Thanks to @iashutoshyadav.
- Fixed direct state mutation in PortForwardContent's stop handler by using a spread copy, ensuring React detects the change and re-renders the UI. Thanks to @iashutoshyadav.
- Terminal/log surfaces (pod logs, exec, node shell) now respect the active MUI theme; plugin authors can also customize terminal colors via AppTheme. Thanks to @illume.
- Restored Event class hooks as static methods to fix a compatibility regression introduced by a recent refactor. Thanks to @sniok.
- Helm repository add, remove, and update operations now fail safely when the file lock cannot be acquired, preventing unguarded concurrent file writes. Thanks to @harrshita123.
- Added a code comment explaining why dispatch is intentionally excluded from the useEffect deps array in DetailsViewSection.stories. Thanks to @WasThatRudy.
- The /parseKubeConfig endpoint now stops immediately on malformed JSON instead of continuing execution with a zero-value payload after sending a 400 response. Thanks to @Sambhram1. Also thanks to @harrshita123 for reporting the issue.
- Owner references now resolve using both kind and apiVersion, preventing incorrect 'Controlled by' links from appearing in resource metadata panels. Thanks to @DashratRajpurohit. Also thanks to @mahmoudmagdy1-1 for reporting the issue.
- Fixed a server crash caused by a panic during OIDC login state generation; the backend now returns a proper 500 error instead of terminating the process. Thanks to @NAME-ASHWANIYADAV.
- Added the missing Logs action to the DaemonSet detail page, making it consistent with other workload resource views. Thanks to @beep-boopp.
- Fixed node preview cards in the Resource Map being clipped or overlapped by neighboring node cards when hovered. Thanks to @Dhruv-Kumar-Singh.
- Replaced deprecated onKeyPress with onKeyDown in PortForwardStartDialog, ClusterNameEditor, and SettingsCluster for reliable keyboard interaction. Thanks to @YadavAkhileshh.
- Cluster search in ClusterChooserPopup is now case-insensitive, so clusters can be found regardless of how their name is typed. Thanks to @YadavAkhileshh.
- Fixed a crash when uploading large KubeConfig files by replacing String.fromCharCode.apply with TextDecoder, which has no JavaScript call stack limit. Thanks to @YadavAkhileshh.
- Fixed a goroutine leak where runWatcher goroutines were never cancelled when clusters were removed, preventing indefinite resource exhaustion. Thanks to @Joshna907.
- Removed the stable module-level staticRelations constant from the useMemo dependency array in relations, eliminating a suppressed ESLint rule. Thanks to @WasThatRudy.
- Added a clarifying comment in CustomResourceList explaining why t is intentionally excluded from the cols useMemo deps array, making the suppression self-documenting. Thanks to @WasThatRudy.
- Fixed empty -oidc-scopes argument being unconditionally added to Headlamp deployments when using externalSecret OIDC config without an OIDC_SCOPES key. Thanks to @iashutoshyadav. Also thanks to @mikeywuu for reporting the issue.
- Error messages in the resource editor snackbar no longer expose raw Kubernetes regex validation patterns and are now split into readable bullet lines. Thanks to @RajPrakash681.
- Infrastructure 5xx errors (502, 503, 504) are no longer cached, so Headlamp recovers promptly after load balancer or reverse proxy failures. Thanks to @beep-boopp.
- Fixed the embedded SPA handler so fallback index.html responses correctly set Content-Type based on the actual file served, not always text/html. Thanks to @harrshita123.
- Fixed a bug where a failed URL fetch in the Load from URL dialog would silently load the error body into the editor instead of stopping after showing the error. Thanks to @RajPrakash681.
- Fixed a setInterval leak in WebSocketManager where a failed WebSocket connection left concurrent callers polling forever, wasting resources. Thanks to @RajPrakash681.
- Release notes dialog now renders GitHub Flavored Markdown (tables, strikethrough, task lists) correctly instead of displaying raw markdown text. Thanks to @prabindersinghh. Also thanks to @davidpistachio for reporting the issue.
- Added 8 unit tests for the ConfirmButton component and widened its buttonComponent prop type to accept any React element type. Thanks to @RajPrakash681.
- The "Cluster Settings" page title is now wrapped in the i18n t() function so it correctly translates when using non-English languages. Thanks to @RajPrakash681.
- Fixed missing translation for the 'Refetch Interval' label in Search Settings, so it now displays correctly in non-English languages. Thanks to @RajPrakash681.
- Fixed missing translation for the 'namespace' placeholder in Cluster Settings, ensuring it appears correctly in non-English locales. Thanks to @RajPrakash681.
- Removed an unnecessary useMemo in CustomResourceInstancesList that was re-running every render, fixing a stale dependency suppression and adding test coverage. Thanks to @WasThatRudy.
- Fixed unstable React reconciliation in the ContainerInfo ports list by moving the key prop to the top-level mapped element, preventing unnecessary re-renders. Thanks to @gouravi19.
- Improved cluster error handling in the home view: unavailable or unauthenticated clusters now show clear status labels instead of raw errors like Bad Gateway. Thanks to @harrshita123.
- Fixed a watch subscription leak in useKubeObjectList for cluster-scoped resources like Nodes and ClusterRoles when a cluster is deselected. Thanks to @Sreejesh06.
- Helm repository add/update requests with missing required fields like name or url now correctly return 400 Bad Request instead of a 500 error. Thanks to @harrshita123.
- Fixed the ClusterChooser toolbar label to correctly show the selected cluster name instead of falling back to the wrong route value. Thanks to @harrshita123.
- Added a 30-second timeout to the externalproxy HTTP client, preventing goroutine leaks and server hangs from slow or unresponsive external services. Thanks to @ayushmaan-16.
- Fixed ArrowUp keyboard navigation in ClusterChooserPopup so pressing it on the first item now correctly wraps around to the last item instead of breaking navigation. Thanks to @harrshita123.
- Fixed insufficient WCAG contrast on the global search shortcut hint by using an explicit theme color instead of opacity, improving accessibility. Thanks to @ChandanKT-git. Also thanks to @illume for reporting the issue.
- Refactored GetDefaultKubeConfigPath to return an error instead of calling os.Exit, allowing callers to handle failures gracefully. Thanks to @YadavAkhileshh.
- Replaced deprecated trimLeft() with the ES2019 standard trimStart() in EditorDialog, eliminating use of a deprecated string method. Thanks to @YadavAkhileshh.
- Table row count setting now rejects decimal inputs instead of silently truncating them, preventing unexpected pagination behavior. Thanks to @harrshita123.
- Fixed resource map so a plugin node's custom detailsComponent fully replaces the default kube object details instead of both rendering simultaneously. Thanks to @mahmoudmagdy1-1.
- HTTP proxy responses are now streamed rather than fully buffered in memory, preventing OOM crashes and service disruption when proxying large responses. Thanks to @VijayabaskarR-06.
- Drain node status now accurately reports pod deletion failures instead of always showing success, giving operators reliable drain completion data. Thanks to @beep-boopp.
- Fixed EditorDialog not clearing error messages when using Undo Changes after entering invalid YAML, so the UI now resets correctly. Thanks to @YadavAkhileshh.
- OAuth popup now properly removes event listeners when auth completes, the popup closes, or the component unmounts, preventing memory leaks. Thanks to @Sambhram1. Also thanks to @Utkarshpandey0001 for reporting the issue.
- Added regression tests for EditorDialog's Undo Changes behavior to guard against parse errors reappearing after invalid YAML is reverted. Thanks to @Sambhram1. Also thanks to @Vikaspal8923 for reporting the issue.
- Fixed a WebSocket subscription leak in the multiplexer where unmounting a hook before subscribe resolved left orphaned subscriptions. Thanks to @Utkarshpandey0001.
- Fixed a startup crash caused by malformed JSON in localStorage settings; Headlamp now falls back to defaults instead of getting stuck loading. Thanks to @Vikaspal8923.
- Fixed a stale closure bug in the TimeAgo component that caused displayed relative times to stop updating when the date prop changed. Thanks to @Utkarshpandey0001.
- External proxy now correctly forwards status codes and Content-Type headers, so the UI can accurately display errors from failed external requests. Thanks to @ayushmaan-16.
- Fixed a stale closure in PortForwardingList that silently swallowed port-forwarding errors and caused async state updates after component unmount. Thanks to @KumarADITHYA123.
- Fixed an infinite polling loop and memory leak in NodeDetails when draining a node and navigating away, preventing potential runtime crashes. Thanks to @KumarADITHYA123.
- Fixed swapped health icons in the project resources tab so error and warning statuses now display the correct icons. Thanks to @NAME-ASHWANIYADAV.
- Replaced the unsafe any onClick type with a proper React.MouseEventHandler type in NewProjectPopup, improving type safety. Thanks to @itvi-1234.
- OIDC token refresh now applies the configured issuer override, fixing authentication failures for providers where the discovery URL and issuer differ. Thanks to @m-wack.
- Reduced global lock contention in Kubernetes clientset initialization, allowing concurrent authorization requests to proceed without blocking. Thanks to @Joshna907.
- WebSocket multiplexer now isolates per-request failures so malformed messages, token errors, or cluster dial issues no longer drop the entire client session. Thanks to @PrakharJain345. Also thanks to @prasanna-baskar-igt for reporting the issue.
- Fixed Windows path handling in the backend by using URL-safe joins for request paths and OS-aware paths for filesystem access, resolving Windows test failures. Thanks to @PrakharJain345.
- Fixed React hook dependency violations in the Home component and resolved an empty heading accessibility issue in the Cluster Chooser dialog. Thanks to @PrakharJain345.
- Port-forward and WebSocket proxying now work correctly when the kubeconfig server URL includes a path prefix, ensuring compatibility with reverse-proxy setups. Thanks to @plopoyop.
- The pod log Prettify toggle preference is now saved to localStorage so it persists across page reloads and sessions. Thanks to @Athang69. Also thanks to @LucienLallier for reporting the issue.
- Fixed App Catalog bearer token extraction and a route key collision that silently broke the feature in default in-cluster deployments. Thanks to @Athang69. Also thanks to @v0lkan for reporting the issue.
- Refactored ClusterSettings to centralize state via a new useClusterSettings hook, removing duplicated load/store logic across child components. Thanks to @sniok.
- Resource editor now uses JSON Patch instead of PUT, eliminating 409 Conflict errors when saving frequently-updated resources like HPAs. Thanks to @gambtho. Also thanks to @hitsaurabhraj for reporting the issue.
- SimpleTable now correctly announces when no data is present, improving screen reader accessibility for empty tables. Thanks to @illume.
- Fixed SVG type declarations and TSC errors in example plugins, and enabled useClustersConf so plugin developers can use and test it in examples. Thanks to @illume.
- Fixed an infinite re-render in useKubeObjectList when the namespace was an empty string. Thanks to @ashu8912.
- Refactored how request watching is stopped in useKubeObjectList, ensuring watch requests are reliably cancelled. Thanks to @sniok.
- Fixed stateless cluster handling: corrected stale state and the auth header in fetchStatelessClusterKubeConfigs, made setCluster and parseKubeConfig send the kubeconfigs array, and hardened backend stateless context key generation and parse handling, with added e2e regression coverage. Thanks to @illume.
🔒 Security
- Bumped fast, brace-expansion, ws, containerd, and qs across app, frontend, and backend for security and maintenance updates. Thanks to @skoeva.
💻 Development
- Added comprehensive unit tests for the portforward package, covering HTTP handlers and helper functions that previously had zero CI coverage. Thanks to @NAME-ASHWANIYADAV.
- Bumped the pinned gcb-docker-gcloud Cloud Build image digest to fix the failing post-headlamp-push-images Prow job. Thanks to @skoeva.
- Updated the bundled prometheus, app-catalog, and plugin-catalog plugins to their latest versions. Thanks to @sniok.
- Added unit tests for custom cluster name parsing from the headlamp_info extension to ensure context names are correctly overridden. Thanks to @CygnusMaximillian.
- Improved French glossary translations by filling in missing entries and aligning Kubernetes-related terms with standard French usage. Thanks to @codeurluce.
- Updated the French translation of 'Open an Issue' to better convey that issues cover bugs, feature requests, and questions, not just incidents. Thanks to @codeurluce.
- Bumped the yaml package from 2.8.3 to 2.9.0 to pick up upstream bug fixes and improvements. Thanks to @vyncent-t.
- Refreshed outdated Storybook snapshots so frontend tests pass reliably on main. Thanks to @skoeva.
- Backend Kubernetes Go dependencies upgraded from v0.35.1 to v0.35.3 alongside related modules, keeping the backend secure, up to date, and lint-clean. Thanks to @kahirokunn.
- Replaced nested array iterations with a Map-based lookup for recent cluster resolution, improving re-render performance with large cluster lists. Thanks to @DashratRajpurohit.
- Added a 256-character input guard to FuzzSanitizeClusterName to skip pathological inputs that previously caused CI timeout failures. Thanks to @Athang69.
- GetDefaultKubeConfigPath() now returns an error instead of calling os.Exit(1), giving callers proper control over failures and making the function testable. Thanks to @NAME-ASHWANIYADAV.
- Replaced an uncommon Unicode glyph in Ingress list and detail views with a widely supported alternative, improving cross-platform rendering. Thanks to @dabico.
- Updated dependencies including hono, postcss, fast-uri, langsmith, ip-address, and express-rate-limit across app and plugin packages. Thanks to @skoeva.
- Added 7 unit tests for NewProjectPopup covering rendering, form validation, and step navigation to prevent project creation regressions. Thanks to @itvi-1234.
- Added 5 unit tests for ProjectDeleteDialog covering rendering, cancel flow, and label removal to prevent regressions in project deletion. Thanks to @itvi-1234.
- Renamed four pure-logic files in advancedSearch from .tsx to .ts, correctly reflecting that they contain no JSX. Thanks to @itvi-1234.
- Extracted RefreshAndSetToken from headlamp.go into the auth package with comprehensive tests, improving backend code organization and testability. Thanks to @skoeva.
- Added Loading, Empty, Error, and LongName Storybook stories to the DaemonSet list, enabling complete visual state testing beyond the happy path. Thanks to @sudhidutta7694.
- Fixed a missing route dependency in RouteSwitcher.stories so changing the route arg in Storybook controls now correctly updates the redux store. Thanks to @WasThatRudy.
- Added a verify-build check to confirm headlamp-server is properly terminated when the Electron app closes on Linux, macOS, and Windows. Thanks to @illume.
Added Loading, Empty, Error, and LongName Storybook stories to the DaemonSet list
🧩 Shipped Plugins
- Updated prometheus to version 0.9.0
- Updated plugin-catalog to version 0.4.4
- Updated app-catalog to version 0.9.0
📖 Documentation
- Updated Traefik Middleware apiVersion in the basic auth docs to traefik.io/v1alpha1, replacing the deprecated traefik.containo.us/v1alpha1. Thanks to @skoeva.
- Updated Node.js, npm, and Go version requirements in contributor docs to match the actual versions declared in package.json and go.mod. Thanks to @gravi19. Also thanks to @harrshita123 for reporting the issue.
Container image: 🐳 ghcr.io/headlamp-k8s/headlamp:v0.43.0
Desktop Apps:
🐧 Flatpak / Linux (AMD64)
🐧 Linux AppImage AMD64, ARM64, ARMv7l
🐧 Linux Tarball AMD64, ARM64, ARMv7l
🐧 Debian / Linux AMD64
🍏 Mac (AMD64)
🍏 Mac (ARM/M1)
🟦 Windows (AMD64)