Skip to content

frontend: workload: Fix Pods overview chart to reflect failing pods - #6114

Merged
illume merged 5 commits into
kubernetes-sigs:mainfrom
xonas1101:fix/workloads-pods-chart-health
Jun 26, 2026
Merged

frontend: workload: Fix Pods overview chart to reflect failing pods#6114
illume merged 5 commits into
kubernetes-sigs:mainfrom
xonas1101:fix/workloads-pods-chart-health

Conversation

@xonas1101

Copy link
Copy Markdown
Contributor

What this fixes

Fixes #6090.

On the Workloads overview, the Pods status chart always reported 100% / "N Running", even when pods were in Error, CrashLoopBackOff, ImagePullBackOff, Pending, etc. — it was structurally incapable of ever showing an unhealthy pod.

Root cause

WorkloadCircleChart computes the failed count with a replica-mismatch check:

workloadData?.filter(item => getReadyReplicas(item) !== getTotalReplicas(item)).length

getReadyReplicas/getTotalReplicas only read replica fields (status.readyReplicas, status.numberReady, spec.replicas, status.currentNumberScheduled, status.desiredNumberScheduled). A Pod has none of these, so both helpers return 0, the check is always 0 !== 0false, and the Pods tile can only ever render 100%. This is correct for replica-based kinds (Deployment/StatefulSet/DaemonSet/ReplicaSet) but wrong for Pods.

Approach

  • Add an optional categorize() classifier to WorkloadCircleChart. When provided (Pods only), the chart renders a multi-segment health ring instead of the binary one:
    • 🟢 healthy — Running & Ready, or Succeeded
    • 🟡 degraded — Running but not Ready
    • transitional — Pending / Terminating (not failures)
    • 🔴 failed — Failed phase, or a container in CrashLoopBackOff / ImagePullBackOff / etc.
  • Replica-based tiles keep their existing binary behavior unchanged.
  • getPodHealth() derives the category from the same signals the Pods list already shows (phase, readiness, container waiting reason, deletionTimestamp), so the chart and the list can't disagree. Notably, Terminating and Pending pods are transitional, not failures, which avoids a false-alarm red arc.

Before / after

On a cluster with 89 pods (50 Running&Ready, 13 not-ready, 19 Pending/Terminating, 7 genuinely failing):

Center Legend
Before 100% 89 Running
After 56.2% 50 Running · 7 Failed · 13 Degraded · 19 Other

Testing

  • Updated the Overview storyshot (Pods tile now reflects real health instead of a flat 100%).
  • Charts storyshots for the replica-based tiles are unchanged (binary path untouched).
  • tsc and eslint clean; i18n strings extracted.

Copilot AI review requested due to automatic review settings June 20, 2026 08:53
@k8s-ci-robot k8s-ci-robot added the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label Jun 20, 2026
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: xonas1101
Once this PR has been reviewed and has the lgtm label, please assign sniok for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot
k8s-ci-robot requested review from illume and sniok June 20, 2026 08:53
@k8s-ci-robot k8s-ci-robot added size/L Denotes a PR that changes 100-499 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. labels Jun 20, 2026
@xonas1101
xonas1101 force-pushed the fix/workloads-pods-chart-health branch from 5d4f3d7 to 0c400a6 Compare June 20, 2026 08:55
@k8s-ci-robot k8s-ci-robot removed the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label Jun 20, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes the Workloads overview “Pods” status chart so it can reflect unhealthy pods by introducing pod-specific health categorization, while keeping replica-based workload tiles on the existing binary replica-mismatch behavior.

Changes:

  • Added an optional categorize() path to WorkloadCircleChart to render a multi-segment health ring (healthy/degraded/transitional/failed).
  • Implemented getPodHealth() to bucket pods based on phase/readiness/container state and wired it into the Pods tile.
  • Added the new i18n key Other and updated the Overview storyshot snapshot accordingly.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
frontend/src/components/workload/Overview.tsx Wires categorize() for Pods so the chart uses pod-aware health bucketing.
frontend/src/components/workload/Charts.tsx Adds categorized multi-segment rendering and legend breakdown support.
frontend/src/components/pod/List.tsx Introduces getPodHealth() and health-category typing used by the overview chart.
frontend/src/components/workload/snapshots/Overview.Workloads.stories.storyshot Updates snapshot to reflect the new multi-segment Pods chart output.
frontend/src/i18n/locales/en/translation.json Adds Other translation key used in the new breakdown label.
frontend/src/i18n/locales/ar/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/bn/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/de/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/es/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/fr/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/he/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/hi/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/it/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/ja/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/ko/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/pt/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/ru/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/ta/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/ur/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/zh/translation.json Adds Other key (fallback to English when untranslated).
frontend/src/i18n/locales/zh-tw/translation.json Adds Other key (fallback to English when untranslated).

Comment thread frontend/src/components/pod/List.tsx Outdated
Comment thread frontend/src/components/pod/List.tsx Outdated
Comment thread frontend/src/components/workload/Overview.tsx Outdated
@xonas1101
xonas1101 force-pushed the fix/workloads-pods-chart-health branch from 0c400a6 to 070c55e Compare June 20, 2026 09:07
Comment thread frontend/src/lib/k8s/pod.ts

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 22 out of 22 changed files in this pull request and generated 1 comment.

Comment thread frontend/src/components/workload/Charts.tsx
The Workloads overview reuses WorkloadCircleChart for Pods, but its
default health logic counts an item as failed when getReadyReplicas !=
getTotalReplicas. Pods have none of those replica fields, so both
helpers return 0, the check is always false, and the Pods tile can only
ever render 100% Running regardless of Error/CrashLoopBackOff/
ImagePullBackOff/Pending pods.

Give the chart an optional per-item categorize() classifier. When
provided (Pods only), it renders a multi-segment health ring instead of
the binary one: healthy / degraded (running, not ready) / transitional
(Pending, Terminating) / failed. Replica-based tiles keep their existing
binary behavior unchanged.

Add Pod.getHealth() to derive the category from the same signals the
Pods list already shows (phase, readiness, container waiting/terminated
reason, deletionTimestamp), so the chart and the list can't disagree.
Terminating and Pending pods are treated as transitional rather than
failures (NodeLost stays unhealthy), avoiding false-alarm red arcs. The
helper and the shared WorkloadHealthCategory type live in the k8s model
layer so pages don't need to import the heavy pod list module.

Build the empty-state legend from totalLabel ("0 {{totalLabel}}")
instead of a hard-coded "0 Running", so the chart reads correctly when
reused with a different label (e.g. "0 Total").

Ref: kubernetes-sigs/headlamp issue 6090
Signed-off-by: xonas1101 <aarushsingh1305@gmail.com>
@xonas1101
xonas1101 force-pushed the fix/workloads-pods-chart-health branch from 070c55e to 932b4f3 Compare June 23, 2026 07:20
@illume
illume requested a review from Copilot June 23, 2026 14:50

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 23 out of 23 changed files in this pull request and generated 4 comments.

Comment thread frontend/src/components/workload/Charts.tsx
Comment thread frontend/src/i18n/locales/ur/translation.json
Comment thread frontend/src/components/workload/Overview.tsx Outdated
Comment thread frontend/src/lib/k8s/pod.ts
Signed-off-by: xonas1101 <aarushsingh1305@gmail.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 24 changed files in this pull request and generated 1 comment.

Comment thread frontend/src/components/workload/Charts.tsx
Ref: copilot review on PR 6114
Signed-off-by: xonas1101 <aarushsingh1305@gmail.com>
@xonas1101

Copy link
Copy Markdown
Contributor Author

@illume comments fixed. PTAL.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 24 changed files in this pull request and generated 1 comment.

Comment thread frontend/src/components/workload/Charts.tsx Outdated
Ref: copilot review on PR 6114
Signed-off-by: xonas1101 <aarushsingh1305@gmail.com>
@xonas1101

Copy link
Copy Markdown
Contributor Author

@illume fixed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Comment thread frontend/src/lib/k8s/pod.ts
Comment thread frontend/src/lib/k8s/pod.test.ts

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 24 changed files in this pull request and generated no new comments.

@xonas1101

Copy link
Copy Markdown
Contributor Author

@illume Copilot seems fine with these changes.

@illume illume added priority/critical-urgent Highest priority. Must be actively worked on as someone's top priority right now. kind/bug Categorizes issue or PR as related to a bug. labels Jun 26, 2026

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉 thanks!

Great work.

@kubernetes-prow

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: illume, xonas1101

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubernetes-prow kubernetes-prow Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jun 26, 2026
@illume
illume merged commit e1c6676 into kubernetes-sigs:main Jun 26, 2026
12 of 13 checks passed
@illume illume added this to the v0.44.0 milestone Jul 27, 2026
@illume illume added blocker Completely prevents the user from using the software. frontend Issues related to the frontend testing labels Jul 27, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jul 29, 2026
…eadlamp (0.43.0 ➔ 0.44.0) (#1754)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/home-operations/charts-mirror/headlamp](https://headlamp.dev/) ([source](https://github.com/kubernetes-sigs/headlamp/tree/HEAD/charts/headlamp)) | minor | `0.43.0` → `0.44.0` |

---

### Release Notes

<details>
<summary>kubernetes-sigs/headlamp (ghcr.io/home-operations/charts-mirror/headlamp)</summary>

### [`v0.44.0`](https://github.com/kubernetes-sigs/headlamp/releases/tag/v0.44.0): 0.44.0

[Compare Source](https://github.com/kubernetes-sigs/headlamp/compare/v0.43.0...v0.44.0)

**Need for speed!** :racing\_car: :dash:  [Headlamp 0.44.0](https://github.com/kubernetes-sigs/headlamp/releases/tag/v0.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 [@&#8203;illume](https://github.com/illume). Also thanks to [@&#8203;itpick](https://github.com/itpick) for reporting the issue. [#&#8203;4991](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Aamod007](https://github.com/Aamod007). Also thanks to [@&#8203;lucas-jackson](https://github.com/lucas-jackson) for reporting the issue. [#&#8203;6021](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Psykii22](https://github.com/Psykii22). [#&#8203;6233](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;illume](https://github.com/illume). [#&#8203;6004](https://github.com/kubernetes-sigs/headlamp/issues/6004) |
| Fixed a memory leak where Backstage receiver event listeners accumulated on each remount of the Home component, improving stability during navigation.                                                                                                                |                                                                                    Thanks to [@&#8203;Rohith-Saran](https://github.com/Rohith-Saran). [#&#8203;5775](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;ayushmaan-16](https://github.com/ayushmaan-16). [#&#8203;5866](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Slambot01](https://github.com/Slambot01). [#&#8203;6294](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Slambot01](https://github.com/Slambot01). [#&#8203;6420](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;skools-here](https://github.com/skools-here). [#&#8203;6011](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;drewbailey](https://github.com/drewbailey). [#&#8203;5660](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;skoeva](https://github.com/skoeva). [#&#8203;6468](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;illume](https://github.com/illume). [#&#8203;5739](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;aryanraj45](https://github.com/aryanraj45). [#&#8203;6056](https://github.com/kubernetes-sigs/headlamp/issues/6056) |
| The ServiceAccount detail page now lists all RoleBindings and ClusterRoleBindings that reference the account, making it easy to audit granted permissions.             |   Thanks to [@&#8203;sudhidutta7694](https://github.com/sudhidutta7694). Also thanks to [@&#8203;jcpunk](https://github.com/jcpunk) for reporting the issue. [#&#8203;6040](https://github.com/kubernetes-sigs/headlamp/issues/6040) |
| Added a structured creation form for DaemonSets, letting users create DaemonSet resources through the UI form alongside the existing YAML editor.                      |                                                                                          Thanks to [@&#8203;vyncent-t](https://github.com/vyncent-t). [#&#8203;6514](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;vyncent-t](https://github.com/vyncent-t). [#&#8203;6422](https://github.com/kubernetes-sigs/headlamp/issues/6422) |
| Added a structured create form for Job resources with field validation, reusable metadata fields, and a new boolean/checkbox field type.                               |                                                                                          Thanks to [@&#8203;vyncent-t](https://github.com/vyncent-t). [#&#8203;6343](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Anjali-Chauhan1](https://github.com/Anjali-Chauhan1). Also thanks to [@&#8203;jcpunk](https://github.com/jcpunk) for reporting the issue. [#&#8203;6342](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;dabico](https://github.com/dabico). [#&#8203;6264](https://github.com/kubernetes-sigs/headlamp/issues/6264) |
| Node debugger settings now show the actual default Docker image and namespace as dynamic placeholders, matching backend configuration including custom overrides.      |                                                                                                Thanks to [@&#8203;dabico](https://github.com/dabico). [#&#8203;6253](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Priyanshu-rgbb](https://github.com/Priyanshu-rgbb). [#&#8203;6226](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;Psykii22](https://github.com/Psykii22). [#&#8203;5954](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;skoeva](https://github.com/skoeva). [#&#8203;6169](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;aryanraj45](https://github.com/aryanraj45). [#&#8203;6072](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;vyncent-t](https://github.com/vyncent-t). [#&#8203;5995](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;ibshafique](https://github.com/ibshafique). [#&#8203;5971](https://github.com/kubernetes-sigs/headlamp/issues/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 [@&#8203;beep-boopp](https://github.com/beep-boopp). [#&#8203;5875](https://github.com/kubernetes-sigs/headlamp/issues/5875) |
| Added a desktop setting to optionally hide the system tray icon, giving users who prefer no tray presence an easy opt-out.                                             | Thanks to [@&#8203;VlatkoMilisav](https://github.com/VlatkoMilisav). [#&#8203;5754](https://github.com/kubernetes-sigs/headlamp/issues/5754) |
| Added a tooltip disclaimer next to Events tables explaining Kubernetes Event retention lifetime, helping users understand why older events may disappear.              |               Thanks to [@&#8203;dabico](https://github.com/dabico). [#&#8203;5531](https://github.com/kubernetes-sigs/headlamp/issues/5531) |

##### 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.

<img width="1843" height="750" alt="Home page showing only recently-used clusters" src="https://github.com/user-attachments/assets/a52bd2e4-9117-445c-bc86-383036761f89" />

##### Added a color-coded usage progress bar to the ResourceQuota detail view, making it easy to spot quota pressure at a glance.

<img width="470" alt="ResourceQuota detail view with color-coded usage progress bar" src="https://github.com/user-attachments/assets/df047626-c152-4d1b-973a-a88abd0dd6d7" />

##### Added a structured `CreateCronJobForm` for CronJob resources, letting users configure schedule, time zone, concurrency policy, and job template fields through the UI.

<img width="2069" height="1154" alt="CronJob structured creation form" src="https://github.com/user-attachments/assets/0c17cc45-b468-4c92-b395-6ff07c307589" />

##### Added a tooltip disclaimer next to Events tables explaining Kubernetes Event retention lifetime, helping users understand why older events may disappear.

<img width="1488" height="600" alt="Events table with retention lifetime tooltip" src="https://github.com/user-attachments/assets/ffa79f80-7c31-4e85-9aab-7a561071279b" />

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

#### 🐞 Bug fixes (part 1 of 11)

|                                                                                                                                                                  |                                                                                                                                                                                                                 |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Headlamp desktop now only terminates its own user's headlamp-server processes, preventing one user on a shared machine from killing another user's backend.      | Thanks to [@&#8203;Aamod007](https://github.com/Aamod007). Also thanks to [@&#8203;lombardialess](https://github.com/lombardialess) for reporting the issue. [#&#8203;6522](https://github.com/kubernetes-sigs/headlamp/issues/6522) |
| Resolved known npm dependency vulnerabilities across all packages by applying npm audit fixes.                                                                   |                                                                                              Thanks to [@&#8203;yolossn](https://github.com/yolossn). [#&#8203;6671](https://github.com/kubernetes-sigs/headlamp/issues/6671) |
| Fixed the active tab highlight in NavigationTabs so tabs like Network Policies are correctly selected when hidden sidebar items are filtered out.                |                                                                                              Thanks to [@&#8203;Adii-45](https://github.com/Adii-45). [#&#8203;6251](https://github.com/kubernetes-sigs/headlamp/issues/6251) |
| Fixed port forwarding list appearing empty for dynamically added clusters by returning the correct cluster name instead of the internal user-suffixed cache key. |             Thanks to [@&#8203;Athang69](https://github.com/Athang69). Also thanks to [@&#8203;ondrab1](https://github.com/ondrab1) for reporting the issue. [#&#8203;6188](https://github.com/kubernetes-sigs/headlamp/issues/6188) |
| Fixed the Pods overview chart always showing 100% running by correctly reflecting pods in Error, CrashLoopBackOff, Pending, and other non-running states.        |                                                                                          Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6114](https://github.com/kubernetes-sigs/headlamp/issues/6114) |
| Stale Kubernetes API responses and authorization clientsets are now purged immediately when a kube context is removed, preventing stale data from being served.  |                                                                                Thanks to [@&#8203;Pragati5-DEBUG](https://github.com/Pragati5-DEBUG). [#&#8203;6113](https://github.com/kubernetes-sigs/headlamp/issues/6113) |
| StorageClass list no longer shows `undefined` in the Allow Volume Expansion column — the cell now displays Yes/No or remains empty when the field is absent.     |                                                                                                Thanks to [@&#8203;dabico](https://github.com/dabico). [#&#8203;6308](https://github.com/kubernetes-sigs/headlamp/issues/6308) |
| Added `service.appProtocol` support to the Headlamp Helm chart, fixing WebSocket and Gateway API compatibility issues with Kubernetes ingress routing.           |                                                                                            Thanks to [@&#8203;cgiraldo](https://github.com/cgiraldo). [#&#8203;6049](https://github.com/kubernetes-sigs/headlamp/issues/6049) |

##### StorageClass list no longer shows `undefined` in the Allow Volume Expansion column — the cell now displays Yes/No or remains empty when the field is absent.

<img width="2376" height="740" alt="StorageClass list with Yes/No in Allow Volume Expansion column" src="https://github.com/user-attachments/assets/f54c6c96-3f18-4bd7-aa6f-d5a2567652d7" />

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

#### 🐞 Bug fixes (part 2 of 11)

|                                                                                                                                                                                   |                                                                                                                                                                                                                                     |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| API discovery errors and fallbacks are now logged instead of silently swallowed, making it easier to diagnose why legacy discovery paths are being taken.                         | Thanks to [@&#8203;WasThatRudy](https://github.com/WasThatRudy). Also thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid) for reporting the issue. [#&#8203;6033](https://github.com/kubernetes-sigs/headlamp/issues/6033) |
| Helm chart env values schema now supports `valueFrom` (secretKeyRef, configMapKeyRef, fieldRef), enabling Kubernetes-native secret and config injection for Headlamp deployments. |                             Thanks to [@&#8203;Athang69](https://github.com/Athang69). Also thanks to [@&#8203;The-Judge](https://github.com/The-Judge) for reporting the issue. [#&#8203;6002](https://github.com/kubernetes-sigs/headlamp/issues/6002) |
| Fixed cache middleware crashing with 'invalid url format' on non-API cluster paths like `/healthz`, so proxied apiserver endpoints are handled correctly.                         |                                                                                                                    Thanks to [@&#8203;Nabsku](https://github.com/Nabsku). [#&#8203;5798](https://github.com/kubernetes-sigs/headlamp/issues/5798) |
| Improved hook memoization and lazy initialization in ResourceTable settings, resolving React hook warnings without changing table behavior.                                       |                                                                                                        Thanks to [@&#8203;kishore08-07](https://github.com/kishore08-07). [#&#8203;5790](https://github.com/kubernetes-sigs/headlamp/issues/5790) |
| Added full support for Kubernetes Gateway API v1.5.1, including BackendTLSPolicy, GRPCRoute, and ReferenceGrant graduating to the Standard channel.                               |                                                                                                            Thanks to [@&#8203;YotamKorah](https://github.com/YotamKorah). [#&#8203;5395](https://github.com/kubernetes-sigs/headlamp/issues/5395) |
| Fixed a race condition in kubeconfig `WriteToFile` that caused data corruption or missing files when concurrent calls occurred within the same second.                            |                                                                                                  Thanks to [@&#8203;KumarADITHYA123](https://github.com/KumarADITHYA123). [#&#8203;5309](https://github.com/kubernetes-sigs/headlamp/issues/5309) |
| Metrics unavailability (timeouts, CrashLoopBackOff, etc.) now correctly shows a 'metrics unavailable' state instead of silently displaying 0% CPU and memory usage.               |                                                                                                  Thanks to [@&#8203;Shreya2005-2005](https://github.com/Shreya2005-2005). [#&#8203;5238](https://github.com/kubernetes-sigs/headlamp/issues/5238) |
| Guarded against undefined `uid` and `name` in search filtering, preventing a crash when resources with incomplete metadata appear in the list.                                    |                                                                                        Thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid). [#&#8203;6680](https://github.com/kubernetes-sigs/headlamp/issues/6680) |
| Updated outdated frontend packages across app, headlamp-plugin, pluginctl, eslint-config, and i18n tooling to improve compatibility and security.                                 |                                                                                                                    Thanks to [@&#8203;illume](https://github.com/illume). [#&#8203;6679](https://github.com/kubernetes-sigs/headlamp/issues/6679) |
| Fixed a failing cluster snapshot test on the main branch introduced by a recent merge.                                                                                            |                                                                                                                    Thanks to [@&#8203;illume](https://github.com/illume). [#&#8203;6665](https://github.com/kubernetes-sigs/headlamp/issues/6665) |

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

#### 🐞 Bug fixes (part 3 of 11)

|                                                                                                                                                                                     |                                                                                                                                                                                                                     |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Images embedded as raw HTML in GitHub release notes now render correctly in the Release Notes dialog instead of being silently dropped.                                             |       Thanks to [@&#8203;Pragati5-DEBUG](https://github.com/Pragati5-DEBUG). Also thanks to [@&#8203;skoeva](https://github.com/skoeva) for reporting the issue. [#&#8203;6642](https://github.com/kubernetes-sigs/headlamp/issues/6642) |
| Fixed the desktop e2e suite so all tests pass reliably and no longer corrupt the developer's kubeconfig on each run.                                                                |                                                                                        Thanks to [@&#8203;unlikelyzero](https://github.com/unlikelyzero). [#&#8203;6641](https://github.com/kubernetes-sigs/headlamp/issues/6641) |
| Fixed the DataField editor collapsing to 5px at non-100% browser zoom levels by calculating container height in React instead of via imperative DOM mutations.                      | Thanks to [@&#8203;bhuvan-somisetty](https://github.com/bhuvan-somisetty). Also thanks to [@&#8203;hxl9654](https://github.com/hxl9654) for reporting the issue. [#&#8203;6619](https://github.com/kubernetes-sigs/headlamp/issues/6619) |
| Fixed a crash on the Secrets list page caused by corrupt localStorage JSON for the 'Hide Helm Secrets' toggle, replacing the unguarded parse with safe fallback handling.           |                                                                                                Thanks to [@&#8203;Aamod007](https://github.com/Aamod007). [#&#8203;6526](https://github.com/kubernetes-sigs/headlamp/issues/6526) |
| Fixed a white-screen-on-boot caused by corrupt `notifications` localStorage JSON being parsed before any error boundary mounted, so the app now loads normally instead of crashing. |                                                                                                Thanks to [@&#8203;Aamod007](https://github.com/Aamod007). [#&#8203;6524](https://github.com/kubernetes-sigs/headlamp/issues/6524) |
| Enforced minimum Vitest coverage thresholds for the frontend suite so CI automatically catches real regressions in statements, branches, functions, and lines.                      |                                                                                                    Thanks to [@&#8203;rootp1](https://github.com/rootp1). [#&#8203;6486](https://github.com/kubernetes-sigs/headlamp/issues/6486) |

##### Images embedded as raw HTML in GitHub release notes now render correctly in the Release Notes dialog instead of being silently dropped.

<img width="1700" alt="Release Notes dialog rendering HTML images from GitHub releases" src="https://github.com/user-attachments/assets/8e41e6e6-bdf5-4a3f-b17a-64f586309132" />

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

#### 🐞 Bug fixes (part 4 of 11)

|                                                                                                                                                                                  |                                                                                                                                  |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------: |
| Added a nil-error guard in the backend handleError helper to prevent a panic when a nil error is accidentally passed by any of its callers.                                      |           Thanks to [@&#8203;vtushar06](https://github.com/vtushar06). [#&#8203;6437](https://github.com/kubernetes-sigs/headlamp/issues/6437) |
| Fixed a regression where searching for a namespace name flooded results with every resource in that namespace; the 'Set namespace' shortcut now appears correctly and only once. | Thanks to [@&#8203;Priyanshu-rgbb](https://github.com/Priyanshu-rgbb). [#&#8203;6432](https://github.com/kubernetes-sigs/headlamp/issues/6432) |
| Fixed `MULTI_HOME_ENABLED` always evaluating to `true`, so setting `REACT_APP_MULTI_HOME_ENABLED=false` now correctly disables the Multi Home feature.                           |               Thanks to [@&#8203;ssz2605](https://github.com/ssz2605). [#&#8203;6424](https://github.com/kubernetes-sigs/headlamp/issues/6424) |
| Cluster rename via kubeconfig now returns an explicit error when the target context is missing, preventing silent failures that left state unchanged.                            |                 Thanks to [@&#8203;rootp1](https://github.com/rootp1). [#&#8203;6415](https://github.com/kubernetes-sigs/headlamp/issues/6415) |
| Fixed `metricTargetValue()` in HPA to correctly display `0%` for zero `averageUtilization` values and ensure all metric types are evaluated properly.                            |       Thanks to [@&#8203;skools-here](https://github.com/skools-here). [#&#8203;6412](https://github.com/kubernetes-sigs/headlamp/issues/6412) |
| Fixed typos in platform and contributing docs and updated Node.js/npm version prerequisites in plugin tutorials to match current `package.json` requirements.                    |         Thanks to [@&#8203;Harsh63870](https://github.com/Harsh63870). [#&#8203;6408](https://github.com/kubernetes-sigs/headlamp/issues/6408) |
| Reformatted the Desktop App dependency list in the architecture docs as a Markdown bullet list, improving readability.                                                           |     Thanks to [@&#8203;kunaldevsahu](https://github.com/kunaldevsahu). [#&#8203;6384](https://github.com/kubernetes-sigs/headlamp/issues/6384) |
| Fixed a typo in the CronJob list's `lastScheduleTime` accessor so the Last Schedule column can now be sorted and filtered correctly.                                             |       Thanks to [@&#8203;skools-here](https://github.com/skools-here). [#&#8203;6383](https://github.com/kubernetes-sigs/headlamp/issues/6383) |

##### Fixed a regression where searching for a namespace name flooded results with every resource in that namespace; the 'Set namespace' shortcut now appears correctly and only once.

<img width="1700" alt="Global search showing only the Set namespace shortcut for a bare namespace query" src="https://github.com/user-attachments/assets/2ddebadc-ab48-45e0-b2fe-6770a295fa02" />

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

#### 🐞 Bug fixes (part 5 of 11)

|                                                                                                                                                                        |                                                                                                                                          |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------: |
| Fixed a stale WebSocket subscription in `useKubeObject` when navigating between resources of the same kind, ensuring live updates reflect the correct resource.        |                       Thanks to [@&#8203;Adii-45](https://github.com/Adii-45). [#&#8203;6345](https://github.com/kubernetes-sigs/headlamp/issues/6345) |
| Fixed PortForward tooltip translation, added secure `rel` attributes to external links, and hardened localStorage parsing to prevent crashes or UI desync on failures. |       Thanks to [@&#8203;KumarADITHYA123](https://github.com/KumarADITHYA123). [#&#8203;6341](https://github.com/kubernetes-sigs/headlamp/issues/6341) |
| Wrapped `recentClusters` localStorage reads in try/catch to prevent app startup crashes when stored data is corrupted or unreadable.                                   | Thanks to [@&#8203;Kakumanu-Harshitha](https://github.com/Kakumanu-Harshitha). [#&#8203;6310](https://github.com/kubernetes-sigs/headlamp/issues/6310) |
| Guarded `useLocalStorageState` against corrupted data and `QuotaExceededError`, preventing blank-screen crashes across 13 components that rely on it.                  | Thanks to [@&#8203;Kakumanu-Harshitha](https://github.com/Kakumanu-Harshitha). [#&#8203;6307](https://github.com/kubernetes-sigs/headlamp/issues/6307) |
| Fixed frontend test failures on Node.js 24 caused by an AbortSignal incompatibility between jsdom, nock, and the native Request implementation.                        |             Thanks to [@&#8203;vanshika2720](https://github.com/vanshika2720). [#&#8203;6299](https://github.com/kubernetes-sigs/headlamp/issues/6299) |
| Hardened `loadTableSettings` and `storeTableSettings` against corrupt localStorage data, preventing blank-screen crashes on all resource list views.                   | Thanks to [@&#8203;Kakumanu-Harshitha](https://github.com/Kakumanu-Harshitha). [#&#8203;6298](https://github.com/kubernetes-sigs/headlamp/issues/6298) |
| Fixed duplicate HTML `id` attribute in `TimezoneSelect` Autocomplete to prevent conflicts when both `TimezoneSelect` and `Chooser` are rendered on the same page.      |         Thanks to [@&#8203;Priyanshu-rgbb](https://github.com/Priyanshu-rgbb). [#&#8203;6281](https://github.com/kubernetes-sigs/headlamp/issues/6281) |

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

#### 🐞 Bug fixes (part 6 of 11)

|                                                                                                                                                                  |                                                                                                                                                                                                                                 |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Fixed `parseCpu()` to use `parseFloat` so decimal CPU values like `0.5` or `1.5` cores are parsed correctly instead of being silently truncated.                 |                                                                                                          Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6259](https://github.com/kubernetes-sigs/headlamp/issues/6259) |
| Fixed 'Phase: undefined' display in the Project Resources tab by falling back to 'Unknown' when a pod's phase is not yet reported.                               |                                                                                    Thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid). [#&#8203;6257](https://github.com/kubernetes-sigs/headlamp/issues/6257) |
| Fixed Job detail page incorrectly showing `Duration: 0s` for still-running jobs; the duration row is now hidden until the job completes.                         |                                                                                                          Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6237](https://github.com/kubernetes-sigs/headlamp/issues/6237) |
| Fixed a nil pointer dereference panic in `OidcConfig()` when `AuthInfo` is nil, preventing crashes during token-based or unresolved-user authentication.         |                                                                                              Thanks to [@&#8203;Anjali-Chauhan1](https://github.com/Anjali-Chauhan1). [#&#8203;6235](https://github.com/kubernetes-sigs/headlamp/issues/6235) |
| Replaced bare `fmt.Println` calls in backend startup with structured logging so startup messages are now captured consistently by the logger.                    |                                                                                                          Thanks to [@&#8203;Rucha0901](https://github.com/Rucha0901). [#&#8203;6224](https://github.com/kubernetes-sigs/headlamp/issues/6224) |
| Fixed the YAML/JSON editor scrolling back to the top on validation errors, so users editing large manifests no longer lose their position while typing.          | Thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid). Also thanks to [@&#8203;prisha-sh](https://github.com/prisha-sh) for reporting the issue. [#&#8203;6209](https://github.com/kubernetes-sigs/headlamp/issues/6209) |
| Cluster connection warning bar is now dismissible, shows the real failure reason with an actionable link, and no longer overlaps window controls.                |                       Thanks to [@&#8203;Anjali-Chauhan1](https://github.com/Anjali-Chauhan1). Also thanks to [@&#8203;rnc](https://github.com/rnc) for reporting the issue. [#&#8203;6206](https://github.com/kubernetes-sigs/headlamp/issues/6206) |
| Fixed a crash in Chrome when the system timezone resolves to an unrecognized identifier like `Etc/Unknown`, preventing a `RangeError` on affected Linux systems. |         Thanks to [@&#8203;bhuvan-somisetty](https://github.com/bhuvan-somisetty). Also thanks to [@&#8203;adriansev](https://github.com/adriansev) for reporting the issue. [#&#8203;6204](https://github.com/kubernetes-sigs/headlamp/issues/6204) |
| Fixed a React hooks violation in `CreateNamespaceButton` by deriving validation state during render instead of via `useEffect`, eliminating the stale-state bug. |                                                                            Thanks to [@&#8203;Shahazadi-Shaguftha-Syed](https://github.com/Shahazadi-Shaguftha-Syed). [#&#8203;6192](https://github.com/kubernetes-sigs/headlamp/issues/6192) |
| Fixed Jobs, CronJobs, and JobSet overview charts that were always stuck at 100% healthy by adding correct status logic for workloads without replica fields.     |                                                                                                          Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6185](https://github.com/kubernetes-sigs/headlamp/issues/6185) |

##### Cluster connection warning bar is now dismissible, shows the real failure reason with an actionable link, and no longer overlaps window controls.

<img width="1700" alt="Dismissible cluster connection warning bar with failure reason and settings link" src="https://github.com/user-attachments/assets/5bceb4b3-e1ae-446c-8856-95a7a8210254" />

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

#### 🐞 Bug fixes (part 7 of 11)

|                                                                                                                                                                |                                                                                                                                                                                                                       |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Fixed OIDC login 404s in local dev by correcting the proxy path from `/auth` to `/auth/`, and enforced LF line endings for TS/JS/JSON files.                   |                                                                                            Thanks to [@&#8203;kjosh-bcvmw](https://github.com/kjosh-bcvmw). [#&#8203;6184](https://github.com/kubernetes-sigs/headlamp/issues/6184) |
| Fixed a crash when loading kubeconfigs containing non-Latin1 characters (e.g. Chinese cluster names) by replacing `btoa()` with UTF-8-safe base64 helpers.     | Thanks to [@&#8203;Anjali-Chauhan1](https://github.com/Anjali-Chauhan1). Also thanks to [@&#8203;youngledo](https://github.com/youngledo) for reporting the issue. [#&#8203;6178](https://github.com/kubernetes-sigs/headlamp/issues/6178) |
| Fixed the Activity tab title for workload logs so it is now properly localized instead of always showing a hardcoded English 'Logs: ' prefix.                  |                                                                                                    Thanks to [@&#8203;Adii-45](https://github.com/Adii-45). [#&#8203;6171](https://github.com/kubernetes-sigs/headlamp/issues/6171) |
| Container status tooltips in the Pods list are now translated and respect the user's configured timezone instead of always showing English text and UTC times. |                                                                          Thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid). [#&#8203;6168](https://github.com/kubernetes-sigs/headlamp/issues/6168) |
| Fixed a translation key case mismatch in LogsButton so the correct localized string is now displayed.                                                          |                                                                                            Thanks to [@&#8203;srajang1805](https://github.com/srajang1805). [#&#8203;6163](https://github.com/kubernetes-sigs/headlamp/issues/6163) |
| Fixed broken frontend snapshot tests on main caused by a merge conflict with outdated snapshots.                                                               |                                                                                                      Thanks to [@&#8203;illume](https://github.com/illume). [#&#8203;6160](https://github.com/kubernetes-sigs/headlamp/issues/6160) |
| Fixed a variable name typo (`namepsace` → `namespace`) and removed dead commented-out code in NodeShellAction with no functional changes.                      |                                                                                            Thanks to [@&#8203;srajang1805](https://github.com/srajang1805). [#&#8203;6159](https://github.com/kubernetes-sigs/headlamp/issues/6159) |
| Added optional chaining to KubeObject subclasses so the UI gracefully handles incomplete Kubernetes object data instead of throwing TypeErrors.                |                                                                                                  Thanks to [@&#8203;Psykii22](https://github.com/Psykii22). [#&#8203;6145](https://github.com/kubernetes-sigs/headlamp/issues/6145) |
| Fixed a typo in the node drain status error message ('repsone' → 'response') for clearer error reporting.                                                      |                                                                                                Thanks to [@&#8203;Rucha0901](https://github.com/Rucha0901). [#&#8203;6141](https://github.com/kubernetes-sigs/headlamp/issues/6141) |

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

#### 🐞 Bug fixes (part 8 of 11)

|                                                                                                                                                     |                                                                                                                                                                                                               |
| :-------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Isolated TestDynamicClustersKubeConfig to a temp directory so test runs no longer pollute the user's real Headlamp config.                          |               Thanks to [@&#8203;Athang69](https://github.com/Athang69). Also thanks to [@&#8203;sniok](https://github.com/sniok) for reporting the issue. [#&#8203;6136](https://github.com/kubernetes-sigs/headlamp/issues/6136) |
| Fixed a spelling mistake ('listernerApi' → 'listenerApi') in headlampEventSlice for cleaner, more readable code.                                    |                                                                                  Thanks to [@&#8203;rutujdhawale](https://github.com/rutujdhawale). [#&#8203;6131](https://github.com/kubernetes-sigs/headlamp/issues/6131) |
| Fixed a cache-key collision in k8cache by percent-encoding literal '+' characters so the '+' delimiter is no longer ambiguous with field content.   |                                                                                        Thanks to [@&#8203;sid200727](https://github.com/sid200727). [#&#8203;6127](https://github.com/kubernetes-sigs/headlamp/issues/6127) |
| Fixed a Storybook startup failure caused by a circular dependency on Node story helpers, allowing all stories to load correctly.                    |                                                                                  Thanks to [@&#8203;mahesh-09-12](https://github.com/mahesh-09-12). [#&#8203;6126](https://github.com/kubernetes-sigs/headlamp/issues/6126) |
| Replaced loose `any` typing on DocsViewer's `docSpecs` prop with a strict type, improving type safety and editor autocompletion.                    |                                                                                    Thanks to [@&#8203;r0hansaxena](https://github.com/r0hansaxena). [#&#8203;6098](https://github.com/kubernetes-sigs/headlamp/issues/6098) |
| Fixed the CRD Details Versions table incorrectly showing the storage value in the Served column instead of the served value.                        |                                                                                  Thanks to [@&#8203;mahesh-09-12](https://github.com/mahesh-09-12). [#&#8203;6095](https://github.com/kubernetes-sigs/headlamp/issues/6095) |
| Fixed a rules-of-hooks violation in AuthVisible that could cause unexpected behavior by ensuring all hooks run before any early returns.            | Thanks to [@&#8203;therealharshit](https://github.com/therealharshit). Also thanks to [@&#8203;illume](https://github.com/illume) for reporting the issue. [#&#8203;6092](https://github.com/kubernetes-sigs/headlamp/issues/6092) |
| Centralized the hardcoded backend base URL into a single `API_BASE` constant across Storybook stories, making future URL changes a one-line update. |                                                                                        Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6088](https://github.com/kubernetes-sigs/headlamp/issues/6088) |
| Wrapped hardcoded English strings on the Custom Resource Instances page with i18n so they are now correctly translated with the rest of the UI.     |                                                                  Thanks to [@&#8203;krsatyamthakur-droid](https://github.com/krsatyamthakur-droid). [#&#8203;6087](https://github.com/kubernetes-sigs/headlamp/issues/6087) |

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

#### 🐞 Bug fixes (part 9 of 11)

|                                                                                                                                                                                                                |                                                                                                                                                                                                                                   |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Fixed a react-hooks/exhaustive-deps lint suppression in ViewButton by using a ref for the initial toggle value, making the effect correctly dependency-safe.                                                   |                                                                                                            Thanks to [@&#8203;JoSParker](https://github.com/JoSParker). [#&#8203;6086](https://github.com/kubernetes-sigs/headlamp/issues/6086) |
| Fixed Rules of Hooks violations in RestartButton by moving all hook calls before the early-return guard, preventing potential runtime errors.                                                                  |                                 Thanks to [@&#8203;nabrahma](https://github.com/nabrahma). Also thanks to [@&#8203;illume](https://github.com/illume) for reporting the issue. [#&#8203;6066](https://github.com/kubernetes-sigs/headlamp/issues/6066) |
| Fixed security vulnerabilities by updating npm dependencies via audit fix.                                                                                                                                     |                                                                                                                  Thanks to [@&#8203;skoeva](https://github.com/skoeva). [#&#8203;6055](https://github.com/kubernetes-sigs/headlamp/issues/6055) |
| Replaced `Math.random()` with React 18's `useId()` in the `useId` utility, fixing a `react-hooks/purity` lint violation during render.                                                                         |                                                                              Thanks to [@&#8203;Shahazadi-Shaguftha-Syed](https://github.com/Shahazadi-Shaguftha-Syed). [#&#8203;6041](https://github.com/kubernetes-sigs/headlamp/issues/6041) |
| Added a regression test for undefined i18n locale handling in ThemeProviderNexti18n, preventing reintroduction of the Firefox crash fixed in [#&#8203;5802](https://github.com/kubernetes-sigs/headlamp/issues/5802). |                                                                                                      Thanks to [@&#8203;mahesh-09-12](https://github.com/mahesh-09-12). [#&#8203;6026](https://github.com/kubernetes-sigs/headlamp/issues/6026) |
| Fixed stale YAML data in the resource editor by fetching the latest object from the API before opening, ensuring edits always reflect the current state.                                                       |                                                                                                      Thanks to [@&#8203;ayushmaan-16](https://github.com/ayushmaan-16). [#&#8203;6014](https://github.com/kubernetes-sigs/headlamp/issues/6014) |
| Added regression tests for the LimitRangeDetails component to verify Container Limits and other DetailsGrid configuration are correctly exposed.                                                               |                                                                                                      Thanks to [@&#8203;mahesh-09-12](https://github.com/mahesh-09-12). [#&#8203;6013](https://github.com/kubernetes-sigs/headlamp/issues/6013) |
| Fixed getPercentStr() so whole-number percentages no longer display a spurious trailing .0, keeping metric displays clean and readable.                                                                        |                                                                                                            Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;6000](https://github.com/kubernetes-sigs/headlamp/issues/6000) |
| Fixed a crash on the Gateways page when a Gateway resource has no `spec.listeners`, preventing a blank view for users with incomplete Gateway objects.                                                         | Thanks to [@&#8203;Anjali-Chauhan1](https://github.com/Anjali-Chauhan1). Also thanks to [@&#8203;jianchao990-bit](https://github.com/jianchao990-bit) for reporting the issue. [#&#8203;5996](https://github.com/kubernetes-sigs/headlamp/issues/5996) |
| Log viewer preferences for auto-scroll (follow) and show-timestamps are now saved to localStorage so they persist across browser sessions.                                                                     |                           Thanks to [@&#8203;Athang69](https://github.com/Athang69). Also thanks to [@&#8203;prisha-sh](https://github.com/prisha-sh) for reporting the issue. [#&#8203;5993](https://github.com/kubernetes-sigs/headlamp/issues/5993) |

##### Fixed a crash on the Gateways page when a Gateway resource has no `spec.listeners`, preventing a blank view for users with incomplete Gateway objects.

<img width="1700" alt="Gateway list view rendering correctly with incomplete spec" src="https://github.com/user-attachments/assets/8e560359-483e-4649-a6e9-f25b54924bfb" />

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

#### 🐞 Bug fixes (part 10 of 11)

|                                                                                                                                                                                |                                                                                                                                                                                                                       |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Port-forward requests using an already-active ID now return HTTP 409 Conflict instead of silently overwriting the session, preventing port and goroutine leaks.                |                                                                                                      Thanks to [@&#8203;Nyx128](https://github.com/Nyx128). [#&#8203;5990](https://github.com/kubernetes-sigs/headlamp/issues/5990) |
| Added regression tests for the `IngressDetails` component covering metadata, TLS configuration, and rules rendering to guard against future regressions.                       |                                                                                          Thanks to [@&#8203;mahesh-09-12](https://github.com/mahesh-09-12). [#&#8203;5966](https://github.com/kubernetes-sigs/headlamp/issues/5966) |
| Fixed row selections disappearing after polling refreshes in resource tables when any row lacks a metadata.uid, keeping selections stable across data refreshes.               |         Thanks to [@&#8203;WasThatRudy](https://github.com/WasThatRudy). Also thanks to [@&#8203;prisha-sh](https://github.com/prisha-sh) for reporting the issue. [#&#8203;5952](https://github.com/kubernetes-sigs/headlamp/issues/5952) |
| Fixed open-redirect bypass in `isValidRedirectPath` by stripping whitespace and decoding URL-encoded sequences before protocol checks, preventing malicious redirect exploits. |                                                                                                  Thanks to [@&#8203;Athang69](https://github.com/Athang69). [#&#8203;5920](https://github.com/kubernetes-sigs/headlamp/issues/5920) |
| Fixed malformed i18n interpolation syntax in CreateNamespaceButton, eliminating duplicate translation keys during extraction.                                                  |                                                                                                Thanks to [@&#8203;xonas1101](https://github.com/xonas1101). [#&#8203;5919](https://github.com/kubernetes-sigs/headlamp/issues/5919) |
| Fixed Restart button visibility using `patch` permission instead of `update`, so users see and can use the button only when they have the correct access.                      | Thanks to [@&#8203;mishradwaterlaw](https://github.com/mishradwaterlaw). Also thanks to [@&#8203;wiswesser](https://github.com/wiswesser) for reporting the issue. [#&#8203;5908](https://github.com/kubernetes-sigs/headlamp/issues/5908) |
| Replaced deprecated `addListener`/`removeListener` calls in the color-scheme hook with the standard `addEventListener` API, removing browser deprecation warnings.             |                                                                                      Thanks to [@&#8203;YadavAkhileshh](https://github.com/YadavAkhileshh). [#&#8203;5785](https://github.com/kubernetes-sigs/headlamp/issues/5785) |

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

#### 🐞 Bug fixes (part 11 of 11)

|                                                                                                                                                                                            |                                                                                                                                    |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------: |
| Removed an unused `themeName` dependency from the MUI theme hook, eliminating a spurious eslint warning and avoiding unnecessary theme recomputation.                                      |       Thanks to [@&#8203;kishore08-07](https://github.com/kishore08-07). [#&#8203;5768](https://github.com/kubernetes-sigs/headlamp/issues/5768) |
| Fixed incorrect `useMemo` and `useEffect` dependencies in `NumRowsInput` so rows-per-page settings are computed and applied correctly when options change.                                 |       Thanks to [@&#8203;kishore08-07](https://github.com/kishore08-07). [#&#8203;5767](https://github.com/kubernetes-sigs/headlamp/issues/5767) |
| Fixed a cache authorization bug where named Kubernetes resource requests used the object name instead of the resource type in access reviews, preventing incorrect authorization failures. |       Thanks to [@&#8203;harrshita123](https://github.co…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. blocker Completely prevents the user from using the software. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. frontend Issues related to the frontend kind/bug Categorizes issue or PR as related to a bug. priority/critical-urgent Highest priority. Must be actively worked on as someone's top priority right now. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. testing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

frontend: Workloads overview "Pods" chart always shows 100% and never reflects failing pods

5 participants