Download Latest Version v1.7.0 source code.zip (10.1 MB)
Home / v1.2.0
Name Modified Size InfoDownloads / Week
Parent folder
macSCP-1.2.0.dmg 2026-08-19 31.9 MB
README.md 2026-08-19 65.5 kB
v1.2.0 source code.tar.gz 2026-08-19 2.3 MB
v1.2.0 source code.zip 2026-08-19 2.8 MB
Totals: 4 Items   37.0 MB 0

1.2.0 (2026-08-19)

Features

  • add a default expiry setting for share links (d8111ec)
  • add a host key policy for non-interactive callers (b0584ff)
  • add a jump host block to the connection form (b637e9d)
  • add a menu-bar status item for connections and transfers (dc97036)
  • add a read-only keyboard shortcuts overview in Settings (c446a7b)
  • add a second test server and prove remote-to-remote streaming (8c08420)
  • add a shared search field and wire it into the login sets sheet (49c0e22)
  • add a silent remote refresh and its settings (94de967)
  • add a staged secret resolver (ff15233)
  • add a streaming download path to the S3 transport (e93c6cf)
  • add a thin S3 file system (connect + list) with a MinIO rig (6fcc32a)
  • add an AWS SigV4 request signer over swift-crypto (c9172bc)
  • add an edit/delete context menu to login set rows (1a9729d)
  • add an in-app language switcher with a relaunch button (a0a2eee)
  • add an SSH Keys settings tab to generate and manage keys (c27bdd6)
  • add an ssh-agent protocol client (360011c)
  • add AppLanguage and the persisted selectedLanguage setting (971d5c1)
  • add ConnectionKind, typed ConnectionConfig and S3 session fields (7cb8a20)
  • add cross-session targets to the context-menu model (2aae2e2)
  • add French catalogs and generalize the localization guard (b910704)
  • add get and put CLI commands with an explicit conflict rule (68d60a6)
  • add login merge planning and set lifecycle to the session view model (0c06212)
  • add login sets with store, session reference and resolver (fca2571)
  • add Polish catalogs and extend the localization guard (cc14202)
  • add recursive deleteTree to the file-system protocol (b630570)
  • add rename and setPermissions to the file-system protocol (e60c4be)
  • add reusable login sets with form picker and merge suggestions (34d576f)
  • add rm and mkdir to the CLI (5f5759c)
  • add S3 connection fields and kind branching to the form view model (2e0f598)
  • add search to the known-hosts, hidden-imports and audit sheets (5344f57)
  • add SigV4 presigned query signing (c72084a)
  • add terminal appearance settings and remote home resolution (83725b5)
  • add the declarative field vocabulary (73f81e8)
  • add the file-list search bar (b983d05)
  • add the macscp-logins export format (7b5be99)
  • add the per-session audit log store (a603f02)
  • add the protocol capability framework and backend descriptors (a2ab1bc)
  • add the shared import conflict machinery (b62f43d)
  • add the shared import conflict sheet (865344a)
  • add the tab strip with activity indicators and tab commands (a6f587e)
  • add the versioned session export codec (8890a24)
  • add the window-scoped tabs state machine (7d9965a)
  • add TOFU validation and storage for server certificates (2b431ad)
  • add TransferSourceGuard to reject directory transfer sources (d69abde)
  • add typed backend field IDs and FieldValues (30c439a)
  • allow an optional keychain access group and migrate into it (8ae178b)
  • allow redirecting the storage directory via an environment variable (8008bba)
  • app: export the visible snippets to a file (5ff5359)
  • app: filter the sidebar by host tag (7f6ce16)
  • app: flatten the terminal snippet picker (a1e3b68)
  • app: give both export footers one scope and a count (33903ae)
  • app: give the terminal panel a header with a snippet picker (eac1f8b)
  • app: give the terminal the inset the rest of the panel already uses (b59a5ba)
  • app: import snippets through the shared conflict sheet (2aeadfc)
  • apply permissions across a directory tree (e695b20)
  • apply permissions recursively from the info sheet (161126e)
  • app: manage terminal snippets in their own sheet (9eea675)
  • app: offer Export in the snippet row context menu (5be730a)
  • app: offer insert and execute for every snippet in the Terminal menu (4bff742)
  • app: offer insert, run and cancel in one window (be5c08d)
  • app: offer the leftover-credential cleanup in settings (848dcd5)
  • app: open a terminal straight from a host's context menu (fab2f42)
  • app: project the snippet model into a flat list (be0f19d)
  • app: reach snippets by right-clicking the terminal (e71f369)
  • app: reach snippets from a session's context menu (2c8b238)
  • app: record snippet executions in the session log (82b1b94)
  • app: say when imported logins arrived without a password (4428d45)
  • app: switch both window halves from the toolbar (f787ef8)
  • app: tag a saved connection from its form (55d0cb3)
  • app: tag snippets in the editor and filter the list by tag (3332810)
  • app: trigger snippets from the Terminal menu (a91a1bc)
  • authenticate through the local ssh-agent (e5f10d3)
  • auto-refresh the active remote pane on an interval (8b72601)
  • auto-resolve a managed key's passphrase at connect (183ec5c)
  • browser action layer, posix permissions model, mock dir rename (5127415)
  • build an ssh command line for external terminals (164d565)
  • carry agent auth through sessions, login sets and export (3084595)
  • carry cross-backend display metadata on transfer items (6d5cc8f)
  • carry owner/group and model selectable columns (f57acea)
  • check for updates from the settings window (a6962cc)
  • check GitHub for a newer release (071131e)
  • complete and navigate to typed paths (e68a8f4)
  • connect S3 sessions with login-set credentials (8254720)
  • connect through a jump host with per-hop TOFU (40f4552)
  • context menu in both panes with transfer, open, copy path (583bd8d)
  • core: add the declarative field validator (279c48b)
  • core: add the descriptor write adapter (d528dc1)
  • core: ask the schema whether a login set holds what it needs (aa6ce82)
  • core: carry session tags through export and import (8493365)
  • core: collect every submit refusal instead of the first (10a2763)
  • core: decide pane visibility and which toggle is locked (1e55f41)
  • core: decide what the sidebar shows while a tag is active (8ed4254)
  • core: declare field format and failure message in the schema (26e33ae)
  • core: declare what a secret field means for login identity (6465c1e)
  • core: define one export scope rule for list footers (61abaee)
  • core: derive a config copy without plaintext secrets (7606f21)
  • core: derive the snippet menu structure in one tested place (7940237)
  • core: describe a snippet execution for the audit log (4f9c040)
  • core: encode a snippet's keystrokes, terminator included (7c79be4)
  • core: export every backend field as one schema-keyed bag (000864d)
  • core: expose the legacy file's jump secret ids for the M27 sweep (f19185d)
  • core: give snippets an exchange format without a crypto path (c6123a2)
  • core: give snippets tags and drop the runs-immediately flag (e0a4dcf)
  • core: give unsaved connections a fixed audit session id (ea1338e)
  • core: let a saved session carry tags (82d419f)
  • core: let the caller decide whether a snippet executes (d2f0191)
  • core: let the descriptor say whether a session carries a secret (d823408)
  • core: move SSH's fields into their own stored block (20bddbd)
  • core: name the ways a submit can be refused, and resolve the target set (71aaa9c)
  • core: plan a snippet import on the shared conflict arbiter (94438b2)
  • core: reap the jump secrets the M23 migration orphaned (b60c50e)
  • core: remember which window halves a saved session shows (8ad3d38)
  • core: resolve the jump's login set and session before a submit (69f3218)
  • core: store reusable terminal snippets (7ac648d)
  • core: suggest existing tags case-insensitively (47f6edb)
  • create an empty file from the browser (883f9a8)
  • create and edit S3 login sets in the editor (b039403)
  • cycle through path completion candidates with Tab (05a85d9)
  • delete S3 trees with batched DeleteObjects (242f6e8)
  • dispatch connections by kind through a generalized connector (b246d9d)
  • drive the file browser from the keyboard (9d87e6a)
  • embed and materialize managed keys for login set transport (6f30167)
  • explain the menu bar icon and the banner dismiss on hover (4575368)
  • explain the tab close and rule remove icons on hover (03b7e7d)
  • export and import login sets from the app (27594b7)
  • export and import stored sessions from the sidebar (46160e7)
  • expose a recursive permissions action with audit and progress (912656c)
  • generate presigned S3 URLs via a provider seam (3924d65)
  • generate SSH keys via ssh-keygen into an app directory (5ec4a6a)
  • give the CLI subcommands and session-based ls (6cb9bcd)
  • give the descriptor its schemas, factory and CLI axes (2e9136d)
  • give the view model login-set export and import (edaff0c)
  • hidden-files toggle with settings tab and shortcut (2997150)
  • hide imported hosts and manage them in a sheet (122c704)
  • hoist bandwidth buckets into an app-global limiter (766230d)
  • implement S3 delete and create-directory (marker object) (6b56707)
  • inspect an existing OpenSSH key for import (43a787a)
  • label the transfer-target submenu with backend badge (92eb2aa)
  • let a backend decide per values whether it needs a secret (d4fd2f7)
  • list, date and remove known host keys (d9e3f85)
  • make the pane path bar interactive (61975d6)
  • make the terminal appearance configurable and start in the remote home (3d09e84)
  • manage known host keys from a dedicated sheet (e9f4fa1)
  • manage SSH keys in a dedicated sheet with import and export (25aa87a)
  • mark symlinks in the file list and follow them on double-click (61ecd50)
  • move CLIExitCode into Core and add CLIErrorMapping (7e84291)
  • move the window session state into per-tab objects (2153a47)
  • multi-select in both file panes (e34ac1d)
  • never append-resume to a non-appendable destination (04ce6b7)
  • offer a manual and a daily update check (54636a0)
  • offer agent auth in the connection form and login sets (a85d645)
  • offer login-set mode in the S3 connection form (ecea6a2)
  • open the session in an external terminal (6ba0115)
  • pay both bandwidth buckets on cross-remote transfers (d5bada9)
  • persist managed SSH key metadata in a secret-free store (f9b44c0)
  • persist, resolve and export jump host configurations (093c9be)
  • pick a managed SSH key in the connection form and login sets (7fad4f8)
  • pick a saved connection as the jump host in the form (0f43f1f)
  • plan and apply session imports with duplicate detection (997dd75)
  • plan login set imports with conflict resolution (2b46edc)
  • plan transfers with an explicit conflict rule (9fe2319)
  • prompt for unknown certificates and for plaintext credentials (1e021f9)
  • re-land the menu-bar status item on AppKit NSStatusItem (45f3f0f)
  • record transfers and file actions into the audit log (715ab9a)
  • reference a saved connection as the jump host (7c5c4eb)
  • remember which imported hosts are hidden (c5e43eb)
  • rename S3 objects and prefixes via copy-and-delete (833217c)
  • rename, new-folder, info-permissions and delete dialogs (6d7d776)
  • render connection forms from the schema (ab96013)
  • reorganize settings into a sidebar with protocol sections (6028fda)
  • resolve browser keyboard commands against the menu model (7f1603f)
  • resolve every login set through one code path (d13e6de)
  • resolve S3 login-set credentials (53ee521)
  • resolve session import duplicates through the shared arbiter (7780de7)
  • resolve session references like prod:/var/www (72fb7c6)
  • restore jump references when their connection is deleted (29b5fcb)
  • roll up transfer activity and add the menu-bar toggle (d47af22)
  • s3: declare S3 through the field schema (e2553d0)
  • schema-driven connection form, type badge and capability gating (b2ca0c0)
  • search the current directory listing (6a21ca4)
  • settings: gather the management overlays in a Manage Data section (3b01c8d)
  • settings: install the command-line tool from a CLI section (46b63a1)
  • share-link context action, sheet and settings (aa035b3)
  • show a per-session audit log from the sidebar (36a4bab)
  • show selectable file-list columns (ba812d7)
  • show target backend and resume warning in the transfer bar (79d2bf6)
  • sort the file list by clicking column headers (550096e)
  • sort the file listing by name, size or date (7864d2c)
  • ssh: declare SSH through the field schema (ac07fd8)
  • ssh: split the SSH credential secret into password and passphrase (0071c24)
  • stream S3 object downloads with a range GET (1b61f6b)
  • surface backend file actions in the browser context menu (df0a74a)
  • toggle the transfer bar via a toolbar icon, menu and ⌘⇧Y (f0df1ae)
  • transfer selections to other session tabs from the context menu (c707165)
  • type login sets and session export by connection kind (f940d34)
  • upload large S3 objects via multipart with abort-on-failure (2c722f1)
  • upload small S3 objects with a single signed PUT (1d70c73)
  • webdav: add the connection config and the read path (5cfcc70)
  • webdav: add the connection form section and localization (0d6c47e)
  • webdav: add the write path (fcc7145)
  • webdav: add WebDAVURL path arithmetic (0ede6e0)
  • webdav: answer auth, server trust and body streams in one delegate (5e9631d)
  • webdav: declare WebDAV through the field schema (03137cc)
  • webdav: parse multistatus PROPFIND responses (b1afae0)
  • webdav: register the backend across the M12 seams (fd71638)

Bug Fixes

  • accept trailing ls -l markers in LongnameParser (e6fc353)
  • allow saving sessions with an unchanged manual jump password (f624139)
  • answer only the conflict prompt whose sheet was dismissed (f376f48)
  • app: close the snippet review's empty-state hole and doc drift (100907b)
  • app: correct two overclaiming test comments and a blind assertion (93e521f)
  • app: disable the Terminal menu entry when the pane lock refuses it (812585f)
  • app: drop the dead runsImmediately Section and pin the tag-field highlight clamp (900461f)
  • app: give the export confirmation its own label (c21dc60)
  • app: give the two export counts real plural forms (3f7de94)
  • app: keep no plaintext secret in the password hint (2525fba)
  • app: log connections that were never saved (a987f43)
  • app: make the pane render read the same repaired visibility (60e8f3d)
  • app: pin the row context menu and clear the stale hover line (3cd5946)
  • app: point tabIDs' doc comment at the file that now holds the onChange call (0be43e6)
  • app: redact once in requestExternalTerminal for both branches (ecb64a0)
  • app: refuse a jump login set that is not an SSH set before filling (d231dc8)
  • app: register the snippets export type in the packaged Info.plist (5bad8aa)
  • app: remember the terminal a snippet opened, and correct what the docs claim (7cf49c0)
  • app: resolve the edit-mode secret through the schema, not a ternary (91f1d75)
  • app: resolve the string catalog under swift test and guard it (afbf722)
  • app: restore the pane-visibility fold and pin its wiring (4979ae6)
  • app: reuse SnippetTagField for host tags instead of a plain text field (7545218)
  • app: route the jump login-mode picker through its switcher (68ed119)
  • app: say when the snippet store cannot be read, and mark what executes (f9247da)
  • app: scope the files-half flag to the session that hid it (2a678b3)
  • app: stop localizing the snippets export filename (6c5226f)
  • app: stop the delete dialog claiming a non-SSH bastion is restored (1fdd55a)
  • app: tell an unreadable key store apart from an empty one (0780393)
  • app: tighten the sidebar filter guard and fold the tag-row scaffold (2357080)
  • app: unify the terminal panel's inset on the spec's decided 14/8 (0a2eeb5)
  • bound --password-command with a timeout so a broken helper can't hang (edf2901)
  • carry the public key in EmbeddedKey instead of re-deriving it (ccb174c)
  • clamp resizeWindow's target frame to the visible area (3985067)
  • clean up orphaned key artifacts and surface delete errors (657863c)
  • clear the tab attention indicator on menu-bar activation (daef8da)
  • close the reentrancy gap in ImportConflictArbiter.resolve (b49371a)
  • connect with the persisted session after saving a new login set (4913994)
  • core: a session with no recorded preference opens no terminal (eacf2e1)
  • core: abort the merge on an unreadable secret instead of deleting (9e1c894)
  • core: abort the sweep on an unreadable store with no candidates (07f71f8)
  • core: carry from the session slot when the key probe cannot answer (4e3d883)
  • core: clear the jump's set-filled credentials on a login-mode switch (f113833)
  • core: clear the S3 secret slot in clearPassword too (cd6c202)
  • core: close the review's fourth-backend gap and tidy its tests (678ebbc)
  • core: correct false claims in the M27 blockless-SSH fix's review (9c5f521)
  • core: correct three more comment inaccuracies from the M24/M25 sweep (2fde51a)
  • core: decode both legacy sessions.json shapes in legacyJumpSecretIDs (d60eb8f)
  • core: demand the jump's secret when it leaves its login set (4113fac)
  • core: demand the secret when a session leaves its login set (0baae3f)
  • core: derive the merge key from the credential schema (3a12484)
  • core: do not restore a jump from a non-SSH bastion (5a25a79)
  • core: drop a nameless snippet on import instead of storing a blank row (c5ee2ea)
  • core: drop a session's own secret once its login set holds it (3e44a35)
  • core: drop an SSH record with no stored block when loading (5071ddc)
  • core: enforce PaneVisibility invariant at construction, not just decode (d5e80e6)
  • core: extend applyMerge's guard to hasStoredConfiguration (6f0f306)
  • core: fail key writes toward a visible prompt, not a hidden orphan (2336dd3)
  • core: find the string catalog next to the test bundle (c11a055)
  • core: fold imported hosts into sidebar emptiness, tighten pins (8c84e02)
  • core: guard the bind, not the two call sites that reach it (79f6a50)
  • core: guard the WebDAV secret fetch on a blockless session (d89c1b0)
  • core: hide empty groups only while a tag filter is active (a6a446b)
  • core: hold terminal keystrokes sent while the shell is opening (fef5888)
  • core: keep a protocol switch from stranding a session (a0eb037)
  • core: keep a session's secret when its merge write fails (ae9d7c2)
  • core: keep a snippet's place and drop a dead shell's send chain (eef4526)
  • core: keep an audit log a bad entry cannot erase (f5c7059)
  • core: keep everything intact when deleteLoginSet cannot read a secret (364df5c)
  • core: keep the bastion secret when the jump's set holds none (305e877)
  • core: keep the bastion slot when the jump's set is not an SSH set (bfb4c05)
  • core: let a malformed pane visibility fall back instead of failing the store (2a49687)
  • core: make ImportConflict.reason mandatory, drop the dead fallback (5f5bc20)
  • core: make the import conflict sheet name the actual collision (b05d5ec)
  • core: make the migration's jump drop deliberate and survivable (53916cb)
  • core: measure the doc comment claim instead of guessing it (38cbbbe)
  • core: merge into a login set of the candidate's own protocol (2669637)
  • core: never drop the jump when its config is rejected (8dfdc0d)
  • core: one rule for a whitespace secret in both validators (9ab2d16)
  • core: pin managedKeyID/tiebreaker, credit the right mixed-group guard (a65d9be)
  • core: redact lastConnectedConfig's secrets at assignment (938ef44)
  • core: refuse a jump bound to a login set that is not an SSH set (8c211a7)
  • core: refuse a merge whose members hold different secrets (2d19f45)
  • core: refuse a non-SSH session as a jump host (de8854f)
  • core: reject blockless SSH records at import instead of counting them (5913037)
  • core: reject every newline character in a snippet command (2db5eb5)
  • core: report snippet delivery instead of assuming it (f3c8708)
  • core: resolve the carry source by the same match that binds the session (c062595)
  • core: restore the blockless-S3 secret guard and pin v1 import drift (59c14f3)
  • core: retire the dead duplicateKey reader and narrow SSH accessors (e4ea419)
  • core: stop an empty member slot from winning the merge carry (de6b87c)
  • core: stop edit-save from duplicating a managed key's passphrase (bdf6f01)
  • core: tell the truth about what .sameConnection's existing names (abcb4d9)
  • correct symlink comment, drop dead guard clause, test list() through a symlink (af098e6)
  • correct the MinIO rig image tag and use collision-safe host ports (90c0713)
  • count a replaced login set once and keep agent sets secret-free (fbe08e5)
  • defer the agent event-loop shutdown past Citadel's open timer (4e50033)
  • degrade the unwired transfer-to-session menu arm gracefully (3c80da8)
  • derive an imported key's identity from its material, not the file (fb0a69d)
  • derive the imported key fingerprint from its public key (2c73a3f)
  • dismiss the browser name sheet without waiting for the listing (2097cf4)
  • distinguish no-matches from genuinely empty login-sets list (ad24de3)
  • emit null for an unknown size in ls --json output (c1e4d0f)
  • ensure TrustedCertificateStore creates directory before writing (fc1052a)
  • expand the keychain entitlements placeholder at sign time (6a28a0d)
  • export the S3 secret from the bound login set, not the session slot (0c2cf2d)
  • follow symlinked directories, honor real casing at equal length (e69ebe5)
  • gate octal Apply on 3-4 digits and make menu switches exhaustive (569fdf3)
  • give PlannedSession a replace seam and correct import summary bugs (47ae9c8)
  • give the candidates list a definite height (9bc4f7c)
  • guard load() against a stale detached refresh overwriting a newer directory (7974318)
  • harden agent auth loop, isolate its event loop and prove the multi-key paths (387dd9b)
  • harden deleteTree against trailing-slash symlink arguments (8c28996)
  • harden HiddenImportStore per review findings (eca347e)
  • harden path completion/navigation against final M11g review findings (5e2d935)
  • harden pre-existing key dirs to 0700 and reject empty fingerprints (e928811)
  • harden S3 rename against transient precheck and silent copy failures (863b7a9)
  • harden the agent client and refuse dangling target login sets (0710cf6)
  • harden the path bar against the review's C1/C2 findings (816a9f6)
  • hold the connect button through the async handoff (dfe19ea)
  • keep an unusable carried public key line inside PorterError (b5e71c6)
  • keep connects from shrinking the window and give tabs view identity (a6b9e06)
  • keep cross-session transfers off the resume path (d147ed5)
  • keep jump-search consistent when a navigation fails (416d554)
  • keep navigate's rollback from stranding the pane at .loading (f4a2ebf)
  • keep pruned selections fresh and key the refresh loop on the session (b685bd0)
  • keep session-mode jumps free of login-set and stale reference state (258a553)
  • keep the empty-state claim honest after a load error (9578e3e)
  • keep the octal field stable while typing and gate Apply on validity (5e1240d)
  • keep the target host and username usable (1b2e361)
  • keep the update request minimal and always answer a manual check (e818c50)
  • label every backend with its own summary (3595355)
  • let the outcome, not the payload, pick an imported key's check (f600420)
  • log transfer destinations and stop audit writes from blocking (1b42157)
  • make tab commands key-window aware and the attention counter monotonic (17b3829)
  • make the import conflict bridge's safety nets prompt-scoped (4fe1c44)
  • make the import conflict sheet's button path prompt-scoped (1902326)
  • make the transfer conflict sheet's dismissal and button paths prompt-scoped (b290b29)
  • map RemoteFSError.authenticationFailed to a real browse-time message (dea18f7)
  • map S3 download connect failures to connectionFailed (df8bd56)
  • name embed's missing/unreadable key file instead of throwing a Cocoa error (1bbc379)
  • name materialize's store failure instead of leaking the store path (9b87d3f)
  • name the store file when the hidden-imports list is unreadable (8a14cd8)
  • namespace BackendFieldID keys explicitly instead of deriving from the type (cd6fdcb)
  • navigate a symlink double-click directly instead of via the path bar (62ba369)
  • never bind two incoming login sets to the same existing id (3f01df8)
  • never carry a stale jump block into another session's connect (dcdfd69)
  • never drop credentials when creating or merging login sets (ebd36bb)
  • never follow a top-level symlink in the remote deleteTree (fa22e34)
  • never keep or transfer a secret for agent login sets (7cba11b)
  • never store a jump secret for a session-referencing jump (3e08071)
  • never truncate a file whose existence createFile cannot verify (08e2b2b)
  • persist the S3 secret on edit-save and lock the type in edit mode (2b2d7a9)
  • preserve multi-row selection across table re-renders (0b95372)
  • prevent stale Tab-completion candidates and other PathBar nits (3371f70)
  • probe the Keychain instead of trusting a key's hasPassphrase flag (fad0e01)
  • re-read siblings after the stream drain in MockRemoteFileSystem.write (6b795e3)
  • reconcile the table selection independently of the reload guard (5b9a3e5)
  • redact secret values from ResolvedSecret descriptions (36c3440)
  • refuse a recursive rm of a session root without --allow-root-delete (a002c31)
  • reject a managed key fileName that is not a single path component (49ffa98)
  • reject an empty destination directory in TransferPlan (7acce44)
  • reject hostile iteration counts and stop creating unreferenced groups (648d7d0)
  • reject shell-unsafe hosts and repair the german catalog (f649798)
  • release private key bytes and harden keyDirectory on import (77d2f48)
  • release: read the signing authority at the verbosity that prints it (428198d)
  • repair the settings forms and the editor rule picker (01a2dca)
  • report a tampered managed key fileName instead of skipping the key (2dc3c49)
  • report an unverifiable rename destination probe as an error (15aa5b0)
  • report hidden-imports store failures and tighten review nits (e8e0509)
  • report only actually written sessions from applyImport (b70583c)
  • report trimmed names in the login set import summary (5af01ff)
  • require the OpenSSH private-key header before case 3 accepts a file (a500306)
  • reset the attention indicator only on real activations (1e3f52c)
  • restore --help output on the CLI root command (45f28d5)
  • restore the SSH port to displaySummary for non-default ports (3d2613d)
  • route the auth-kind picker through selectAuthChoice again (6375f22)
  • scope performKeyEquivalent to the focused pane's table (4497c9f)
  • scope the login export to the sets the list is showing (46e9f15)
  • scrub the retained connect config and honour the custom terminal app (e7768ea)
  • sessions: carry WebDAV config through session export/import (236c052)
  • sessions: key import duplicates per backend, not by the SSH triple (6784253)
  • settings: gate the routed entries on the window existing, not being visible (dbff6d9)
  • settings: refuse to install the CLI from a translocated app copy (9b99b57)
  • settings: route certificates to the main window and disable dead entries (e63ba57)
  • sftp: keep stat of root at a single-slash path (8e59ac7)
  • show every imported host when the hidden list is unreadable (f710d10)
  • sign the exact S3 list query that goes on the wire (caf3569)
  • sign the raw S3 key path so folder markers don't 403 (13ee668)
  • split mainContent so the type checker can solve it (e2fe87c)
  • stop a hostile host or jump value from steering ssh (f03d7a1)
  • stop a vanished WebDAV reader from outranking the real transport error (e76f27b)
  • stop an unreadable keychain from leaving a stale secret bound (ec46543)
  • stop cancel() misfiring after a cycle has effectively ended (f21524c)
  • stop create and rename from waiting on a listing refresh (cd176f3)
  • stop duplicating managed-key passphrase under session/set secrets (3037897)
  • stop the CLI from trusting unknown host keys automatically (9f33b4c)
  • stop the keychain migration from destroying saved secrets (5cc88c7)
  • store an imported key passphrase in exactly one slot (ec01a21)
  • strip repeated trailing slashes in the local deleteTree (c246af7)
  • surface known-host removal failures instead of swallowing them (e6dcf18)
  • test: remove dishonest multi-line snippet test and fix doc comments (8d56f9f)
  • tests: assert on secret-source labels, never on the sources (dcfe4e2)
  • universal release binary, hardened release workflow, README fixes (ee6c55a)
  • use typographic quotes in the cross-session audit detail (c2c415c)
  • verify an encrypted key against its own cleartext public part (b9ec45f)
  • webdav: distinguish a corrupt trust store from a user refusal (0bd63d7)
  • webdav: gate propstat properties by status regardless of document order (5a62fe7)
  • webdav: make the streaming PUT cancellable and event-driven (2256421)
  • webdav: raise connect timeout, drop the wrong Issuer row, cover four paths (28e5421)
  • webdav: retry stat() on a first-attempt 404 and fix a case-where warning (d6879d1)
  • webdav: save/reconnect a WebDAV session with its real kind and config (9dc5b00)
  • widen the permissions column so rwxrwxrwx fits (02566e1)
  • wire the keychain access group into every production call site (33a139f)

Performance Improvements

  • core: compute a bastion's login only when something references it (f037551)
  • look up local owner and group only when asked (0b5ca53)

Reverts

  • remove the M11n menu-bar item (SwiftUI layout-storm regression) (201c6e0)
Source: README.md, updated 2026-08-19