✨ Enhancements:
- Add support for EndpointSlice resources
- Add memory for table sorting column and direction across navigation. Thanks to @krrish-sehgal
- Enhance global search to support searching by labels and improve multi-term queries
- Add a button to copy a resource's name to the clipboard. Thanks to @farodin91
- Standardize resource naming behavior across all resource types. Thanks to @farodin91
- Add support for more rule types in HTTPRoute resources. Thanks to @farodin91
- Fix and improve the log viewer inputs for responsiveness and usability
- Add a default security context and allow the plugins manager to use the global security context in Helm charts. Thanks to @jda258
- Add optional backend TLS termination support. Thanks to @shahvrushali22 and @vijayant7
- Add support for an optional PodDisruptionBudget in the Helm chart. Thanks to @jcpunk
- Add the ability to specify custom
podLabels
in the Helm chart. Thanks to @vnea - Add snackbar notifications for plugin deletion actions
- Add support for opening external URLs from the sidebar in a new tab. Thanks to @Exar04
- Add
namespaceOverride
support to the Helm chart. Thanks to @rstribrn - Allow plugins to override default tabs in the project details view
- Add an
isEnabled
method to allow plugins to conditionally render project detail tabs - Add support for
HEADLAMP_APP_
andREACT_APP_
environment variables in plugins - Add support for running Headlamp embedded within Backstage
- Add the ability for plugins to register a custom delete button for projects
- Add a loader and error page for the initial backend connection
Copy resource name to clipboard

Persistent Table sorting
Tables will now remember your sorting choices

Search improvements
You can now search by labels and combine multiple terms by separating them with spaces

Added support of EndpointSlices
EndpointsSlices are now available in Network sidebar

🐞 Bug fixes
- Fix the text contrast of notification menu items on dark themes
- Fix the base URL feature to ensure the application loads correctly when a base URL is configured. Thanks to @DanielLeone
- Fix an issue where deleting one dynamic cluster removed all clusters from the same kubeconfig
- Prevent stale entries from appearing after renaming a dynamic cluster
- Fix truncated Chinese text in the resource map's graph view buttons. Thanks to @wingerx
- Update the "Type" column header to "Kind" in resource tables for consistency. Thanks to @LinPr
- Fix bundling for icons to ensure they are visible in offline mode
- Add backward compatibility to
createRouteURL
to accept URL paths for route names - Restore the
GetTokenFromCookie
call within theParseClusterAndToken
function - Handle cases where
routeName
is undefined ingetRoute
to prevent crashes - Correct the positioning of CPU/Memory tooltips in the Nodes table. Thanks to @jaehanbyun
- Close the actions menu when the "Edit" button is clicked. Thanks to @jaehanbyun)
- Add a fallback for
idpIssuerURL
to prevent issues with token expiration. Thanks to @lszczepaniak-XM - Fix security context rendering in Helm charts for CI jobs
- Fix a glob pattern in
setup-plugins.js
to support Windows paths - Fix
createRouteURL
to correctly look up routes registered from plugins - Fix project creation when multiple clusters are involved
- Prevent dialog checkbox clicks from triggering table row selection. Thanks to @jaehanbyun
- Disable the backend loader to prevent an error page on application load
💻 Development
- Refactor the
GetExpiryUnixTimeUTC
function into theauth
package - Refactor the configuration parsing function for clarity and reduced complexity
- Extract
DropZoneBox
into its own reusable component - Update application dependencies, removing
electron/notarize
and addingglob
- Replace usages of the deprecated
makeKubeObject()
function with theKubeObject
class - Fix circular dependencies in the
lib/k8s
folder by usingimport type
- Extract functions from
fetch.ts
to new files to avoid circular imports - Resolve circular dependencies in the k8s API proxy imports
- Refactor the router implementation to untangle module imports
- Add Storybook stories for the
DateLabel
component - Refactor the
CacheRefreshedToken
function into theauth
package - Use
import type
in more files to separate type and value imports - Bump the Vite dependency to version 6.3.6 in the frontend and plugins
- Refactor the
IsTokenAboutToExpire
function into theauth
package - Add logging to the plugin
npm start
command to show where files are copied - Fix Storybook support for plugins
- Export missing functions and types from the headlamp-plugin package
- Fix the return type for
HeaderActionFuncType
to correctly includeReactNode
- Refactor the
GetNewToken
function into theauth
package - Fix the Docker extension release process to consistently use the
latest
tag - Disable the nightly build workflow on forked repositories
- Update the failing EndpointSlice snapshot test
- Improve the plugin
create
command's speed and security by usingnpm ci
- Update GitHub issue templates to use correct repository labels. Thanks to @jaehanbyun
📖 Documentation
- Enhance the AKS cluster OAuth documentation with clearer steps and Helm-based deployment instructions
- Update the project name in the NOTICE file
- Add a note about the removal of
libgconf-2-4
on newer Ubuntu releases - Add VKS (VMware Kubernetes Service) to the list of supported platforms. Thanks to @papivot
- Fix a broken link to the architecture page from the plugins documentation
🧩 Shipped Plugins
- Update shipped plugin prometheus 0.8.0
- Update dependencies
- Update shipped plugin plugin-catalog 0.4.1 (desktop only)
- Update dependencies
- Fix contrast on loading install button
- Fix origin link
- Update shipped plugin app-catalog 0.6.3 (desktop only)
- Update dependencies
- Add package script
Container image: 🐳 ghcr.io/headlamp-k8s/headlamp:v0.36.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)