Skip to content
Spinoza

Changelog

What shipped, and when.

Every line links to the commit that made the change.

v2.1.0

Features

  • compare: say which fields the comparison ignored 6f977b9
  • compare: say which fields the comparison ignored 5ae40e6
  • metrics: label where a series came from and when sampling began 6e44445

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

v2.0.0

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

Refactoring

  • api: one severity scale, and reach as a count beside it d087959
  • app: work out where a saved view or a waste row opens, separately ed80b38
  • frontend: one reasonOf for what a failed request said 84717b7

v1.30.0

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

v1.29.0

Features

  • checks: decide PSS upstream, import scanner findings, widen rule CEL 5914c2c
  • cluster-mode: refactor cluster mode ed4ec06
  • theme: make Borg the default theme 4e4bb94

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

v1.28.0

Features

  • palette: group command results f38b2a9
  • resources: show table scope identity fb67eec

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

v1.27.5

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

v1.27.4

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

v1.27.3

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

v1.27.2

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

v1.27.1

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

v1.27.0

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

v1.26.1

Bug Fixes

  • cluster: restore persisted timeline 3d29302
  • go: stabilize unit test CI 28286b0
  • release: verify Helm chart checksums 28e41f3
  • settings: isolate served user preferences 63096fb

v1.26.0

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

Refactoring

  • auth: consolidate signed cookie handling 881357c
  • auth: share signed cookie codec c375678
  • frontend: share view labels 6a093ab
  • server: consolidate cluster key lookup 50b06f6
  • server: one door for cluster writes b9e964e

v1.25.0

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

v1.24.1

Bug Fixes

  • e2e: stop the harness killing a server it does not own 1ff746f
  • test: wait for the quota controller before auditing the namespace it fills e94d045

v1.24.0

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

v1.23.0

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

Bug Fixes

  • checks: drop the paging hook nothing calls, and a name typos rejects ce0b349
  • sidebar: say the pods tally counts phases, not readiness df8d083

v1.22.0

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

Refactoring

  • frontend: put one graph shell behind the gitops and traffic canvases afd26ff
  • server: answer helm, traffic and shell support in one capability probe ebf88ea

v1.21.0

Features

  • checks: warn about APIs a release removes, watch certificates bb2e7d0
  • checks: write own checks as CEL expressions d183aa8
  • clusters: give every tab a colour and name the cluster before anything destructive e1f6c4e
  • clusters: name a tab, group it, and choose whether it comes back 425d1b8

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

v1.20.0

Features

  • checks: audit RBAC, networking and storage, and choose what the audit reads and shows 935d363

Bug Fixes

  • ci: read the whole archive listing so verify-archives stops failing the release 8f4088f
  • themes: paint the editor from the theme instead of leaving monaco its own greys 18e7d66

v1.19.0

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

v1.18.0

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

v1.17.0

Features

  • cronjob: suspend, resume and run now 4664381
  • settings: follow a theme another window chose 278eaf9
  • tables: sort a node metric by how much it has, not only how much it uses eebfad9

Bug Fixes

  • build: give the frontend the same version as the binary fb808d4
  • settings: send only the keys this window changed 174ab3b

v1.16.0

Features

  • update: add an update button and a switch for the automatic check f88b290

Bug Fixes

  • settings: merge on write so two windows do not undo each other 6b5bcfd
  • update: refuse an install script that ignores the skip 3215aa4

v1.15.0

Features

  • metrics: draw a chart from what spinoza measured when there is no Prometheus 5275939
  • update: move the release check to spinoza.tech 344b84f
  • update: say when a newer spinoza is out and offer the command that installs it 1b9fab5

Bug Fixes

  • metrics: stop exporting a constant nothing imports ce288b8

Refactoring

  • update: drop the update-check flags 8053632

v1.14.1

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

v1.14.0

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

v1.13.1

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

v1.13.0

Features

  • tables: keep declared columns current and color the ones that say if it works c76d617
  • tables: show custom resources the columns their own definitions ask for 430870e

Refactoring

  • server: split the route table and handlers out of one file 6d6e864

v1.12.0

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

  • contexts: tell every window when the cluster changes, and ask the right question before a drain eb56b54
  • kube: tell helm and kubectl which kubeconfig spinoza was started with b0400eb
  • ui: say when the cluster stops answering, and refuse an apply that would overwrite blind 59d5713

Refactoring

  • stores: one atomic file write, and cover the paths that only fail on a broken socket 67a1468

v1.11.0

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

v1.10.0

Features

  • ui: add ui to display secrets c57474c
  • ui: dock the helm release detail and drill into its resources 51c9da0

Bug Fixes

  • ui: colour a condition by what it means, not by its truth value 461f884
  • ui: keep Progressing and Initialized reading as they did 3df1d18

v1.9.0

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

v1.8.0

Features

  • ui: open on the cluster overview instead of an empty table d736f4a

v1.7.2

Bug Fixes

  • release: list checksums under their bare filenames d22bb02

v1.7.1

Bug Fixes

  • ui: close the top-bar menus on an outside click, escape or focus loss 35f85bc

v1.7.0

Features

  • argocd: sync and refresh applications from the inspect panel d4ad6e5

Bug Fixes

  • ci: tell gh which repo to publish the release in 82577c6
  • desktop: take the PATH from the login shell so credential plugins run 4dd683a
  • ui: say what watching every namespace costs d4b2a69

v1.6.0

Features

  • install: install the desktop app and say how to run both f37b62e

v1.4.0

Features

  • namespace: keep the opening namespace per cluster and only offer it on big ones cb0c245
  • protect: ask for the typed name before applying, as before deleting 9165be5

Bug Fixes

  • bulk: say that the typed confirmation is the cluster name aca4daf
  • install: report the directory the binary was installed to 3fc3a19
  • release: publish as draft until the artifacts are attached 0c7ff8a
  • test: make the integration tree compile and keep it that way 47e2709

Refactoring

  • frontend: stop exporting what nothing outside the module uses 6f488ff

v1.3.0

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

  • filter: ignore a namespace chip on a kind that has none a890cbb
  • filter: take the kind scope from discovery instead of the first snapshot adb24b9
  • flux: fill the width with the shared column rule 57fbc6b

Refactoring

  • api: give the error envelope a named wire type 1acba11
  • contexts: share the protected-cluster confirm name c65848e
  • sidebar: move the cluster Overview next to the CLUSTER group 246f65f
  • views: derive the view type from the one list that registers views 59a6aff

v1.2.0

Features

  • flux: show the control plane, the sync and controller usage above the resources f566677
  • ui: one loading indicator, used by every view 49f10a5

Bug Fixes

  • events: give events their own columns and facts, and show one Event kind a4da2d5
  • flux: fill the usage bar against the limit a9297c5
  • ui: name the api group when two kinds share a name fccce78
  • ui: say what the namespace offer means and keep it in the history 1475919

Performance Improvements

  • counts: count through the metadata client and share one tally per window d821123
  • feed: send row changes in one frame instead of one each 46245ca
  • helm: list releases by metadata and decode only the newest revision 125bf11
  • ui: sort rows once, not twice 8c57c8b

v1.1.0

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

Bug Fixes

  • ci: green the hygiene, docs and go audit jobs 6fa0e73
  • frontend: unexport helpers that nothing else imports c2aacdd
  • install: match the Location header without a bracket class 70cefc5
  • ui: open the filtered list from search, keep tooltips current, drop the native context select 173830c

Performance Improvements

  • metrics: cache one build per window, watch node capacity, read in parallel 4b758da
  • resources: share one informer per kind and keep it warm between views 90c0779