0.98.0 (2026-10-23)
Added
- blueprints: call the tab Blueprints, add a Needs attention filter and keep the catalog on screen (#2082) (8a9115f)
- blueprints: create node labels and see matched nodes from the Blueprint form (#2077) (03e2636)
- blueprints: detect and enforce runtime digest drift (#1949) (489e1a9)
- blueprints: give the Blueprint sheet one Answer and a shorter toolbar (#2080) (d3fb532)
- blueprints: open a Blueprint and the create dialog over the GitOps workplace (#2083) (143f5a2)
- blueprints: pin the create actions and show form errors beside the field (#2079) (7051673)
- dashboard: rebalance the Home lower half around operational signals (#1953) (0ab2652)
- dashboard: Stack Health All nodes inventory (#1918) (a375861)
- deliver hub registry credentials to remote Compose targets (#1866) (341511a), thanks @samschultzponsys
- drift: say how to resolve drift and dismiss it (#2116) (87db3f1)
- editor: add Save & Pull Images to the compose editor (#1948) (f0906f8)
- editor: create the stack .env from the editor on first save (#2097) (a6eaea0), thanks @Hambrook
- fleet: add Cordon and Delete to the node details sheet (#2090) (fd5824c)
- fleet: detect and update from a new sencho-dev:dev build (#1871) (275c654)
- fleet: draw the Map one node at a time as each answers (#2091) (d7e0ebc)
- fleet: replace the Status tab with Readiness (#1952) (1efaa13)
- fleet: separate the Fleet tabs into two sections, with a layout setting (#2092) (a54ebcc)
- git: add GitOps revision store and Direct apply transitions (#1835) (38ee452)
- git: classify Git host rate-limit responses as their own error state (#1884) (1bcf7b5)
- git: classify managed-file changes before apply (#1832) (3c4c057)
- git: complete-project materialization with a managed-project manifest (#1786) (578ce76)
- GitOps executable artifact identity (Direct nodes) (#1937) (a698b6d)
- gitops: add decomposed approval actions for Git-managed Blueprints (#1959) (b27fbee)
- gitops: add rollout generations and Inline placement approval (20d0db4)
- gitops: add rollout lifecycle controls and rollback recovery (#1965) (bb85e08)
- gitops: add the GitOps portfolio workplace (#1954) (85f5246)
- gitops: authorize Git-managed Blueprint rollout generations (9cbb5f8)
- gitops: bind Blueprint content to a live Git source (#1926) (ea905b7), thanks @samschultzponsys
- gitops: block Blueprint place until private registry targets are ready (#1946) (2fb2c91)
- gitops: complete the Git-managed Blueprint rollout path (#2084) (612c25a)
- gitops: compose the authority evidence into the Blueprint rollout preview (#1957) (a881e42)
- gitops: connect the workplace to stacks, Git sources, Blueprints, and Fleet (#1978) (13690c0)
- gitops: dispatch accepted generations through the shared pipeline (#1913) (3f91705)
- gitops: durable reconcile-attempt reservation, coalescing, and recovery (#1893) (69e7609)
- gitops: harden the portfolio workplace and scope stack indicators (#1977) (09494d2)
- gitops: independent source, placement, and rollout authority policies (#2020) (ab34e85)
- gitops: native Git provider webhook ingestion (#1934) (e62b059)
- gitops: notify on authority, rollout, and stateful-hold decisions (#1969) (48b0276)
- gitops: observe remote rollout targets over the node proxy (#2149) (48b8d69)
- gitops: open each portfolio application in a read-only application view (#1956) (46937e7)
- gitops: open the Git source in place and animate Pull (#2062) (bba9d30)
- gitops: persist the observed apply invocation and classify invocation drift (#2032) (3623ce2)
- gitops: poll scheduling, source policies, and retry evidence (#1910) (57cd842)
- gitops: produce the remaining drift classes (#1979) (698d3f3)
- gitops: render decomposed approval authority and placement/rollout state (#1955) (5981355)
- gitops: resolve attention in place (#2065) (2d89f13)
- gitops: resolve branch, tag, and SHA refs to immutable commits before fetch (#1864) (48f0104)
- gitops: show per-target image digests and document the drift model (#1984) (61b25f4)
- gitops: SOPS/age repository secrets without durable plaintext (#1935) (9d0dbeb)
- gitops: source controller follow-on (#1920) (71595cb)
- gitops: stage-aware retry and resume re-evaluation (#1917) (d4ef263)
- git: per-source private CA bundles and redirect credential guard (#1870) (d5ef403)
- git: SSH deploy keys with strict host-key verification (#1867) (3ca0f8e)
- git: swap isomorphic-git for native git transport behind clone seam (#1849) (392bc15)
- health-gated Blueprint rollout policy (#2018) (32fd95d)
- listen with HTTPS so Pilot credential delivery stays confidential (#1943) (c02dfa4)
- navigation: make Compact Launcher the default desktop style (#1890) (b676657)
- networking: resolve and dismiss networking findings in place (#2106) (f935fa7)
- notifications: customizable per-channel JSON payload templates (#1805) (866d784), thanks @axiomatose
- notifications: mark alerts read and mute them where they appear (#2117) (63220a7)
- open a published port at its configured service URL (#2124) (e9f8242), thanks @AnyColorIWant
- preferences: server-backed per-user appearance and navigation (#1901) (e7b457f)
- raise the Compact launcher quick-link cap to 10 (#2120) (d48daa0)
- readiness: dismiss readiness findings until they change (#2100) (11312d8)
- readiness: resolve readiness findings in place (#2101) (2fedeaf)
- recovery: complete authored-project atomic rollback generations (#1819) (f517888)
- registry: exact-ref private-registry delivery to remote nodes (#1905) (ce8b454)
- registry: Pilot private-registry parity - target facts, hub authority, auto-update (#1930) (39e0af9)
- registry: seal private-registry credentials for HTTP delivery (#1945) (591b062), thanks @samschultzponsys
- resources: add search, filters, and sort to Rollback generations (#1788) (9798700)
- resources: bring the Resources page to the design system (#2156) (935158b)
- security: act on posture findings from the overview (#2113) (184f2ce)
- settings: change fresh-install defaults for charts, log chips, progress style and stack guardrails (#2119) (7c99a65)
- stacks: rescan from the scan banner; recheck Blueprint name conflicts (#2118) (23f8735)
- surface the running build identity in About, the shell chip, and Admiral Account (#1899) (1ad20da)
- ui: add resizable sidebar and Anatomy pane (#1902) (ab6e494), thanks @candroid-man
- updates: table view as the default for the update page (#2059) (8eaa954)
Fixed
- app-store: give every catalogue port exactly one protocol (#2019) (aadbd05)
- auth: honor SSO-only CLI recovery without restart (#1810) (27fe0ae)
- blueprints: announce a Suggest-mode drift once per episode (#2086) (661412a)
- blueprints: detect a remote name conflict from the leaf stack list (#2129) (daed461)
- blueprints: gate digest-pinned remote apply on leaf capability (#2005) (248154a)
- blueprints: retry a refused drift repair instead of stranding the row (#2028) (c92004d)
- bump moby/go-archive to v0.3.0 in Docker CLI and Compose builds (#1845) (a07401f)
- calm shared modal open/close motion (#1931) (7569f1d)
- classify a synced sibling .env as a SOPS secret (#2131) (25c272e)
- console: clarify Pilot Agent host-console unavailability (#1868) (4994031), closes #1855, thanks @samschultzponsys
- dashboard: keep the Stack Health name column readable at 1280 (#2073) (a128575)
- dashboard: use balloon-adjusted memory percent on the Memory tile (#1847) (c3c6c1b), thanks @Crosis47
- db: log failed column migrations and cover poll-column upgrades (#1976) (39e1325), thanks @samschultzponsys
- deps: bump dompurify to 3.4.17 (#2168) (77026fc)
- deps: bump follow-redirects to 1.16.1 (#2157) (95398a1)
- deps: bump grpc-go to v1.83.1 to clear CVE-2026-84304 (#1885) (3cfa8ab)
- deps: bump grpc-go to v1.83.2 (72fd455)
- deps: bump transitive deps to clear fast-uri, qs, and humanfs advisories (#1891) (f8cfcb5)
- docker: bump the Compose plugin's containerd to v2.2.10 (#2144) (4f1ed31)
- docker: floor libexpat at the version that fixes CVE-2026-77214 (#2147) (e536275)
- docker: floor pcre2 at the version that fixes CVE-2026-103111 (#2057) (18d6aba)
- docker: rebuild the CLI and Compose binaries with Go 1.27.2 and x/net v0.60.0 (#2107) (325d4e3)
- docker: rebuild the CLI and Compose binaries with Go 1.27.3 (#2164) (7a9abb8)
- docker: rebuild the Compose plugin from v5.6.0 (#2145) (57e2d98)
- docs: repair broken anchors and missing images (#2171) (adb0d8a)
- docs: use MDX comment markers on the Git transport support page (#2166) (3f8a678)
- editor: dispose compose DiffEditor models after widget reset (#1828) (93a5ba9)
- editor: keep the compose toolbar inside the pane at 1280 (#2125) (712c96a)
- editor: pin compose editor requests to the captured node (#1897) (607904e), thanks @samschultzponsys
- exec: fall back to /bin/sh when a container has no bash (#1997) (e1c044d)
- exec: send Tty on exec start so the stream is not multiplex-framed (#2096) (a77eb1b)
- filesystem: require lstat to report a link before refusing a path (#2115) (22df038)
- fleet: bound unreachable proxy overview probes (#1919) (e8da1fd)
- fleet: report a gone Pilot as offline and bound the Fleet map reads (#2088) (f38d488)
- fleet: stop advertising a dev build the node already applied (#1974) (1347bca)
- frontend: coalesce concurrent stack statuses fetches (#1816) (017ac57)
- frontend: overlap stack list and status hydration requests (#1820) (c47b8eb)
- frontend: stop client-side preference changes refetching all settings (#2008) (bcc4b7e)
- git: classify an untrusted-signer TLS failure as a certificate error (#2158) (108a47a)
- gitops: address the runtime drift repair audit (#2026) (e686f55)
- gitops: announce local Git source changes on the channel GitOps views listen to (#2067) (e34948b)
- gitops: announce one pull result per attempt, and only when it changes (#2104) (f208a1f)
- gitops: attribute a health verdict to an unacked rollout attempt (#2033) (2358a07)
- gitops: authenticate SOPS values with their key path (#2081) (fc96137)
- gitops: bound concurrency for the startup preflight backfill (#2004) (e0a5425)
- gitops: bound GitOps history with a retention window (#2105) (ca90588)
- gitops: bound the Blueprint detail reachability probe with a short-lived verdict window (#2052) (ae22a22)
- gitops: capture Pilot recovery and stop refused rollbacks from parking the application (#2087) (cee2ec8)
- gitops: compare stale artifact probes by platform membership (#2034) (d57d2a3)
- gitops: date a recorded placement refusal instead of presenting it as current (#2042) (c0b5708)
- gitops: fail closed on incomplete target evidence (#1998) (b4d01da)
- gitops: guard automatic acceptance against stateful withdrawal (#1975) (3ecb954)
- gitops: health-gate a Blueprint rollout under its deploy stack (#2165) (f967a59)
- gitops: keep an accepted Blueprint commit on the next poll (#2126) (5ca0f6a)
- gitops: keep an application addressable when its evidence cannot be read (#2000) (acfcb55)
- gitops: keep Stack Drift, notifications, and metrics on the canonical posture (#2011) (91648b0)
- gitops: make automatic placement approvals reach execution (#2103) (0ce9754)
- gitops: make native provider webhooks work on remote nodes and for GitLab (#2078) (d3f6783)
- gitops: match Blueprint repo claims on repository identity (#2054) (d2d2a5d)
- gitops: match webhook deliveries on canonical repository identity (#2102) (b8de90d)
- gitops: name the unresolved artifact identity and drop the stale source report (#1960) (7767fd6)
- gitops: name what a Blueprint acknowledgement actually means (#2037) (3f02e7f)
- gitops: normalize Docker architecture names to OCI platform names (#2074) (6178bc6)
- gitops: observe a remote deploy's runtime identity on the leaf (#2038) (b2155bd)
- gitops: project Blueprint deploys, withdrawals, and their failures (#2029) (3c5d4aa)
- gitops: prune provider webhook endpoints when a git source or stack is removed (#1940) (23baec2)
- gitops: read a failed marker as unverified rather than as drift (#2043) (194b8a5)
- gitops: read a redeployed failed generation as work in progress (#2045) (1e1bea0)
- gitops: record the policy on a policy-authorized rollout (#2040) (e0c4c10)
- gitops: render the portfolio Rollout column through the rollout vocabulary (#1970) (38de9b6)
- gitops: report a Blueprint reconciler drift in the canonical drift list (#2025) (709c7e0)
- gitops: restore only the generation a Blueprint target acknowledged (#2024) (324dd7e)
- gitops: retry an unresolved Blueprint artifact freeze from the drift check (#2039) (e4ad902)
- gitops: return reconciliation results from manual pulls (#1927) (e41722d)
- gitops: stop asking a detached Blueprint for a rollout authorization (#2114) (2074080)
- gitops: surface withdrawal residue for a tombstoned target (#2053) (b6b059a)
- gitops: treat an unresolved health run as an operation in flight (#2041) (adab9f3)
- group the GitOps portfolio filters into one popover (#2154) (1a52b50)
- hub-only: enforce hub-only /api/api-tokens/ boundary (#1894) (6fc4a43)
- hydration-timing: report list hydration relative to the foreground attempt (#1813) (88fc547)
- keep outline buttons and filter selects flush with the card in the Dim theme (#2153) (d8891f3)
- keep readiness finding verbs inside the pane (#2127) (6da06ce)
- keep Restore toasts when overlapping silent service gates begin (#1947) (d87746c)
- mesh: keep stack networks, scope mesh listeners, detect dead tunnels (#2010) (bb77576)
- networking: hold unsafe network deletions and stabilize aggregate reads (#1850) (cc4a657)
- nodes: reject whitespace-only names on create (#1911) (0a6d0bf)
- notifications: redact webhook URLs on channel reads (#1951) (2baf4e3)
- pilot: preserve tunnel JWT across upgrade 401 reconnects (#1818) (2d35013), closes #1817, thanks @Auxilias
- polish notification actions, topology icon, minimized progress, security sheet and timeline lanes (#2151) (495bac5)
- preferences: migrate explicit UI preferences on first login after upgrade (#2072) (2f6c0ff)
- preserve exact guardrail message for Save & Deploy and Start (#1898) (30e3936)
- proxy: resolve node id consistently before deciding to bypass json parsing (#1880) (8d9522c)
- pull the next commit on a manual Git-managed Blueprint (#2130) (7a6682e)
- recovery: deploy stacks whose inputs a recovery generation cannot hold (#2148) (646f60f)
- registries: key delivered Docker Hub credentials under the v1 auths key (#2075) (4b060ea)
- remove a stack's mute rules when the stack is deleted (#2152) (09d4547)
- resources: load the Resources page and volume prune without the slow image df (#2155) (880e6c6)
- resources: zero reclaimable images when held state is unknown (#1912) (4b2f9aa)
- security: forward only validated client addresses to remote nodes (#2071) (ef2bd00)
- security: harden authentication and outbound targets (#1877) (79b86dd)
- security: make ignored forwarded headers loud (#2069) (966cf72)
- security: refresh overview when image-update checks toggle (#1827) (cb1f6b1)
- security: resolve the WebSocket client IP through the trusted-proxy predicate (#2031) (b833e55)
- security: tie fixable CVE posture to image-update evidence (#1815) (fcd44f5)
- security: triage the unfixable braces advisory (#2070) (d30e4da)
- serve the UI typefaces from the instance (#2132) (9034198)
- sso: accept the issuer GitHub now returns on the OAuth callback (#2061) (1426b79)
- sso: enforce hub-only SSO config when remote node is active (#1865) (c6d9fb9), thanks @samschultzponsys
- sso: preserve admin-assigned roles across SSO sign-in; IdP role synchronization is opt-in in Settings · SSO (#1862) (7cd4269), thanks @samschultzponsys
- sso: preserve granular roles across enabled role synchronization (#1875) (8cf10c4)
- stacks: make remote create-from-git honor deploy keys and private CAs (#2076) (fd95c8e)
- stacks: remove repeated self-identity discovery from statuses hot path (#1811) (600367e)
- statuses: align stack-status cache TTL and invalidation with polling (#1814) (55ca82a)
- stop compose-ps spam after deleting a stack (#1831) (4c93947), thanks @proofquantu
- terminal: support copy and paste in container and host consoles (#1996) (423f4e9), closes #1988, thanks @samschultzponsys
- ui: polish modal footer, quick-link removal, and empty Recent alerts (#1973) (8ff0f51)
- ui: prevent modal footer overflow and keep a viewport gutter (#1928) (a82cf5e)
- ui: tighten Stack Health row semantics and resizable pane affordances (#1972) (fc6cc62)
- ui: wrap modal titles on word boundaries (#1950) (6345e69)
- untag reviewed image names during prune (#1836) (01ffbdb), thanks @Crosis47
- whats-new: open screenshots in a zoomable lightbox (#1806) (e9901aa)
Security
- deps: bump @grpc/grpc-js to 1.14.5 (GHSA-f596-whhp-79r4, GHSA-m9gg-hp2v-232j) (e39aada)
- deps: bump brace-expansion and fast-uri to clear high-severity advisories (5c113ee)
- deps: bump ip-address to 10.7.2 in the backend (e5664b6)
- deps: clear multer CVE-2026-77037, -77063, -77078, and -82333 and harden axios (851a5fb)
- docker: patch OpenSSH and bundled Go crypto CVEs in the production image (0f61b78)