Changelog
What shipped, and when.
Every line links to the commit that made the change.
Bug Fixes
- e2e: keep non-ascii out of harness command errors 10ea45d
- e2e: map the namespaces setting and keep its parser out of the full-run set b934b18
- e2e: pin argo cd, preload its images and keep cluster diagnostics on failure 5df3e02
- frontend: show the error a failed payload carries when it has no message 4567662
- helm: retry release reads the server refuses as busy 5ae317b
- resources: do not cache a custom resource layout whose definition could not be read d845a5e
- settings: skip settings when there is no user e419b9a
Features
- namespaces: narrow the desktop app to the namespaces an account can read f7166f9
Bug Fixes
- router: ask once when one back press arrives as two events 1a5e794
Features
Bug Fixes
- auth: keep back-channel revocations across a restart 57927a9
- auth: keep back-channel revocations across a restart 58fb9e4
- http: report a timed-out write as unknown rather than failed 194fc68
- resources: honor namespace-only credentials, stable windows and uid-bound deletes ecff4a1
- resources: refuse cached metrics history the reader cannot read fresh 1fb054d
- resources: release the cache build gate when a builder panics b6f306e
- router: ask before browser history discards an unsaved draft 4094f65
- timeline: record a durable gap when a batch could not be written f29e981
- timeline: record a durable gap when a batch could not be written 93d03db
Features
- api: declare the shapes and routes the next tranche fills ec04681
- chart: render the objects an operator looks for before installing 9bd02ea
- checks: hand the audit to a machine, and answer for a framework 829ea3c
- checks: run the audit on a timer and say when posture moved dbc7afc
- cli: log as json when serving a cluster, and hand the new work its flags d578414
- clusters: the picker says what is already open and shows that tab d54830e
- exec: keep a transcript of a terminal, when this deployment asks for one f71787f
- history: let the audit trail leave the pod, and let somebody take it away ef25337
- metrics: let spinoza report on itself in the format a scrape reads c6aa6ef
- panels: a Focused and a Console preset, and the size spinoza is built for 943ea96
- rollout: show what a workload rolled out, and let it go back 951eb2e
- server: say when spinoza is ready, and let it stop without cutting anyone off 25a90f9
- support: hand over what spinoza knows about itself c30e1e9
- ui: revisions, reserved-against-used, posture, saved views and the support bundle 5356740
- views: save a filtered table by name, and let an admin publish one 7050d1f
- waste: rank what is reserved and never used 00ee5e6
Bug Fixes
- access: work a person's scope out once per request 014953c
- catalog: file the discovered catalog under the cluster it belongs to b089cf4
- deps: take the smol-toml fix for GHSA-7w5x-hrqm-74c2 e527121
- history: carry the audit cursor so an export pages past the first page 74803ca
- install: wait out a locked binary when replacing it on windows 319ece3
- kubeconfigs: give each dialog its own path field 9ffb751
- waste: read the report once rather than once per render cce3bbb
Features
- checks: lead with the findings and put the settings behind one control 8f242a9
- clusters: ask about protecting a new cluster in a toast, not a modal 49709f9
- clusters: give opening a cluster a visible budget and a way out a31bd7b
- clusters: let a picked context replace the tab instead of always opening one 99542fd
- clusters: put every cluster control in one place, the strip d34685a
- clusters: refactor cluster picker ff110fe
- clusters: say on screen when a cluster stops answering 43910b9
- clusters: show the open cluster on the header picker 7982b9c
- feed: notice a backend that went quiet or belongs to an earlier run 35b682e
- graphs: head every graph with what it drew dbc3a8c
- health: name why a cluster stopped answering 001150b
- layout: hold the canvas at 1280 and keep every dialog inside the window a2d2def
- panels: give a fresh workspace the canvas, not two empty docks 8b865b9
- sidebar: split the workflows from the kinds, and let a kind be found 0efe2fa
- table: drive the rows from the keyboard, and say which keys 71ec56e
- theme: read the chrome in the system sans and the cluster in mono ce9dbbf
- ui: give every action the same shape, size and colour language 5f1afe5
- ui: give every missing, partial or stale answer one shape ff3bfc2
- ui: give every view the same row for narrowing what it shows 79d8872
- ui: head every view with what it is, what it covers and how it counts cd9b7af
Bug Fixes
- cluster: report an unreachable context as unreachable, not as a bad request baec819
- clusters: keep the plus beside the tabs and its menu on screen 851b905
- clusters: let the plus open its menu clear of the tab strip 4a644c3
- clusters: name the tab swatch after the menu it opens 2567807
- clusters: open the tab menu clear of the strip that scrolls e303e0a
- clusters: say so in the strip when no cluster is open 59b689c
- clusters: shape the open-cluster control like a tab d2c1c32
- deps: take the vitest and js-yaml advisory fixes 42e7b80
- docs: indent the e2e selection list so editorconfig accepts it b9d47d9
- feed: break the import cycle between the feed and its store de5386e
- feed: explain one silence once, in one place 0d1667d
- feed: read again when the reader comes back to the tab 19635a0
- health: stop a URL's timeout parameter reading as a timeout 38f182e
- mutation: keep the total check and its tests from failing inside Actions 5989ff5
- panels: keep an open dock open when the window narrows 1e22be4
- panels: open the inspector for an object opened from a panel 9988319
- settings: let the keyboard reach the settings panel when it scrolls 7267663
- sidebar: stop the kind tree stretching the page below the window d1a1b9a
- topbar: put the plain cause on the status dot, not the raw error 472de20
- ui: keep the quiet words readable instead of decorative 5a36a28
- ui: name each count for the scale it is counted in bd6dcd3
- ui: say what each figure means instead of repeating or overstating it 25dbb09
Features
Bug Fixes
- cluster: name the host and a possible proxy when a certificate is not trusted f7b29d1
- desktop: take the login shell environment and name an untrusted kubeconfig d705cc9
- test: quote the oauth2-proxy cookie secret so the fixture applies f2bb7c4
- theme: give the editor a readable dimmed line number 5548812
Bug Fixes
- actions: explain unavailable controls 0d91c84
- auth: harden cluster identity boundaries cf9535d
- build: retain kubeconfig sources in Docker context dac7877
- checks: move rule controls into details 05ecd83
- command-palette: limit activation to rendered results f436191
- deps: update x/crypto e56e01d
- fleet: clarify resource identity 26baa15
- fleet: keep GitOps errors and namespaces distinct d8f8d53
- gitops: preserve object identity and event completeness f24ea07
- history: preserve loaded page boundaries 3f9914d
- kubernetes: enforce exact live authorization e32d29c
- kubernetes: pin privileged workload images 2894922
- logs: reject unbounded zero-tail requests 66b277d
- logs: stop streams for recreated pods 50e3e2a
- mcp: preserve bounds, completeness, and access checks 3f77364
- mcp: withhold unsafe credential-bearing output 5942bb2
- metrics: clear stale range data e8e14a2
- namespaces: preserve data on refresh failures e8b591a
- node-shell: surface support check failures 039476c
- runtime: bound caller-controlled work 8f28af5
- server: harden HTTP and audit boundaries b3168a2
- settings: retry transient persistence failures 566f7db
- update: disable unauthenticated script execution 4aedf0c
Bug Fixes
- auth: isolate entropy failure testing 196ad61
- auth: require POST to sign out 0e26f05
- ci: reject incomplete mutation reports df2c8d3
- ci: render Helm chart in vulnerability scan 050fbd7
- ci: shard mutation testing 0130edb
- ci: stabilize long-running test jobs 433add6
- e2e: stabilize cluster setup and browser state 759d09a
- export: neutralize spreadsheet formulas 12b4662
- export: satisfy switch lint ccfb637
- frontend: reset parameter-scoped polls 444aa70
- mcp: redact GitHub tokens from logs c8e9b81
- test: use valid cluster mode session secret 39da795
Bug Fixes
- atomicfile: reject incomplete replacements 514e5e2
- ci: rerun all release PR checks 9f8379f
- helm: harden paginated release reads b9d4ad1
- helm: load release history lazily 82bbfd4
- helm: reject incomplete values files 2847cc7
- issues: preserve revision characters c1a0f56
- issues: use readable duration labels 6b8d7fd
- overview: reject stalled warning pagination 4fe06fa
- prom: discard non-finite samples 3b02491
- traffic: keep aggregated rates finite 1058bd0
Bug Fixes
- a11y: describe cluster color swatches 90e781a
- auth: harden OIDC local inputs ad07ec1
- ci: enforce exact mutation thresholds e37f9fe
- config: bound local configuration reads c02ba3e
- filetx: bound local file reads 9fb138a
- kubeconfig: normalize default context identity b5f1da9
- kube: replace in-cluster config atomically f152a2a
- limits: normalize nonpositive scan limits 4159580
- logs: surface selector refresh failures e1c37c1
- podcount: paginate for exact totals 7beb419
- podcount: reject repeated continuation tokens 755f3c1
- release: tag draft releases immediately 9d85e06
- resources: count paginated resources exactly ef0e3e2
- server: bound and sanitize fleet reads 376a0db
- sort: avoid identifier overflow 26acdec
- state: cancel blocked file transactions bb25937
- store: serialize cross-process state updates 2ea018f
- topology: fit large graphs into view 4d53c16
- topology: retain mixed projected references ebfde87
Bug Fixes
- access: distinguish group lists in cache keys 6afe352
- actions: harden cron triggers and drain failures 2e86cc6
- auth: enforce login flow expiry 6d4c248
- auth: fail closed when secret generation fails c60f816
- cluster: cancel stalled opens on shutdown 85d1215
- clusters: bound terminal teardown 36d5412
- clusters: snapshot context protection atomically bef96fb
- config: validate cluster resource limits 2c1aed4
- e2e: prepare cluster-mode assets 7e80f72
- frontend: apply namespace start to active cluster 3925a75
- frontend: scope namespace results to active cluster 492b32c
- inspect: expose only forwardable TCP ports d47318d
- kube: suppress warning overflow floods f495def
- listerr: bound and deduplicate list failures 3e625e9
- logs: follow recreated pod generations 3ee88ce
- logs: surface merged stream failures 8f0f0ec
- mcp: contain handler panics and bound result limits 5df0af8
- portforward: bound startup lifecycle and validate ports 4e3a10b
- prometheus: bound proxy response bodies 5ad67e9
- prometheus: use clear network alias 8532fcd
- readers: report recovered partial failures 54608e2
- samples: enforce the remembered pod limit 3a751f0
- schema: discard stale fetches after refresh 6221b79
- server: harden asynchronous lifecycle handling 4249758
- toolpath: bound login shell PATH output 782dede
Bug Fixes
- ci: isolate main push concurrency 17bdabf
- ci: preserve main push validation e5d912c
- ci: satisfy Go lint checks 01e1731
- ci: supersede obsolete main validation 4b28899
- clusters: clear stale errors on switch c85ab74
- clusters: restart log streams 7e43d6e
- commandbuffer: distinguish exact-limit output e5c85cc
- frontend: discard stale action completions 13a8438
- frontend: isolate cluster-scoped state bc7c89b
- frontend: isolate report and history lifecycles 20a33b1
- gitops: isolate application state dc1d279
- kubeconfig: deduplicate default sources 1a256e3
- release: fail on draft lookup errors f67970e
- release: scope draft detection permission 3d2a416
- server: enforce local shell connection budgets 13d158a
Bug Fixes
- checks: compare structured probe values 6953c4c
- checks: make quota selection deterministic b4084e5
- ci: validate release pull requests automatically 62cf979
- frontend: discard stale action and query results e73f8a8
- frontend: isolate cluster-bound asynchronous state cb9337f
- frontend: scope polling errors to requests 3d5f915
- helm: reject oversized payloads 2a97f05
- helm: report OCI catalog failures d97aec5
- history: preserve timeline and persistence invariants 1d26717
- release: make draft recovery reliable a74f7fb
- release: make validation self-contained a149b17
- release: recognize squash commit subjects 79b02c0
- release: recover drafts automatically 5c07e41
- release: restore release boundaries df995dc
- release: use native release recovery 2157e57
- resources: compile root cancellation 4109099
- runtime: bound subprocess output f244e8a
- security: enforce auth and cluster scope boundaries 636e60b
- server: strictly decode bounded JSON bodies eee74b9
- settings: serialize migration and synchronization 0c0c4c7
- store: paginate history by timestamp and ID 7da75dd
- update: order rechecks and bound responses c880f7e
Features
- access: scope reads to the namespaces an account may list c9afead
- api: carry partial check coverage, the issue total and the cluster wobble b5a42e6
- api: carry the account's role and the namespaces it reads ab4df95
- auth: add the identity, session and oidc package 70e63fd
- cli: serve a cluster to a team behind an identity provider 7c8c50c
- frontend: sign in and show what the account reaches 58dd4b8
- kube: impersonate the signed-in account against the apiserver 859e6f8
- server: gate every route on role, locality and cluster reach 914c4b8
Bug Fixes
- access: fail closed on unanswered reviews cd6d546
- atomicfile: sync directory after replacement 16e6951
- auth: enforce session maximum age d68c0ed
- auth: enforce trusted proxy boundary 1999a81
- auth: reject weak session secrets f8615d6
- auth: restrict shared audit metadata ae28dbf
- auth: validate trusted proxy requests 9d1f001
- charts: require modern TLS 83f80f6
- checks: align namespace counts 86a8d35
- checks: key surveys by metrics state 63129fe
- checks: read API removals from the k8s.io/api markers, keyed by kind 798f329
- checks: reject non-boolean user rules 47a0ff9
- checks: reject unreachable silencer rules 4acfb19
- checks: report silencer evaluation errors 2c54bd5
- ci: name uv where a Python tool needs it, and yq for the scope guard e2d8c23
- ci: prepare assets before vulnerability scans 572d2a9
- ci: satisfy Go lint checks 82ee33d
- ci: scope every mise install, and stop counting a cut list as the whole f1393fd
- cluster: require public URL origin ac44f0d
- compare: drop the spec fields each cluster allocates for itself 1949ae9
- fleet: page merged check findings b887a51
- fleet: preserve namespace provenance ac5688c
- fleet: report partial image inventory c745893
- frontend: explain absent GitOps controllers 8d001f0
- frontend: migrate custom check rules d7a0971
- frontend: replace deprecated type matcher 68f873a
- frontend: show fleet warning b26644f
- health: settle cluster verdict under one lock 94a1bff
- helm: constrain repository network access 6a8ef2e
- helm: reuse cached repository indexes bb02a38
- history: persist action actors d7081bc
- history: record action actors 01a22df
- history: record partial drains as failed 8de3f25
- issues: validate page cursors 221d6a6
- mcp: recheck cluster protection 73cea28
- release: publish image and Helm chart ff8dd47
- release: verify release tags before creation 8466f48
- server: avoid websocket shutdown delays 602bbf6
- server: bound and revalidate live connections b69ec1f
- server: count cluster label characters 9f76dd3
- server: finish started writes and gate the node shell before it upgrades e1d5d5b
- server: limit websocket subscriptions 189c894
- server: minimize public 520f936
- server: release unresponsive websocket feeds dab5d76
- streams: synchronize subscription access 33ea429
- timeline: resume saved recordings after restart 902da76
- update: reject oversized install scripts f911b5f
Features
- desktop: write the app log to a file 8e6e314
Bug Fixes
- checks: decide orphans from the kinds that carry references, and filter on severity 717e46a
- cluster: keep the context you asked for active, and settle cluster health with one writer 901b21b
- counts: page the unhealthy pod count instead of stopping at 500 51a776f
- fleet: keep the baseline and the skip mark, and survive a panicking cluster 5f4866c
- frontend: key cluster health, page history per table, and gate issue cursors on their own sort 64f44fd
- frontend: stop exporting queueKey 1e95927
- rbac: stop a rule tied to named objects answering for every object 6677679
- server: refuse every cluster write on a protected cluster and finish the ones already started 7aed69e
Refactoring
- desktop: lift logging, local shell and file picker out of runDesktop 56ca8dc
Features
- cli: open on a named view and context, and keep injected values inside their quotes 472f06b
Bug Fixes
- clusters: remember tab and columns on switch 1808c8f
Refactoring
- resources: give each interface the manager implements its own file 187f187
Features
- checks: compare a baseline from another cluster by count, not by finding db7ae52
- checks: let a rule of your own quieten a check, and carry a baseline between clusters 709be32
- fleet: a fleet view, and reach older history from the timeline 3a06124
- fleet: reach the release and delivery lists from the fleet view b8aea75
- issues: sort by date, page the audit half, and calm the traffic graph and the cluster dot 12cb34a
- rbac: answer who can do what on a cluster, not only what I can 89f6bfb
- resources: add columns of your own from any field, label or annotation 5933880
- store: bound the audit the way the timeline is bounded 4e71403
Features
- checks: make the findings a work list — mute, a baseline to compare against, and per-namespace 7d3bdbd
- checks: rank each finding by how far the problem actually reaches 0dd4370
- checks: read the custom resources, and only when a check needs them bcd2b92
- checks: tell a leftover from something a controller reads 5753086
- fleet: checks, search, releases and GitOps across every open cluster 4b815eb
- issues: hand the queue out a page at a time, keyed on the sort order cd5fc9f
- just: filter every test suite by name and by path c77f7ef
- spinoza: one Issues queue across every open cluster, and a timeline of what the cluster does a6a0a73
Bug Fixes
- ci: break the checks import cycle, and stop exporting what nothing imports fa00b3e
- clusters: key the namespace answer on the cluster, and let the strip scroll 1e88a6a
- e2e test 5fc0e34
- frontend: check what production actually reaches with knip 903b09a
- lint: check a marshal, convert two identical structs, and stop shadowing net/url f0f7abf
- themes: warn when an imported theme would make the editor unreadable 9187c45
Features
Bug Fixes
- clusters: give the cluster spinoza starts on a tab of its own ba93a77
- e2e: lint fixes ba4b627
- lint: scope the a11y relaxations to the three files that need them cf8b442
- prom: refuse a range query that matched more than one series a0f616d
- traffic: read how many flow series carry labels, not whether any do b627fb3
Features
- checks: audit RBAC, networking and storage, and choose what the audit reads and shows 935d363
Features
- checks: 53 more checks, and your own workloads ranked above packaged ones 1709f34
- checks: decide schedulability and references against the live cluster 8ff9681
- clusters: open several clusters as tabs, each keeping its own state 86a379d
- clusters: open, list, activate and close a cluster over the api cf27a65
- clusters: remember which clusters were open and report every one's health 5095e9e
- clusters: send every request and subscription to the cluster it is for 09220ac
- clusters: track health per cluster instead of assuming the rest are fine c6693f2
- history: give each cluster its own writer and keep one file honest between them 79dbb71
- license: print the terms with --license and lay them down on install e58e66e
Bug Fixes
- checks: drop two rules a live apiserver can never trip 60bbc9a
- ci: scope knip away from the hand-mirrored wire contract c7c0af9
- clusters: check protection on the cluster being written to ff41d58
- graph: size flow nodes and refit the canvas so edges draw 79dee50
- issues: raise the row cap above what a real cluster produces 68c8302
- mise: pin uv so the pipx-backed tools resolve 312b556
- sidebar: retry discovery automatically after a transient failure 319377f
- spinoza: close the act-now findings from the speedrun review 658875d
Refactoring
- clusters: resolve the backend per request and key connections by id d528c74
Features
- checks: audit pods and workloads against 15 best-practice checks c304b84
- checks: page through every finding a capped group holds back b23369d
- gitops: name the writer that took a field on a server-side applied resource dd0bd24
- gitops: the argo write surface, a per-application page, drift and diagnosis 14a2016
- history: key clusters on a normalised api server url and record what spinoza did eea1f66
- history: record what spinoza changed and show it in its own view 70baf40
- install: uninstall on macos and linux efc858f
- install: uninstall on windows and check build provenance on request 31a3bf0
- issues: rank what is broken now into a self-clearing queue 0f2d08c
- mcp: an MCP server and command line over one cluster, in its own binary 89d8426
- packaging: windows, the linux desktop app, deb, rpm and channel manifests 1003450
- topology: an ownership graph of the cluster, folded by default 59a318c
- traffic: a workload traffic graph from Cilium Hubble metrics ad3efd2
- update: offer windows the powershell install command 6a8d08e
Bug Fixes
- a11y: give the docks a valid role and let the keyboard reach the scrollable panes a7068e0
- checks: emit patches the api server accepts 7a9b5f6
- checks: resolve owners by api group and quote what yaml would eat 096bb05
- ci: repair ci 7fcb02c
- gitops: verify the terminate patch, key drift by name and stop the hidden panel polling 1be42b9
- install: compute the checksum without Get-FileHash e91bc4d
- install: stop a typed parameter swallowing the registry handle e04d3c8
- issues: bound the stall probe and stop a guess erasing a fatal row c325976
- issues: read a crash loop from the terminated state, not just the waiting one bd9c4fa
- mcp: keep one bad message from ending the session and stop a slow tool blocking the rest db15521
- mcp: refuse a replica count that is not a number, and bound every tool call e1cc011
- overview: count a paged event walk as one listing attempt f2348b2
- overview: page the warning events so the newest 25 really are the newest 022dd83
- topology: stop a test owning a shared namespace and lint fixes a28029f
- traffic: fold a crowded graph to namespaces and bound the probes 659ef57
- update: stop comparing a release against a version that does not parse b19be9b
Features
Features
- update: add an update button and a switch for the automatic check f88b290
Features
Bug Fixes
- metrics: stop exporting a constant nothing imports ce288b8
Refactoring
- update: drop the update-check flags 8053632
Bug Fixes
- columns: read a declared column that ranges for every row, not just the first 0b57602
Refactoring
- logging: stop quoting what the handler already escapes eaedd1f
Features
- nodes: say how much of how much, not just a percentage 7e5d198
Bug Fixes
- conditions: stop reading a node's problem detectors as readiness 07785ae
Bug Fixes
- deps: take echo 4.15.4 for GHSA-vfp3-v2gw-7wfq 74d41cb
Refactoring
- access: one place asks the cluster what this user may do 52b4760
Features
Refactoring
- server: split the route table and handlers out of one file 6d6e864
Features
- access: tell a bulk action what the cluster will refuse, row by row da9289e
- health: flip the cluster indicator on a failed request, not on the next ping 42b31a9
- helm: tell a release's buttons what the cluster will refuse 687ef61
- logs: tail every pod of a workload in one stream 0a8378d
- rbac: check gitops actions and split the log tail across pods f29407f
- rbac: grey out actions the cluster would refuse 48ba22e
Bug Fixes
Refactoring
- stores: one atomic file write, and cover the paths that only fail on a broken socket 67a1468
Features
- compare: report drift across two contexts for a whole kind 4c83d0a
- events: filter a windowed table against the whole cluster 7ffcb87
- helm: find and install charts from oci registries 1a85ac2
- helm: install a chart from a configured repository d5de7cf
- nodeshell: open a root shell on a node from the node panel 878fe3b
- ui: compare an object against another context 7797e80
- ui: show configmap data beside the secret values ae53630
- ui: turn node shells on in settings, and follow the cluster a link names 3992b15
Bug Fixes
- ui: focus a docked release on a deep link and name it in the title 74ef4ea
Features
Features
- ui: say why the desktop switch is unavailable instead of hiding it d2af123
Bug Fixes
- ci: green sast, go lint and the integration helm upgrade test feaf6d1
- cli: rewrite the token file so mode 0600 always applies 44acf60
- helm: block private hosts on the upgrade repo URL b565907
- server: drop the run token from the address bar after load 1005b1c
- server: keep the pprof profiler off unless -pprof is set 584a267
- server: only treat GET as a websocket upgrade 67345d6
- server: send Referrer-Policy: no-referrer on served pages c6ac62b
Features
- ui: open on the cluster overview instead of an empty table d736f4a
Bug Fixes
- release: list checksums under their bare filenames d22bb02
Bug Fixes
- ui: close the top-bar menus on an outside click, escape or focus loss 35f85bc
Features
- argocd: sync and refresh applications from the inspect panel d4ad6e5
Features
- install: install the desktop app and say how to run both f37b62e
Features
Bug Fixes
Refactoring
- frontend: stop exporting what nothing outside the module uses 6f488ff
Features
- events: open on the newest 100 and load more on demand 88482ad
- filter: complete field names and values as you type 7552dcc
- filter: filter the table with chips shared with the namespace picker 1088d0c
- helm: name the namespaces a partial secret read could reach 46eb354
- panels: let a selection reopen the collapsed details dock 7e31da3
- table: share leftover width across every column 45eafed
Bug Fixes
Features
Bug Fixes
Features
- argocd: give Argo the graph and resource list Flux has, and separate chart from app version b7c62aa
- argocd: list applications from their CRDs, and tidy the top bar d62d1b1
- ci: cut GitHub releases with release-please 0653cd4
- ci: publish coverage badges and show them on the README 57557cb
- search: find objects by name across common kinds from the palette ba75911
- settings: keep interface settings on the server, not in localStorage 35cc2c2
- ui: choose the namespace a cluster opens on, and offer it once e799121
- ui: pick the namespace in the top bar and scope the feed to it 203f5bb
- ui: show every namespace by default d62f15b
- ui: sort nodes and pods by cpu and memory 9c42381
- ui: split GitOps into detected Flux and Argo CD groups, drop the status tiles 8f36066
- ui: switch between the desktop window and a browser tab 7383ec6