Download Latest Version v1.7.0 source code.zip (10.1 MB)
Home / v1.3.0
Name Modified Size InfoDownloads / Week
Parent folder
macSCP-1.3.0.dmg 2026-08-31 34.2 MB
README.md 2026-08-31 22.8 kB
v1.3.0 source code.tar.gz 2026-08-31 3.2 MB
v1.3.0 source code.zip 2026-08-31 3.9 MB
Totals: 4 Items   41.3 MB 0

1.3.0 (2026-08-31)

Features

  • app: ask for declared variables before a snippet runs (e5ce80d)
  • app: colour shell syntax in the snippet command field (b37d3cf)
  • app: decide what a failed connect offers (8629be1)
  • app: declare snippet variables in the editor (cfcbd83)
  • app: keep a failed connect in its tab (35d0043)
  • app: make the snippet command field multi-line (b02344f)
  • app: offer the way back after a connection is lost (6344836)
  • app: probe an idle session and notice when it dies (ea0ca27)
  • app: say why editing is the way back after an ad-hoc failure (8f92050)
  • app: send multi-line snippets by the remote's paste mode (87c3b8f)
  • app: show each tab whether its session is alive (aee6735)
  • audit: sort the log table by its columns (1dcc85c)
  • core: decide when to probe a connection and when to give up (e871fd1)
  • core: let a snippet command span lines (505bdda)
  • core: let a snippet declare its variables (6d99ae7)
  • core: plan snippet bytes from the bracketed paste mode (18e536b)
  • core: remember opted-in snippet variable values (964fe15)
  • core: resolve declared snippet variables into a command (4f11f91)
  • core: settle how long a connection may stay silent (3ab7518)
  • core: tokenize a snippet command for highlighting (0920bf5)
  • files: show a checksum on request, and where it came from (4fadc48)
  • knownhosts: sort the table by its columns (b0aa952)
  • remotefs: answer the checksum question per backend (a9b4d72)
  • remotefs: say what a checksum is and where it came from (952bb9a)
  • s3: decide what a redirect may do instead of letting Foundation decide (9e96025)
  • sessions: ask before opening a session a tab already holds (71b86c0)
  • sessions: carry nesting through export and import (8ade149)
  • sessions: decide when a session name collides (46fa46d)
  • sessions: duplicate a session by carrying references, not secrets (a693d98)
  • sessions: give groups a parent and a position (6a7a1be)
  • sessions: reorder and nest by identity, never by index (5afdfa5)
  • sessions: warn before a name replaces another session (e6d3d05)
  • settings: expose the connection's liveness options (e2f3c22)
  • sheets: chain one facet filter with the search in three sheets (dd8e892)
  • sheets: move the file actions under a three-dot menu (4ae6738)
  • sidebar: filter by a set of tags, and let the bar be switched off (4e6ee36)
  • sidebar: nest folders and drag them into order (22da6a9)
  • sidebar: remember how wide you dragged it (96305d6)
  • sidebar: search the session tree with the filter rule that exists (7052e1b)
  • snippets: describe what a dry run shows (5415176)
  • snippets: fold the editor's variable rows (bbd25c8)
  • snippets: let one snippet opt out of the placement check (259e5c6)
  • snippets: preview the resolved command in the editor (bdd9cf5)
  • snippets: say what a placeholder does, and offer the ones that fit (60dcea9)
  • snippets: show the dry run from both entrances (c07daf7)
  • ssh: compute a file's checksum on the remote (cd5cc9d)
  • tabs: ask once before closing several tabs (1e4191d)
  • tabs: give the tab a context menu (afeee8e)
  • tabs: let the menu offer both panes, not just the terminal (f4e5e9b)
  • tabs: model the tab context menu as a tested value (519c2df)
  • tabs: reorder tabs by dragging them (faa53fc)
  • tabs: reorder tabs through one rule in the view model (4ba5602)
  • tabs: show which tab a dragged tab will land on (1aad205)
  • tabs: wire the menu's pane entries to the halves they name (b31bb1e)
  • transfers: keep the queue after a connection is lost (b82c304)

Bug Fixes

  • app: correct stale Snippet.init? and sanitizer claims in SnippetsSheet (f36e2a6)
  • app: correct two stale comments in SnippetCommandEditor (11fd0b0)
  • app: detect choke points by what they are, not how they are spelled (31b8a0f)
  • app: gate the connect hand-off window and give ContentView a test seam (33a5136)
  • app: give each connect attempt an identity so a cancelled one writes nothing (7fcae40)
  • app: guard the probe's mount placement and keep liveness honest (2e86793)
  • app: guard where a dial can start, not where one happens to be called (339eb32)
  • app: harden the snippet command editor per whole-branch review (401cbc2)
  • app: keep the details text out of reflection, not just out of scope (6ffca52)
  • appkit: carry the promise completion handler in a Sendable box (487612e)
  • app: land the five whole-branch review findings for multi-line snippets (4e523f4)
  • app: let a connection attempt be cancelled (3297711)
  • app: let Close end the failed-connect surface on the last tab (2eed1bf)
  • app: let the snippet command field actually scroll sideways (627f636)
  • app: make the give-up order and probe coverage testable properties (7ec321f)
  • app: make the hand-off isolation proof unfakeable and close the abandoned connection (5702cc6)
  • app: make the snippet command field look like its neighbours (92ffc3d)
  • app: move liveness onto the tab and bound the probe's own timeout (13b23bc)
  • app: seam fillForm's managed-key passphrase lookup and fix a repeated backslash bug (19c646e)
  • app: see a dial that names no receiver, and keep the raw error off the surface (3511053)
  • app: stop the walk at a symlinked source directory and read imports properly (eb22c42)
  • app: surface a skipped variable cleanup after snippet deletion (59a9ca3)
  • build: hop to the main actor for the connect timeout read (750ccc6)
  • cli: let the older toolchain accept the parsed root command (7033626)
  • connect: bind the dial's origin to the attempt, not to the tab (a07640c)
  • core: check every placeholder occurrence for quote context (9b10236)
  • core: pin the clamping setters against the persisted file, not the getter (550a387)
  • core: stop a corrupt variables file from blocking snippet deletion (5659194)
  • core: substitute snippet placeholders in one pass over the original command (914a6cb)
  • guards: make the guarantees say what the guards do (cb624e5), closes PKCS#12
  • i18n: address the user as du on the failed-connect surface (50d065f)
  • i18n: move the lost-connection surface to du, and guard the register (12dea10)
  • itest: prune leftover drop containers by name prefix (70730a4)
  • liveness: refuse a probe's write after its own cancellation (f59cb27)
  • s3: take the dial off the process-wide URL session (36a68fe)
  • sessions: judge a name as save will receive it, not as typed (623399a)
  • sessions: report an unreadable login-set store instead of showing none (c1db9a6)
  • sessions: say what saving will actually do to the matched session (b5b74c6)
  • settings: route the keep-alive stepper through its own plan (90c093f)
  • settings: say what the keep-alive toggle does with the interval (9ec176b)
  • settings: strengthen the keep-alive stepper guard and disclosure (dc1c4e4)
  • sftp: close the read handle when the stream is abandoned (42ec1b0)
  • sheets: silence two warnings the overflow menu's key constants raised (b60ab9e)
  • sidebar: apply the row activation where a test can see it (4927ffa)
  • sidebar: connect on double-click, select on single (2e002f5)
  • sidebar: make every route to a host an input, not a callback (29c02b0)
  • sidebar: make the connect effect impossible to fire by mistake (2536fef)
  • sidebar: take the firing decision out of the caller's hands (f12bdd6)
  • snippets: ask every shell question in one unit, with bash's own rules (f3887ee)
  • snippets: classify command names against the shells a server runs (af0fd3e)
  • snippets: classify the ksh default alias that runs its argument (557a058)
  • snippets: close the quoted-context class and carry declarations through import (03c1ade)
  • snippets: export an environment variable as its own statement (f44c301)
  • snippets: invert the variable gate to positive recognition (ff006e7)
  • snippets: let bash enumerate the commands that re-parse their arguments (b4a5c3a)
  • snippets: put the command label on its field's first line (96bc17d)
  • snippets: read a redirection operator as one unit (d69ef40)
  • snippets: read shell syntax in Unicode scalars, not Characters (6b2184b)
  • snippets: refuse a function definition and a value jobs would exec (eb15397)
  • snippets: refuse a placeholder behind a redirection operator (16ccf12)
  • snippets: refuse the descriptor-variable spelling of a redirection (3652f6f)
  • snippets: refuse the placeholder's own command, not the whole template (089d9a0)
  • snippets: trigger a snippet after the popover is gone (c52a29f)
  • ssh: bound the SFTP close that never returns (7ac7f7e)
  • ssh: keep an agent's free text out of the signature-mismatch message (858b7ba)
  • ssh: pass the connect timeout Citadel already offers (857733d)
  • ssh: pin the connect timeout's provenance, not just its label (6ebc0ef)
  • ssh: render a known-hosts read failure without Foundation's table (6c77d59)
  • tabs: document both halves of openTerminal/saveAsSession preconditions (005ecf0)
  • tabs: let a running connection be saved without dialing again (8570932)
  • tabs: let the move entry carry its own direction (afb9e45)
  • tabs: make out-of-range move destinations a true no-op (c9a1a39)
  • tabs: move the bulk-close warning onto real plural forms (e6327a9)
  • teardown: bound every stage, not just the last one (eed1c8a)
  • teardown: drop the bound around cancelAll, keep the synchronous sweep (e242bd6)
  • test: make the S3 measurement's cache key unrepeatable (13ae554)
  • tests: make the guard-suite strippers fail closed on raw strings (0d3f6c4)
  • tests: stop two timing assertions from measuring the whole suite (a592c5c)
  • tests: wait for the loopback stub's record instead of racing it (a3b7daa)
  • transfers: require a stated reason before dropping the queue (7571950)
  • webdav: answer a login challenge only for the configured server (bddf66d)
  • webdav: record a trust-store write that could not remember a certificate (195dba8)
  • webdav: refuse a redirected certificate challenge and pin nothing (2c7b881), closes PKCS#12
  • webdav: report a rejected password instead of a cancelled request (4ae6567)
  • webdav: wrap every operation's foreign errors, not just the dial's (abe4b47)
  • webdav: wrap the dial's foreign errors instead of rethrowing them (0aefdd3)
Source: README.md, updated 2026-08-31