| Name | Modified | Size | Downloads / 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)