Changelog¶
Release notes for each published version of Cleat, newest first. This page regenerates from GitHub Releases on every docs build.
v0.30 — 2026-10-12¶
S3-compatible object storage — the whole of epic #472, 14 sub-issues: buckets open in a tab next to your terminals and SFTP sessions, from the same connection list.
Object storage¶
Cleat browses any S3-compatible store: AWS S3, Linode, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, MinIO and anything else that speaks the protocol. It is included for everyone.
- Connections — New Connection → S3 Object Storage in the Connections sidebar, with provider presets and a Test Connection button. Saved connections sit in the same list as your SSH ones, with the same groups and tab colours, and in the command palette. The secret key goes to the operating system's credential store, never the database.
- Browsing — buckets, then folders. Sort, multi-select with shift and ctrl, a path box you can type into, Properties, Copy URL and Copy Key. A large folder loads as you scroll, and nothing waits on the network: every request runs off the UI thread and can be cancelled.
- Transfers — upload and download files or whole folders, through the same Transfers panel and status-bar segment SFTP uses. Large files go up in parts, and a cancelled upload cleans up after itself on the store.
- Preview — text and images open in the viewer. A zip, tar, tar.gz or gz shows a listing of what is inside without downloading the whole archive.
- Delete, New Folder, rename — delete files or whole folders, with any key the store refused listed by name. Renaming a file asks before it replaces anything and works above 5 GB.
- Empty Bucket — behind a type-the-name confirmation. On a versioned bucket it removes old versions and delete markers too, so the bucket really is empty afterwards.
- Tabs come back — an object-storage tab reopens after a restart in the bucket and folder it was showing.
Self-hosted stores¶
A store behind a private certificate authority can be given its own CA bundle, per connection. Certificate verification can be turned off for a test instance, and an http:// endpoint is allowed and marked not encrypted in the connection list.
A key that can only see one bucket works too: set Default bucket and the tab opens inside it, without asking for the list of buckets.
Coming from lolrus¶
Import → lolrus Connections in the Connections sidebar lists the connections lolrus saved, and reads their keys from the system credential store for the ones you tick. Connections already in Cleat are marked Duplicate and left unticked. Nothing of lolrus's is changed or removed.
Settings and limits¶
Under Settings → Object Storage: the largest file the text viewer and the image preview will open, the listing page size, and the upload part size (5 to 128 MB, default 16).
Not in this release: folder rename, presigned URLs, temporary session tokens, creating or deleting buckets, drag-and-drop, and object storage in a split pane. A folder shows up to 200,000 entries.
What reaches the log¶
Requests are logged as an operation, a bucket and a key. Headers, query strings, access keys and secret keys are never logged, and the diagnostics bundle redacts AWS-format key IDs and any labelled key or signature value as a second line of defence.
Fixes¶
- Plugin status-bar segments were not drawn in the current shell. They are back, and a segment disappears when its plugin returns nothing for it.
- A crash when a plugin was disabled or removed while it was running, fixed by keeping the plugin alive until its tick finishes.
- The update banner's restart button now reads Restart Cleat Now.
Install¶
macOS .dmg, Windows .exe / .zip, Linux .deb / .rpm / .AppImage below. Built and tested on all three platforms.
v0.29 — 2026-08-31¶
Docker Swarm monitoring and control — the whole of epic #353, 28 sub-issues, plus the fixes a full pass over its test guide turned up.
Docker Swarm¶
Cleat monitors a Swarm over SSH through the connection profiles you already have, and can change one when you let it.
- Dashboard — services, nodes, tasks, events, alerts and an audit trail, with sparklines and resizable columns. Double-click a row for the full record, with a copy button on any error.
- Clusters — defined in the app rather than by hand. Several candidate managers per cluster, drag-ordered, so monitoring survives the manager it was watching through.
- Alerting — rules with conditions, targets and dwell times; delivery by toast, OS notification, sound or webhook, and a local command on the machine Cleat is running on.
- Control — scale, force redeploy, roll back, drain, pause, promote and demote. Every one behind a confirmation that shows the exact command, and behind a per-cluster opt-in that is off until you turn it on.
- Handoff — a shell on a node, a shell inside a container, or a service's logs tailed in a terminal tab, from the dashboard.
Read-only is per cluster¶
Previously a single application-wide switch, which could not express the ordinary case: a production cluster managed by CI/CD that must never be touched from here, alongside a local one that exists to be poked at.
On upgrade, every cluster is closed. Control is re-enabled per cluster in View → Swarm → Clusters…. That is deliberate rather than tidy: the old global switch defaulted to on, so a cluster could carry an enabled flag and still be read-only in practice, and inheriting those flags would have handed live control to clusters whose owners were relying on the switch to hold them shut.
Fixes worth calling out¶
Several of these were features that looked finished and were not.
- Startup commands never ran.
startupCmdwas stored, editable, and sent nowhere — so a connection's startup command did nothing, and multi-execute was quietly running nothing on password-authenticated connections. - Tasks read as down on a zsh manager. The task poll depended on the shell word-splitting an unquoted variable, which zsh does not do. Every service showed 0/N against a healthy cluster, silently.
- Two use-after-free crashes, in the tab and plugin lifetimes, both reproduced deterministically under AddressSanitizer and clean after.
- A crash report can now be copied to the clipboard from the report dialog.
Elsewhere¶
- Every Swarm screen is reachable from View → Swarm, rather than only by knowing what to type in the command palette.
- Context menus carry icons; per-row actions are icons with tooltips rather than text buttons.
- Modals keep their scroll position across a rebuild, and text fields no longer lose focus while you type in them.
Install¶
macOS .dmg, Windows .exe / .zip, Linux .deb / .rpm / .AppImage below. Built and tested on all three platforms.
v0.28 — 2026-08-12¶
- feat(#260): preview images and non-text files in the SFTP viewer
- feat(#385): multiple SFTP tabs, retire the File Transfer side pane
- feat(#386): transfers panel, close-confirm, SFTP picker + docs
- fix(#395): one shared password prompt; terminal connections can save again
- fix(#394): tab strips clip and scroll instead of overflowing
- refactor(#387): per-leaf remount for split-tree leaves
- feat(#387): SFTP as a split-pane leaf
- fix(#401): make an SFTP split pane focusable and closable
-
fix(#403): repoint crash uploads to cleat.tools and add the v2 identity block
-
chore: ignore build-bundle/ and .idea/codeStyles/
- refactor(#382): extract SftpSession from SftpView (+ per-session temp dir)
- refactor(#383): app-wide TransferQueue with lazy workers + per-job connection chains
- refactor(#384): ITabContent abstraction + generalized Tab model
- refactor(#387): IPaneContent — polymorphic split-tree leaves
- fix(tests): give the TransferQueue cap test a Windows-sized budget
v0.27 — 2026-07-30¶
-
fix: macOS in-app update — bundle detection + DMG support
-
ci(release): make universal-OpenSSL step idempotent on self-hosted runners
v0.26 — 2026-07-29¶
- feat(#329): power instrumentation — frame/wakeup counters + Power Stats overlay by @zimventures
- feat(#330): SSH transport wakeup-fd poll + keepalive-derived timeout by @zimventures
- feat(#331): plugin scheduler — deadline CV wait instead of fixed 500ms tick by @zimventures
- feat(#332): throttle occluded / hidden / unfocused windows by @zimventures
- feat(#333): coalesced background→main-thread wake events by @zimventures
- feat(#334): consume Spry animations-active query (spry#58) by @zimventures
- feat(#335): event-driven render loop by @zimventures
- feat(#336): power settings — fps cap, reduce animations, background throttle by @zimventures
- feat(#337): battery-aware adaptive profile via SDL_GetPowerInfo by @zimventures
-
docs(#338): re-baseline power usage + document results by @zimventures
-
feat(#329): power instrumentation — frame/wakeup counters + Power Stats overlay
- feat(#330): SSH transport wakeup-fd poll + keepalive-derived timeout
- feat(#331): plugin scheduler — deadline CV wait instead of fixed 500ms tick
- feat(#332): throttle occluded / hidden / unfocused windows
- feat(#333): coalesced background→main-thread wake events
- feat(#334): consume Spry animations-active query (spry#58)
- feat(#335): event-driven render loop
- feat(#336): power settings — fps cap, reduce animations, background throttle
- feat(#337): battery-aware adaptive profile via SDL_GetPowerInfo
- docs(#338): re-baseline power usage + document results
v0.25 — 2026-07-20¶
UI Overhaul¶
This build is a complete overhaul of the UI. We moved off of the (still awesome!) Dear Im GUI to a custom retained mode library: spry. Spry is maintained by yours truly. I'll be using it in all Zimventures tools going forward.
- docs: point install flow at cleat.tools signup
- Spry: custom UI toolkit + first in-app integration (epic #205)
- Spry: input, focus & keyboard nav + accessibility hooks
- Spry: text input / editing widget
- Spry: widget set I — core controls + overlays
- Spry: widget set II — data/container widgets
- Spry: migration harness — host the toolkit behind IView
- Spry: port the terminal renderer onto the toolkit backend
- Spry: retarget the plugin WidgetDesc renderer to the toolkit
- Spry: migrate CreditsView onto the toolkit
- Spry: bridge text input into hosted views (#220 harness)
- Spry: modal-mode hosting in SpryHost; Credits back to a modal
- Spry: add a Combo (dropdown) widget
- Spry: add a colour picker widget
- Spry: migrate SettingsView onto the toolkit (staged)
- Spry: Settings follow-up — screensaver preview + per-saver settings + licensing
- Spry: migrate the Connections sidebar onto the toolkit (staged)
- Spry: migrate QuickConnectView onto the toolkit
- Spry: migrate the Tunnels sidebar onto the toolkit (staged)
- Spry: migrate the SSH Keys sidebar onto the toolkit (staged)
- Spry: unified sidebar with a TabBar — retire dock tabs + interim switcher
- Spry: migrate import dialogs to a shared preview modal
- Spry: migrate the SFTP file browser onto the toolkit (staged)
- Spry: migrate the ConnectionEditor onto the toolkit
- Spry: multi-line TextArea + restore multi-line Notes
- Spry: migrate the TunnelEditor onto the toolkit
- Spry: migrate the CommandPalette onto the toolkit
- Spry: migrate the KeybindingsView onto the toolkit
- Spry: migrate the license modals onto the toolkit
- Spry: migrate ActivityLogView + CrashReportView onto the toolkit
- Spry: migrate the SFTP operation modals onto the toolkit
- SFTP password authentication (saved + prompt + retry)
- Spry: migrate the SSH Keys form modals onto the toolkit
- Spry: migrate the update banner + check dialog onto the toolkit
- Spry: migrate notification toasts + tooltip tour onto the toolkit
- Spry: migrate the PuTTY/MobaXterm PPK passphrase prompts
- Spry: migrate the FirstRunWizard onto the toolkit
- Spry: migrate PluginManagerView onto the toolkit — shell + both tabs
- Spry: port the Plugin Manager confirm dialogs to overlays
- Spry: port the authoring/install dialogs — PluginManagerView fully off ImGui
- Native menu bar — macOS NSMenu + Win32 HMENU
- feat(#219): render gauge + heatmap via the Spry widget backend
- feat(#219): make Spry the default plugin widget renderer
- feat(#222): full-window Spry overlay layer for floating chrome
- feat(#222): route PaneStatusBar tooltips through the Spry overlay layer
- feat(#222): interactive Spry popover mode + migrate TunnelPopover
- feat(#222): Spry context menu — tab menu + Views dropdown
- feat(#222): migrate the plugin export dialog to a Spry modal
- feat(#222): shell migration plan + SplitLayout widget (A1)
- feat(#222): present the Spry overlay directly, off the ImGui bridge (A2)
- feat(#222): headless UI test harness (dev-only)
- feat(#222): Spry app shell behind CLEAT_SHELL=spry (Phase B1)
- feat(#222): mount the real Sidebar into the Spry shell (Phase B1)
- feat(#222): mount the Activity Log into the Spry shell (Phase B2)
- feat(#222): mount the terminal tab bar into the Spry shell (Phase B3a)
- feat(#222): render the focused terminal in the Spry shell (Phase B3b)
- feat(#222): terminal input in the Spry shell — keyboard/text/wheel (Phase B3c)
- feat(#222): Spry password prompt modal (password auth in shell mode)
- feat(#222): render the split-pane tree in the Spry shell (B3d)
- feat(#222): bottom status bar in the Spry shell (B4)
- feat(#222): composite the remaining modal overlays in shell mode
- feat(#222): render the screensaver as a Spry surface in shell mode (B4)
- feat(#222): terminal text selection + Copy/Paste menu + copy toast
- feat(#222): Ctrl/Cmd-click to open a URL in the shell terminal
- feat(#222): reach the SFTP File Transfer window in shell mode
- feat(#222): shell tooltips — sidebar connections + per-segment status bar
- test(#278): fix stale MobaXterm non-Windows test
- feat(#246): follow SSH config Include directives
- fix(#278): restore spdlog default logger after ActivityLog test shutdown
- feat(#222): native shell hosting for command palette + Settings (Phase C)
- feat(#222): native shell hosting for the Connections modals, wizard & celebration (Phase C)
- feat(#301): SFTP as a native integrated shell pane (Phase C)
- feat(#222): host Tunnel editor + Keys form modals natively (Phase C)
- feat(#222): native shell versions of the TabManager confirm modals (Phase C)
- feat(#222): native shell versions of the app-level confirm modals (Phase C)
- feat(#222): C1 input cutover — single SDL input path, delete ImGui DockSpace
- refactor(#222): C2 — retire the SpryHost ImGui FBO bridge
- refactor(#222): C2b — delete orphaned ImGui rendering (wrappers, TabManager, dev mirrors) + fix reactive modals
- refactor(#222): C3 (part 1) — delete the dead #219 ImGui plugin widget renderers
- fix: full-screen apps (top/vim/less) restore correctly on exit
- feat(#310): measure terminal cell metrics via FreeType, not the ImGui font atlas
- refactor(#311): remove ImGui rendering — backend, context, and live calls
- refactor(#312): migrate ImGui types off headers and unlink imgui — closes #222
- docs: correct stale ImGui references to the Spry toolkit
- docs(#207): ADR for Spry's public API + minimal "hello toolkit" example
- fix(#318): unbreak Windows build — replace POSIX setenv in main.cpp
- docs(#223): Spry getting-started tutorial + examples index
- docs(#224): make Spry extraction-ready — license/attribution, CONTRIBUTING, CI, split tooling
- feat(#320): add spry/sdl_host.h — SDL event pump + clipboard/IME wiring
- feat(#321): formalize the theme-token vocabulary in spry/theme_tokens.h
- build(#224): consume Spry as an external dependency; remove libs/spry
v0.24 — 2026-06-11¶
-
fix(windows): bundle OpenSSL DLL matching linked soname
-
fix(windows): bundle OpenSSL DLL matching linked soname + self-hosted runner
v0.23 — 2026-06-07¶
- bug fix ssh: respect explicit authMethod + fix stuck reconnectReady flag
-
ui: remove the 9-slice demo menu item + window
-
ssh: respect explicit authMethod + fix stuck reconnectReady flag
v0.22 — 2026-06-07¶
-
license: fixing a bug where activation not catching license validation failures.
-
license: plumb signing key into CI + gate activation success on engine acceptance
v0.21 — 2026-06-07¶
-
ci: macOS codesign identity
-
ci: fix macOS codesign identity + ignore signing material
v0.20 — 2026-06-05¶
- ui: replace Changelog modal with Credits modal
- terminal: dynamic per-pane font sizing
- build: fix Apple clang 21 build break and clean warnings (72 -> 0)
- fix: crash reporter aborts startup on non-UTF8 log bytes
- ssh: implement SSH agent auth via libssh2_agent (Phase 1)
- ui: auto-focus terminal when a new tab is opened
- ssh: agent socket auto-detection + identity cache (Phase 2)
- editor: Connection Editor agent picker + identity dropdown (Phase 3)
- keys: KeysView Agents section with Copy + Deploy (Phase 4)
- wizard: SSH-agent discoverability surface
- ssh-agent: error UX, diagnostics scrubbing, pipe validation
- licensing: foundation — fingerprint, key parser, token storage
- licensing: transport + Ed25519 verify + endpoint clients
- licensing: state machine + local validation + refresh loop
- licensing: activation UI + seat-limit dialog + Settings + wizard step
- licensing: trial mode — 14-day file + keychain backed
- licensing: grace banner + must-upgrade modal + log scrub
- license: animated checkmark + confetti burst on activation
v0.19 — 2026-05-22¶
v0.19¶
This release was focused on wrapping up the plugin architecture, screensavers, a new port forwarding feature, and online documentation.
Plugins¶
Plugins are now hosted on GitHub (https://github.com/zimventures/cleat-plugins/) and include both UI plugins as well as a fun addition - screensavers! Plugins are quite flexible in how they're installed, deployed, updated, and applicable. I still owe a detailed API reference for what's available in Lua, but the cleat-plugins repo should serve as a good example for the time being.
Screensavers¶
Screensavers are just a different plugin type. You can write Lua and have your own plugin. Have fun with this!
Port Forwarding¶
Port forwarding is a handy feature for piping network traffic between a remote host and the local environment. In addition to setting up reusable port forwarding (on a per-connection basis), there is also a port browser to allow users to see which ports are open on the remote host for tunneling.
Online Docs¶
Online documentation was plumbed into the build framework and is available at now available at: https://zimventures.github.io/cleat/
- Plugin host API: cleat:notify() — toast notifications by
- StoreAPI: install methods via metatable __index, warn on collision
- Plugin: cleat_min_version + api_version compat gates by
- Plugin install-from-URL with capability-scan preview
- Plugin update checking for URL-installed plugins
- Plugin marketplace browse + install
- Drop stock-plugin code path; first-run install + source.json
- Port Forwarding Phase 1: Local forward (-L) foundation
- Port forwarding Phase 2: remote (-R) and dynamic (-D) forwards
- Port forwarding Phase 3: detail popover, auto-start, profile editor, status bar by
- Port discovery in the New Tunnel dialog (closes #117)
- Screensaver Phase A: engine + cell grid render pipeline
- Screensaver Phase B: Lua + term: API + Aquarium
- Screensaver Phase C-1: utility globals + 5 stocks + UI polish
- Screensaver marketplace integration
- Screensaver update checking + Installed-tab section
- Settings modal: category sidebar + search + rese
- Modal Escape-dismiss helper, applied across all popups
- Screensaver cleanup: sandbox caps, per-screensaver settings, live preview
- Docs: public site at docs.cleat.zimventures.com
- docs: post-launch cleanup of public docs site
-
docs: auto-generate changelog page from GitHub Releases
-
Plugin host API: cleat:notify() — toast notifications
- Plugin: cleat_min_version + api_version compat gates
- Port forwarding Phase 3: detail popover, auto-start, profile editor, status bar
- Screensaver marketplace integration (closes #127)
- Screensaver update checking + Installed-tab section (closes #130)
- Settings modal: category sidebar + search + reset (closes #126)
- Modal Escape-dismiss helper, applied across all popups (closes #131)
- Screensaver cleanup: sandbox caps, per-screensaver settings, live preview (issue #48)
- docs: auto-generate changelog page from GitHub Releases (closes #142)
- tests: fix Windows test failures from v0.19 release run
v0.18 — 2026-05-08¶
This release adds some bug fixes and lays the foundation for more robust plugins - including additional stock plugins
- Fix Windows Add/Remove Programs version stuck after upgrade
- Plugin: rich status bar tooltips
- Propagate stock plugin updates to unmodified user copies
- Plugin: log monitoring
- Plugin: tabular monitoring
- Plugin: statusbar-network + dual-surface render() upgrades
- Plugin: per-connection plugin overrides
- Plugin: extended Host API — read_file / stat / env
- Plugin: ssh:stream() persistent log-following channel
- Plugin Manager: authoring workflow (Edit/Duplicate/Open Folder, Creator wizard, .zip Import)
- Plugin resilience: exponential backoff, success-rate UI, graceful pool degradation
- Plugin: data export (CSV/JSON) from view panel
- Plugin: network-traffic stock plugin
- Plugin widget: ctx:heatmap()
- Plugin host API: ssh:meta() — connection metadata
-
Plugin host API: cleat.kv — cross-plugin shared key-value store
-
Phase D slice 1: log monitoring
- Phase D slice 2: tabular monitoring
- Phase D slice 6: statusbar-network + dual-surface render() upgrades
- Phase D slice 5: per-connection plugin overrides
- Phase D slice 3: extended Host API — read_file / stat / env
- ssh:stream() persistent log-following channel
- Fix Windows release build: ASCII test name in heatmap defaults case
v0.1.17 — 2026-03-09¶
- Fix terminal pane focus border rendering in inactive views
- Implement Plugin System: Phase A — Lua engine, SSH exec, stock plugin
v0.1.16 — 2026-02-27¶
- Activity log improvements, layout reset, and Windows self-update fixes
- Fix Windows self-update failing due to missing admin privileges
-
Add VPN status monitoring and per-connection enforcement
-
Fix MSVC test build: winsock.h/winsock2.h conflict in test_main.cpp
v0.1.15 — 2026-02-26¶
- Activity log improvements, layout reset, and Windows self-update fixes
- Fix Windows self-update failing due to missing admin privileges
- Add VPN status monitoring and per-connection enforcement
v0.1.14 — 2026-02-25¶
Overview¶
- End-user testing feedback and some miscellaneous cleanup.
Features¶
- Add SFTP-only menu option and rename Connect to SSH
- Add terminal copy/paste context menu and mouse operation support
Code Cleanup¶
- Add linting infrastructure with exemption list and CI enforcement
- New CI/CD build system options
Fixes¶
- Fix Quick Connect UX, password auth, and clipboard shortcuts
v0.1.13 — 2026-02-24¶
Overview¶
End-user testing feedback and some miscellaneous cleanup.
Features¶
- Add SFTP-only menu option and rename Connect to SSH
- Add terminal copy/paste context menu and mouse operation support
Code Cleanup¶
- Add linting infrastructure with exemption list and CI enforcement
Fixes¶
- Fix Quick Connect UX, password auth, and clipboard shortcuts
v0.1.12 — 2026-02-23¶
Overview¶
A weekend of updates. Hat-tip to wmarauder for the feature request on password-based auth. Neglected to implement that in the first version.
Features¶
- Add password-based SSH authentication with encrypted credential storage
- Add configurable focus border highlight for active pane
- Option to hide cursor in unfocused terminal panes
Fixes¶
- Fix console window opening alongside GUI on Windows
- Fix update banner showing too much info
- Fix connection cursor color not updating existing sessions
- Fix text selection bleeding across panes and drifting on resize
- Fix selection updates during divider drag
v0.1.9 — 2026-02-20¶
- Fix release notes using git tags to find previous version
v0.1.8 — 2026-02-20¶
- Add license agreement to CPack installers
- Add in-app changelog viewer and auto-populate release notes
v0.1.7 — 2026-02-20¶
- Add CLion run configs for local release packaging
v0.1.6 — 2026-02-19¶
- Bundle OpenSSL DLLs in Windows installer
v0.1.4 — 2026-02-19¶
- Make update manifest URL configurable
v0.1.3 — 2026-02-19¶
Maintenance release.
v0.1.2 — 2026-02-18¶
Maintenance release.
v0.1.1 — 2026-02-18¶
- Fix macOS and Windows release build failures
v0.1.0 — 2026-02-18¶
- Switch libssh2 to OpenSSL backend, add PPK converter, and Windows har…
- Auto-detect Homebrew OpenSSL on macOS
- Remove Licensing and setup Continual Deployment
v0.0.1 — 2026-02-16¶
Maintenance release.