# Changelog

> Every tagged release, newest first, as published on GitHub. Homebrew, the AUR package and the .deb follow each tag automatically.

## v0.88.1

14 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.88.1)

#### Fixes

- Argo CD, cert-manager, Karpenter NodePool and NodeClaim, KEDA and Flux read their resources at the API version the cluster serves. On installs that store an older version, such as Karpenter before 1.0 or Flux before 2.3, these lists came up empty without an error.
- The Ready column reads the same in Flux, cert-manager, Karpenter and Kyverno views: Ready, Not ready, Unknown, or Suspended for a suspended Flux object.
- A custom resource opened from the generic CRD list shows its integration's Overview tab, as it does when opened from the integration's own view.

#### Maintenance

- Integrations share one internal contract: served-version reads, condition handling, write helpers that refuse read-only contexts, and a catalog the sidebar and views derive from. Every integration resource runs a conformance test against a fixture, and AGENTS.md lists the steps for adding an integration.

#### What's Changed
* refactor(integrations): share one contract across ecosystem integrations by @SametKUM in https://github.com/SametKUM/klustr/pull/149


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.88.0...v0.88.1


## v0.88.0

14 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.88.0)

#### Features

- Show the pod count next to the node and namespace counts in the Cluster Overview header. It counts every pod object, so it can read higher than the Pods card, which leaves out Succeeded and Failed pods.
- Select and copy event messages in a resource's Events tab, the Events view and the overview feeds, and copy any message with its hover copy button. The rest of the detail tabs is selectable too, and a drag that selects text in a clickable row no longer opens it.
- Refresh a resource's Events tab every 15 seconds while it is open, keeping the list on screen instead of flashing a loading state.
- Pick how far back a pod log stream starts with the Tail picker: the last 200, 1,000 or 10,000 lines, or the whole log.

#### Maintenance

- Update `golang.org/x/sys` and `sigs.k8s.io/gateway-api`, 12 frontend packages, and the macOS code-signing action.

#### What's Changed
* feat(overview): show the pod count in the cluster header by @SametKUM in https://github.com/SametKUM/klustr/pull/145
* feat(events): refresh the detail events tab automatically by @SametKUM in https://github.com/SametKUM/klustr/pull/146
* feat(logs): pick how many lines a pod log stream starts from by @SametKUM in https://github.com/SametKUM/klustr/pull/147
* chore(deps): bump the go-minor-patch group with 2 updates by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/142
* chore(deps): bump Apple-actions/import-codesign-certs from 7.0.0 to 7.1.0 by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/143
* chore(deps): bump the npm-minor-patch group across 1 directory with 12 updates by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/144
* feat(events): make event messages and detail text copyable by @SametKUM in https://github.com/SametKUM/klustr/pull/148


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.87.0...v0.88.0


## v0.87.0

13 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.87.0)

#### Features

- Add dedicated views for 14 Cilium CRD kinds: network and clusterwide network policies, endpoints, nodes, security identities, CIDR groups, LoadBalancer IP pools, L2 announcement policies, egress gateway policies, and BGP cluster, peer, advertisement, node and override configurations.
- Read allow/deny policy rules, endpoint selectors, CIDR exceptions, ports, DNS and L7 matches in structured detail tables. Follow explicit references to related resources in the same cluster context.
- Inspect endpoint state and security identities, node IP allocation, IP pool counts, and BGP peer and route status reported in CRDs.
- Discover served CRD versions per context and update lists through existing informers. Show Cilium navigation only for installed resource kinds, with the official Cilium logo.

#### Maintenance

- Keep generated release notes focused on changes by removing repeated installation instructions.

#### What's Changed

- feat(cilium): add CRD resource views in https://github.com/SametKUM/klustr/pull/141
- ci(release): keep release notes focused on changes in https://github.com/SametKUM/klustr/pull/138

**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.86.0...v0.87.0


## v0.86.0

11 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.86.0)

#### What's new

- **Karpenter EC2NodeClass:** inspect readiness, AMIs and their requirements, subnets, security groups, and IAM configuration. Navigate directly from NodePools and NodeClaims to their node class.
- **Flux image automation:** browse ImageRepositories, ImagePolicies, and ImageUpdateAutomations, including scan results, selected tags and digests, source references, and update status.
- **Flux actions and navigation:** reconcile and suspend/resume supported resources, follow cross-namespace references, and retain the selected cluster context. ImagePolicy reconciliation targets its ImageRepository; suspension is available for the supported v1 API.

#### What's Changed
* feat(ecosystem): add karpenter node classes and flux image views by @SametKUM in https://github.com/SametKUM/klustr/pull/137


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.85.1...v0.86.0

## v0.85.1

9 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.85.1)

Klustr fixes the pod limit shown in the CPU/MEM column and picks up dependency security fixes.

#### Fixes

- **Pod limits.** A pod where one container sets a CPU or memory limit and another does not no longer shows the first container's limit as the pod's. The kubelet leaves the pod unbounded as soon as any container, init containers included, omits a limit, so the CPU/MEM tooltip now shows `—` for that limit. The cluster overview's limit total drops those partial limits too (#136).

#### Security

- **Go toolchain 1.26.9.** Picks up the `net/http`, `crypto/tls` and `mime/multipart` fixes (GO-2026-6603 through GO-2026-6617) (#136).
- **golang.org/x/net v0.60.0** for the matching x/net advisories (#136).
- **source-map-js 1.2.2** for GHSA-68fv-2mgg-jv7q, a build-time dependency (#136).

#### What's Changed
* fix(pods): treat a pod limit as unset when any container omits it by @SametKUM in https://github.com/SametKUM/klustr/pull/136


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.85.0...v0.85.1



## v0.85.0

4 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.85.0)

Klustr adds Joker to the theme picker.

#### Joker theme

- **Two variants.** Joker Classic is the dark variant, with purple-black surfaces; Joker Matinee is the light variant, on warm paper. Pick Joker under Color theme, and the Light and Dark toggle switches between the two (#134).
- **Colors.** Primary buttons and links are Moss, the theme's faded green, and focus rings are purple. Every text and surface pair is at least 4.5:1 in both variants (#134).
- **Terminal.** The terminal, log and exec views use Joker's ANSI colors, with a green cursor (#134).

#### What's Changed
* feat(theme): add the joker theme by @SametKUM in https://github.com/SametKUM/klustr/pull/134


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.84.0...v0.85.0



## v0.84.0

4 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.84.0)

Klustr adds two integrations: Tekton Pipelines and Kyverno. Each gets its own sidebar group, which appears only when an active context serves the tool's CRDs.

#### Tekton

- **PipelineRuns** show their status with the controller's reason, a task tally such as `11 done, 1 failed, 4 skipped`, and a live duration, newest first. The detail joins the resolved pipeline, the child TaskRuns and the skipped tasks into one task table, with finally tasks listed separately. A row opens its TaskRun (#129).
- **TaskRuns** list their steps with state, exit code and image. The **Logs** tab streams the pod with the running or failed step preselected. Tekton prunes the pods of finished runs; when the pod is gone, the tab says so (#129).
- **Pipelines and Tasks** show the declared tasks with their dependencies and links to the referenced Task, plus params, workspaces, results and step scripts. A Pipeline has a **Runs** tab (#129).
- **Cancel and Rerun.** Cancel stops an active PipelineRun or TaskRun with the same patch `tkn ... cancel` sends. Rerun copies a PipelineRun's spec into a new run named `<name>-r-xxxxx`, the way the Tekton Dashboard names it. Both ask for confirmation and are hidden in read-only mode (#129).
- **Large CI clusters stay usable.** Tekton copies the resolved spec into every run's status. Klustr now drops those copies before caching, which cut the TaskRun cache on a cluster with 6,875 TaskRuns from about 194 MB to 85 MB. Opening a PipelineRun lists its TaskRuns by label, without watching every TaskRun in the cluster (#129).
- The task tally labels unfinished tasks **incomplete** rather than running, because Tekton's count includes tasks still waiting to start (#133).

#### Kyverno

- **ClusterPolicies and Policies** show the title, category and severity from the policy library annotations, the effective validate action per rule, admission and background flags, readiness, match and exclude summaries, autogen rules and generated ValidatingAdmissionPolicy status. Kyverno's `PolicyViolation` events appear on the Events tab (#130).
- **ValidatingPolicies and NamespacedValidatingPolicies,** the validating kinds of Kyverno's CEL policies, show actions, resource rules, selectors, match conditions, variables, validations and audit annotations (#130).
- **PolicyExceptions** show the exempted policies and rules, linked to the policy, and what the exception applies to (#130).
- **PolicyReports and ClusterPolicyReports** show the subject resource, a per-result tally, and results worst first with links to the policy that produced them (#130).
- **Violations tab** on every policy: the resources it fails or warns on, across all reports (#130).
- **Policy tab** on a resource's detail, with a count of failing results, when Kyverno keeps a report for that resource (#130).

The Kyverno views are read-only.

#### Other changes

- **CR views recover from a slow first load.** A custom resource list that takes more than a few seconds to sync used to stay on "Failed to start watch". It now retries and loads once the initial sync finishes. This applies to every CR view, not only Tekton (#129).
- The README and the screenshot pack cover Tekton and Kyverno (#131, #132).

#### What's Changed
* feat(tekton): add PipelineRun, TaskRun, Pipeline and Task views by @SametKUM in https://github.com/SametKUM/klustr/pull/129
* feat(kyverno): add policy, exception and policy report views by @SametKUM in https://github.com/SametKUM/klustr/pull/130
* docs(readme): add the Tekton and Kyverno integrations by @SametKUM in https://github.com/SametKUM/klustr/pull/131
* docs(screenshots): add Tekton and Kyverno, refresh the Helm and theme shots by @SametKUM in https://github.com/SametKUM/klustr/pull/132
* fix(tekton): label unfinished pipeline tasks incomplete, not running by @SametKUM in https://github.com/SametKUM/klustr/pull/133


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.83.0...v0.84.0



## v0.83.0

4 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.83.0)

Klustr's color themes now follow their official sources. The theme picker lists theme families under a Light/Dark toggle, and Tokyo Night Day is gone.

#### Themes

- **Every theme matches its source.** Surfaces, borders, hover states and accents used to be hand-mixed tones, several outside any official palette. Each theme now takes its colors from its own source (#128):
  - Dracula from [dracula/github](https://github.com/dracula/github)
  - Nord from nordtheme's VS Code theme
  - Monokai from VS Code's built-in Monokai
  - Tokyo Night from folke/tokyonight.nvim
  - One from the Atom One port for VS Code

  Where an upstream color would be invisible or unreadable, such as a focus ring identical to the border, a color from the same palette takes its place.
- **Light Dracula is now Alucard,** Dracula's official light theme: a warm cream background with a deep purple accent. It was previously our own design built from the dark palette.
- **Monokai keeps its green accent.** Every other Monokai color follows VS Code. VS Code's Monokai uses a grey for buttons; Klustr keeps Monokai's green for buttons, links and the focus ring.
- **Terminal palettes** follow each theme's source too:
  - Tokyo Night's bright colors are folke's current values.
  - Monokai and One use VS Code's and Zed's terminal colors.
  - Alucard uses the Dracula spec.
- **Hover is easier to see in light themes.** Menus, lists and the sidebar in the default Light theme now highlight the item under the pointer clearly, and so do One's menus.

#### Theme picker

- **One list, one toggle.** The picker lists theme families (Default, Dracula, Monokai, Nord, Tokyo Night, One) under a Light/Dark toggle. The toggle switches the current theme to its counterpart in the other mode; Tokyo Night, which is dark only, switches to the default theme.
- **Tokyo Night Day is removed.** If you had it selected, Klustr opens with the default Light theme.

#### What's Changed
* feat(theme): align the themes with their upstream colors and add a light/dark toggle by @SametKUM in https://github.com/SametKUM/klustr/pull/128


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.82.0...v0.83.0



## v0.82.0

3 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.82.0)

A bug-fix release: the Helm release list updates live again, terminal output and shell prompt icons render correctly, the YAML editor works offline, and the Argo CD Resources tab opens the right object.

#### Fixes

- **Helm releases update live again.** Installs, upgrades, rollbacks and uninstalls show up in the release list without a manual refresh, even when the Secrets view was never opened. The list now follows the release Secrets through a metadata-only watch, so release payloads, which carry chart values in plaintext, are never cached. A refresh reads only the releases that changed instead of every revision of every release. A context with no releases no longer shows a loading skeleton for 30 seconds (#127).
- **Shell prompt icons render correctly.** Nerd Font icons above U+FFFF (starship, powerlevel10k), recent emoji and flag tag characters arrived as a wrong glyph followed by a stray letter, such as `ID` in place of the Linux icon. This affected the local terminal, pod exec and pod logs on every platform. The cause is in how Wails encodes event payloads; Klustr now escapes these characters itself (#126).
- **No more `�` in terminal output.** A multi-byte character split across two output batches showed as replacement characters, most often in the box borders of TUIs like k9s and htop (#125).
- **The YAML editor works offline.** Monaco was fetched from a CDN at runtime, so the YAML, diff and Helm editors failed offline or behind a proxy that blocks it. It is now bundled with the app and runs the pinned 0.57 instead of 0.55.1 (#123).
- **The Argo CD Resources tab opens the right object.** A custom resource that reuses a built-in kind name, such as Knative's `Service` or Calico's `NetworkPolicy`, opened the built-in object of the same name. Rows now match on the API group too (#124).

#### Project

- Changes to `main` now go through pull requests with required checks, and the repository has contributing guidelines and community files (#121). CI skips the build jobs for documentation-only changes (#122).

#### What's Changed
* chore: route changes through pull requests and add community files by @SametKUM in https://github.com/SametKUM/klustr/pull/121
* ci: skip the build jobs when a change touches only docs by @SametKUM in https://github.com/SametKUM/klustr/pull/122
* fix(editor): bundle monaco instead of fetching it from a cdn by @SametKUM in https://github.com/SametKUM/klustr/pull/123
* fix(argocd): match the api group when opening a managed resource by @SametKUM in https://github.com/SametKUM/klustr/pull/124
* fix(terminal): keep multi-byte characters whole across output flushes by @SametKUM in https://github.com/SametKUM/klustr/pull/125
* fix(events): escape characters wails would corrupt in event payloads by @SametKUM in https://github.com/SametKUM/klustr/pull/126
* fix(helm): update the release list live from a metadata-only watch by @SametKUM in https://github.com/SametKUM/klustr/pull/127


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.81.0...v0.82.0



## v0.81.0

2 October 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.81.0)

#### What's Changed
* feat: windows terminal support by @ChrisMcKee in https://github.com/SametKUM/klustr/pull/113
* build(release): ship an unsigned windows zip by @SametKUM in https://github.com/SametKUM/klustr/pull/120

#### New Contributors
* @ChrisMcKee made their first contribution in https://github.com/SametKUM/klustr/pull/113

**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.80.1...v0.81.0



## v0.80.1

30 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.80.1)

Klustr is now licensed under the **Apache License 2.0**. There are no functional changes on top of v0.80.0; the rest of this release is dependency updates.

#### License: MIT → Apache-2.0

- Apache-2.0 is permissive like MIT: using, modifying and redistributing Klustr works exactly as before. It adds an explicit patent grant and spells out that contributions arrive under the same license.
- Everyone with merged code agreed to the change in #114. Thanks @metalgrid and @rguleryuz.
- The screenshots, demo video and other documentation under `docs/` are now licensed under CC BY 4.0.
- Every package now carries the license. The macOS and Linux tarballs include `LICENSE` and `NOTICE` beside the app, the .deb installs them under `/usr/share/doc/klustr/`, and the AUR package installs the `NOTICE` under `/usr/share/licenses/klustr-bin/`. The .deb and AUR metadata report `Apache-2.0`.

#### Site and guides

- klustr.dev and the user guides moved to their own repository, [SametKUM/klustr.dev](https://github.com/SametKUM/klustr.dev), with their history. The site stays at the same address, and the README now links the guides at [klustr.dev/docs](https://klustr.dev/docs/). Fixes to the guides go to that repository.

#### Dependencies

- Kubernetes client libraries (`k8s.io/api`, `apimachinery`, `client-go`, `cli-runtime`, `metrics`, `streaming`) 0.37.0 → **0.37.1** (#115).
- Monaco Editor 0.56 → **0.57**, `@tanstack/react-query` 5.104, `lucide-react` 1.48, Vite 8.3.1, Vitest 5.0.2 and other minor bumps (#117).
- `dompurify` 3.4.16 (#118), `brace-expansion` 5.0.12 (#119) and ESLint 10.11 (#106).
- `@tailwindcss/vite` moved to `devDependencies`; it only runs at build time.

#### What's Changed
* chore(deps-dev): bump eslint from 10.10.0 to 10.11.0 in /frontend in the npm-minor-patch group by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/106
* chore(deps): bump dompurify from 3.4.13 to 3.4.16 in /frontend by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/118
* chore(deps-dev): bump brace-expansion from 5.0.9 to 5.0.12 in /frontend by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/119
* chore(deps): bump the npm-minor-patch group across 1 directory with 8 updates by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/117
* chore(deps): bump the go-minor-patch group across 1 directory with 6 updates by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/115


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.80.0...v0.80.1



## v0.80.0

23 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.80.0)

Two log view improvements, both from user requests: a line wrap toggle for pod and workload logs (#108), and a Previous toggle that no longer hides until a container has restarted (#107). This release also fixes the capacity overview layout, moves to Wails 2.16 and the Node 26 toolchain, and ships the rebuilt klustr.dev.

#### Logs: wrap toggle

- The pod and workload **Logs** toolbars have a new **Wrap** toggle. Wrapping stays on by default.
- With wrapping off, each log line stays on one row. Scroll sideways with Shift+wheel, a horizontal trackpad swipe or the scrollbar under the log.
- In the workload view (Deployment / StatefulSet / DaemonSet → Logs) the `pod/container |` prefix stays pinned on the left while you scroll, so you can always see which pod a line came from.
- Lines are cut to the visible columns the same way the terminal measures them. A colour that starts off-screen still applies, tabs are expanded, and wide (CJK) characters cut by an edge are padded, so columns stay aligned.
- The choice is remembered across sessions and shared by both log views.
- In unwrapped mode, copying a selection copies only the part of each line that is on screen. **Save** still writes the full lines.

#### Logs: Previous toggle stays visible

- The **Previous** toggle (`kubectl logs --previous`) used to appear only once the selected container had restarted, so on a healthy container the feature looked missing. It is now always in the toolbar. Until there is a previous instance it is disabled, with a tooltip explaining why.

#### Logs: other changes

Both log views now run on one shared implementation, which also changes a few things:

- **While paused**, changing the filter, toggling wrap or scrolling sideways updates the frozen view. Before, the pod view applied filter changes only on resume, and the workload view dumped the lines held back by the pause onto the screen. Resume now jumps to the bottom in both views.
- Stream headers and `stream closed` / `start failed` notices no longer disappear when you change the filter.
- A filter change repaints only what fits in the terminal's scrollback, not the whole retained buffer, so filtering a long session is faster.

#### Fixes

- **Overview**: the capacity cards now size to the overview pane rather than the window. With the sidebar expanded, legend values such as `60.5GiB` are no longer cut off at the card edge.

#### Build and dependencies

- Wails 2.15.0 → 2.16.0 (#104), with the local Wails CLI pinned to the same version.
- The Node toolchain moves to 26.
- Frontend minor and patch bumps (#105).

#### Site

- klustr.dev has been rebuilt as a multi-page site (#101). It now has docs pages generated from the repository guides, comparison pages, an FAQ, a changelog and an install page.

#### What's Changed
* feat(site): rebuild klustr.dev as a multi-page Astro site by @SametKUM in https://github.com/SametKUM/klustr/pull/101
* chore(deps): bump the npm-minor-patch group in /frontend with 8 updates by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/105
* chore(deps): bump github.com/wailsapp/wails/v2 from 2.15.0 to 2.16.0 in the go-minor-patch group by @dependabot[bot] in https://github.com/SametKUM/klustr/pull/104
* feat(logs): add a line wrap toggle and keep the previous toggle visible by @SametKUM in https://github.com/SametKUM/klustr/pull/109


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.79.0...v0.80.0



## v0.79.0

19 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.79.0)

Two features: exec and port-forward now run over WebSocket with a guarded SPDY fallback, and the Gateway API group grows five new resource views (TLSRoute, TCPRoute, UDPRoute, ListenerSet, BackendTLSPolicy). Also picks up the Dependabot merges since v0.78.2.

#### Streaming: WebSocket-first exec and port-forward

- **Exec** and **port-forward** now negotiate a WebSocket connection first, matching what current `kubectl` does. SPDY remains available as a fallback, but only when the upgrade request is rejected for a compatibility reason: an older apiserver or a proxy that refuses the upgrade, or a role that grants `create` on `pods/exec` / `pods/portforward` but not the `get` verb the WebSocket path is authorised with. Unauthorised (401) and cancelled requests never fall back.
- A command is **never retried after the connection has upgraded**. If a shell drops mid-session, open a new one explicitly; Klustr will not re-run what you typed.
- Stopping a forward or disconnecting its context now **closes connections that are still waiting on the server or a proxy**. Previously a stalled CONNECT or HTTP upgrade could outlive the forward and keep the local port bound. The upstream WebSocket transport ignores `rest.Config.Dial`, so Klustr wraps it with a context-aware dialer that can cancel these in-flight handshakes.
- `github.com/gorilla/websocket` becomes a direct dependency.
- Covered by new headless tests for protocol negotiation, terminal I/O, authorisation failures and session cleanup (`exec_test.go`, `streaming_transport_test.go`, `streaming_spdy_test.go`, `portforward_transport_test.go`).

#### Gateway API: routes, ListenerSets and BackendTLSPolicies

Five new entries in the **Gateway API** sidebar group. Each appears when its CRD is served in an active context and the user can list and watch that resource there; namespace-scoped access through the kubeconfig context's `namespace:` field is respected.

- **TLSRoutes / TCPRoutes / UDPRoutes** with parent references, backend ports and weights, and per-controller route conditions. TLSRoutes also show hostnames. L4 routes render backend sets per rule without HTTP match fields.
- **ListenerSets** with parent Gateway, listener protocols, TLS certificates, allowed route kinds, attached routes and listener conditions.
- **BackendTLSPolicies** with target resources, SNI hostname, certificate names, CA references or system trust, and per-ancestor controller conditions.
- **Served-version discovery.** Klustr prefers `v1` and also handles TLSRoute `v1alpha3`/`v1alpha2`, TCPRoute and UDPRoute `v1alpha2`, BackendTLSPolicy `v1alpha3` and ReferenceGrant `v1beta1`. ListenerSet requires `gateway.networking.k8s.io/v1`; the experimental `XListenerSet` stays in the generic CRD browser. YAML and delete operations use the version each context actually serves.
- **Multi-context aware.** Aggregated views query only the contexts that serve each resource, and links to parents and backends preserve the source context and namespace.
- **Resilience.** Transient discovery failures recover without a reconnect, and compatible Gateway access decisions are reused when credentials refresh instead of re-probing every kind.
- **Generation-aware conditions** are applied consistently across all Gateway resource views. Missing or stale status is shown as unknown while condition reasons and messages stay available for diagnosis.

#### Dependencies

- Frontend and landing-site minor/patch bumps (#99, #100).

#### What's Changed
* feat(streaming): prefer websockets for exec and port-forward
* feat(gateway): add route, listener set, and backend tls policy views
* chore(deps): bump frontend minor and patch dependencies by @dependabot in https://github.com/SametKUM/klustr/pull/99
* chore(deps): bump site minor and patch dependencies by @dependabot in https://github.com/SametKUM/klustr/pull/100


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.78.2...v0.79.0



## v0.78.2

13 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.78.2)

Dependency-only release. No functional changes on top of v0.78.1; every open Dependabot pull request was verified against current `main` and merged.

#### Backend (Go)

- `helm.sh/helm/v3` v3.21.4 → **v3.22.0**. Dependency-only upstream release that moves Helm's `k8s.io/*` group to v0.37.0, which also lifts our transitive `k8s.io/apiserver`, `apiextensions-apiserver`, `component-base` and `kubectl` from v0.36.2 to v0.37.0, so the module graph is on a single Kubernetes minor again.
- `sigs.k8s.io/gateway-api` v1.6.1 → **v1.6.2** (conformance-suite fixes only).
- Transitive: `golang.org/x/crypto` v0.55.0, `golang.org/x/text` v0.41.0, `go.yaml.in/yaml/v3` v3.0.5, `santhosh-tekuri/jsonschema/v6` v6.0.3.

#### Frontend

- **React / React DOM 19.2.8 → 19.3.0** with matching `@types/react*`.
- **Vite 8.2.2 → 8.3.0**, `@tanstack/react-virtual` 3.14.11, `lucide-react` 1.44.0.
- Tooling: **Vitest 4 → 5** (the suite runs unchanged, 31 files / 206 tests), ESLint 10.10, `typescript-eslint` 8.70, `eslint-plugin-react-refresh` 0.5.6, `globals` 17.12, `@types/node` 26.5.1.

#### Release tooling

- `softprops/action-gh-release` 3.0.2 → 3.0.3 (SHA-pinned); this is the first release published with it.
- Landing site: `lucide` 1.44.0, `simple-icons` 16.29.0, `swetrix` 4.6.1.

#### What's Changed
* chore(deps): bump softprops/action-gh-release from 3.0.2 to 3.0.3 by @dependabot in https://github.com/SametKUM/klustr/pull/95
* chore(deps): bump the npm-minor-patch group in /site with 3 updates by @dependabot in https://github.com/SametKUM/klustr/pull/93
* chore(deps): bump the go-minor-patch group across 1 directory with 2 updates by @dependabot in https://github.com/SametKUM/klustr/pull/97
* chore(deps-dev): bump vitest from 4.1.11 to 5.0.0 in /frontend by @dependabot in https://github.com/SametKUM/klustr/pull/96
* chore(deps): bump the npm-minor-patch group across 1 directory with 12 updates by @dependabot in https://github.com/SametKUM/klustr/pull/98


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.78.1...v0.78.2



## v0.78.1

13 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.78.1)

Maintenance release: multi-context Helm targeting, resilient resource tables, credential refresh after reconnect, and a port-forward lifecycle rewrite. No new features.

#### Helm always targets the release's own cluster

In aggregated mode, **Upgrade** from a release detail used to build its dry-run and apply against the *selected* context instead of the context the release lives in. The dialog now receives the release context explicitly, shows it as a read-only **Target context**, and disables dry-run / apply when no target is known.

**Install** from *Helm → Repositories* gained the same field. In single-context mode it is preselected; in aggregated mode it is a dropdown over the active contexts and you must pick one before the buttons enable. Changing the target clears any dry-run preview or error from the previous target.

#### Resource tables keep cached rows and say what went wrong

- A failed list call no longer wipes the table. Cached rows stay, a per-context error banner shows the message with a **Retry** button, and the row counter gets an `(incomplete)` suffix. Deltas for that context are ignored until a full reload succeeds, so a partial snapshot cannot be patched into an inconsistent state.
- Connection health from the status bar is now shared with the tables. After consecutive ping failures (not a single blip) the table shows an amber *Showing cached data* notice per offline or stale context, and `(possibly outdated)` in the counter, until the ping recovers.
- Empty states distinguish "could not load a complete list" from "no cached rows" from a genuinely empty result.

#### Credential helpers: refresh resumes after reconnect

- Disconnecting a context pauses its aws-vault refresh timer. Reconnecting while the captured credentials were still valid left the timer paused, so the next expiry was only noticed when a request failed. The timer is re-armed on reconnect.
- After a credential refresh the metrics client, cached metrics and its cooldown are invalidated for that context, so CPU / memory columns and the Overview keep updating with the renewed credentials instead of retrying with the old token.

#### Port-forward lifecycle

- Sessions are registered before the SPDY handshake, so disconnecting a context or quitting the app while a forward is still starting cancels the handshake instead of leaking a listener. A forward that becomes ready after its context was disconnected is rejected.
- The HTTP upgrade is context-aware: a stalled response read or a proxy handshake that never completes is torn down on cancel rather than hanging the goroutine. TLS client auth, bearer tokens and exec credential plugins are preserved through `rest.HTTPClientFor`, and bytes net/http buffered past the `101` response are handed to the SPDY stream.
- Migrated from the deprecated `k8s.io/apimachinery/pkg/util/httpstream` packages to `k8s.io/streaming`.

#### What's Changed
* fix(helm): target the release context for upgrades
* fix(credentials): resume automatic refresh after reconnect
* fix(resources): preserve cached lists and surface connection errors
* fix(metrics): invalidate cached clients after credential refresh
* fix(portforward): cancel pending sessions on disconnect
* fix(resources): align connection warnings with health status
* fix(helm): allow explicit install targets across contexts
* fix(portforward): close sockets during canceled upgrades
* test(credentials): verify renewal and refreshed metrics authentication
* refactor(portforward): migrate to k8s.io/streaming httpstream packages


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.78.0...v0.78.1

## v0.78.0

5 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.78.0)

#### Copy and paste in terminals on Linux and Windows

Exec, Node shell, the terminal drawer and the Logs viewers never had working copy and paste outside macOS. xterm.js turns Ctrl+C / Ctrl+V into the `^C` / `^V` control bytes and cancels the browser default, so the webview never fires a clipboard event; only macOS got it for free through the app's Edit menu. Reported in #90.

- `Ctrl+Shift+C` / `Ctrl+Insert` copy, `Ctrl+Shift+V` / `Shift+Insert` paste.
- A plain `Ctrl+C` copies while text is selected and is the shell's interrupt otherwise, the same rule Windows Terminal and VS Code use. `Ctrl+V` is never intercepted.
- Right-click any terminal for a Copy / Paste / Select all menu (copy only in the Logs viewers).
- Paste goes through xterm's own paste path, so bracketed paste and newline normalisation are preserved in bash, vim and fzf.
- macOS keyboard behaviour is unchanged: ⌘C / ⌘V work as before, and the right-click menu is new there too.
- The `?` cheatsheet and the [Terminal guide](https://github.com/SametKUM/klustr/blob/v0.78.0/docs/guide/terminal.md#copy-and-paste) list the bindings.

Verified on Linux (WebKitGTK), Windows 11 (thanks to @GilchristT for building and testing the branch) and macOS.

#### What's Changed
* fix(terminal): restore copy and paste on Linux and Windows by @SametKUM in https://github.com/SametKUM/klustr/pull/91


**Full Changelog**: https://github.com/SametKUM/klustr/compare/v0.77.4...v0.78.0

## v0.77.4

2 September 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.77.4)

A maintenance release. No user-facing behaviour changes; every commit in this
range is a dependency or toolchain update, several of them security fixes.

#### Security

- The Go toolchain pin moved to 1.26.6. `govulncheck` reached five standard-library advisories on 1.26.5: quadratic `resolvePath` in `net/url` (Helm repo index downloads, the metrics-server manifest fetch), post-handshake message flooding in `crypto/tls`, the missing `ReadHeaderTimeout` on the unencrypted HTTP/2 check in `net/http`, unbounded recursion in `encoding/asn1`, and the punycode label check in `golang.org/x/net/idna`. All five are fixed in 1.26.6, and the scan reports no reachable vulnerabilities after the bump.
- `github.com/labstack/echo/v4` to 4.15.3, closing an encoded-slash (`%2F`) bypass of route-level protection that could expose static files. Echo is only compiled into the `wails dev` server, which binds to localhost, so released binaries were never affected.
- `browserslist` to 4.28.8 in the frontend build toolchain — unbounded memory growth from uncached query results, and an uncaught crash / prototype write via untrusted custom stats. Build-time only; it is not part of the shipped bundle.

#### Maintenance

- `k8s.io/api`, `k8s.io/apimachinery`, `k8s.io/client-go` and `k8s.io/metrics` to v0.37.0, with `k8s.io/cli-runtime` aligned to the same release.
- Dropped the `kubectl` / `cli-runtime` replace directive. It existed because Helm v3.21 required a `kubectl` that still imported the long-removed `scheduling/v1alpha1` group, which Helm v3.21.4 no longer does. Beyond the stale rationale, the override hid both modules from automated dependency updates, which is why `cli-runtime` had fallen behind the rest of the `k8s.io/*` modules.
- Frontend dependency refresh: TanStack Query 5.102, lucide-react 1.35, ESLint 10.9.1, typescript-eslint 8.68, Vite React plugin 6.1.1.
- Landing site dependency refresh: lucide 1.35, swetrix 4.6.

## v0.77.3

24 August 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.77.3)

#### Fixes

- Resource tables could keep showing a stale row. A change arriving while the table's full list fetch was still in flight was applied to the store and then overwritten when that fetch landed with its older snapshot, and nothing was scheduled to reconcile the difference — so on quiet kinds (ConfigMaps, Secrets, Ingresses) the row could stay stale until the next unrelated change for that kind. The same window also let the initial load briefly render a table holding only the changed rows before the full list arrived.

#### Maintenance

- Removed a stray editing artifact left behind in four source comments.

## v0.77.2

24 August 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.77.2)

#### Fixes

- Helm releases stuck in `pending-install`, `pending-upgrade`, `pending-rollback` or `uninstalling` are listed again. The release list asked the Helm SDK for its default state mask of deployed-or-failed, and that mask is applied after each release is collapsed to its latest revision — so a release mid-install or mid-upgrade disappeared from the list entirely instead of showing its in-progress state. Regressed in v0.71.0, reported in #81. Releases left behind by `helm uninstall --keep-history` stay hidden.

#### Maintenance

- Updated frontend and site dependencies (npm minor/patch groups).

## v0.77.1

9 August 2026. [Assets and install steps on GitHub](https://github.com/SametKUM/klustr/releases/tag/v0.77.1)

#### Features

- Release artifacts now include a `SHA256SUMS` file and GitHub build-provenance attestations for the macOS archive, Linux archive, and Debian package.

#### Fixes

- Updated vulnerable frontend dependencies: PostCSS 8.5.26, nanoid 3.3.18, DOMPurify 3.4.13, and brace-expansion 5.0.9. The golangci-lint action is now pinned to an immutable commit.
- Corrected Debian prerelease filenames so their version ordering matches the package control metadata.
- Made release generation idempotent, kept AppleDouble files out of macOS archives, and made Homebrew checksum updates fail when the expected cask fields are missing.
- Fixed release inputs and packaging variables so manually selected refs are built correctly and version strings cannot become shell source.
- Fixed Linux package verification so `dpkg-deb` output is fully consumed under `pipefail`.
- Removed persisted and URL-embedded GitHub credentials from release jobs, and scoped write permissions to the publishing jobs that require them.

#### Maintenance

- Release builds now run the shared CI checks before signing or publishing, including frontend bundling, Go race tests, CodeQL workflow analysis, and Go vulnerability reporting.
- Release jobs verify the architecture, notarization, archive contents, Debian metadata, and installed binary path of the artifacts they ship.
- CI now uses a shared Linux dependency bootstrap, derives Go and Wails versions from committed module configuration, pins the macOS runner image, and bounds every job with a timeout.
- Signing and publishing jobs now use the release environment; release artifacts use a seven-day workflow retention period.
- Updated the CI and release workflow documentation.

Older releases are on [GitHub](https://github.com/SametKUM/klustr/releases).
