Documentation menu

releases

Changelog

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

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

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

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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.87.0...v0.88.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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.86.0...v0.87.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

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

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

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

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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.84.0...v0.85.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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.83.0...v0.84.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
    • 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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.82.0...v0.83.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

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

What's Changed

New Contributors

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

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, with their history. The site stays at the same address, and the README now links the guides at 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

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

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

Full Changelog: https://github.com/SametKUM/klustr/compare/v0.79.0...v0.80.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

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

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

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

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

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 list the bindings.

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

What's Changed

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

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.

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.

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

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.