Repository navigation
Releases: cuonggt/shellhand
Release list
Shellhand 0.0.4
An empty file can be carried. A zero-byte file — a lock file, a .keep, a
log that had just been rotated — came back as "0 of 0 bytes arrived" and was
simply uncarryable, in every release up to 0.0.3. The download side could not
tell "the server said zero" from "the server would not say" and had to treat
both as a failure. It can tell now, and a size the server does give has to
match exactly, zero included.
A file session that dies no longer takes the app with it. When the ssh
process behind a transfer went away, the write that noticed it raised an error
from underneath Foundation of a kind nothing in Swift can catch — so the app
vanished instead of saying the session had ended. The message it was always
meant to show now actually arrives, whether the far end closed or simply
stopped listening.
Nothing else is visible from the outside. The suite went from 315 checks to
383, and the SFTP conversation is now held against a server written in Swift
inside the test process — one that can misbehave on purpose, answering a read
with fewer bytes than its own listing promised, or replying to a request
nobody made. A real server will not do either on request, and that is what
turned up the empty-file bug on its first run. The host-key question and a
terminal session's own bookkeeping are checked without a pty now, and a file
pane's derived values without connecting to anything.
Shellhand 0.0.3
⌘B brings the SFTP window back. It used to do nothing whenever the host
list was not the front window — including from the SFTP window itself and from
Settings, which is exactly when you would reach for it. Bringing a browser you
already have forward no longer needs the host list in front. Opening a new
one still does, because that needs the host list the window holds.
Nothing else is visible from the outside. The rest of this release is
groundwork: the rules behind the tab strip, Quick Connect's ranking, the group
tree and the host store have been lifted into places that can be checked
without driving the window, and the suite went from 254 checks to 315 — the
first of them to reach above the engine. Three cycle guards, against a group
becoming its own ancestor, had never been exercised until now.
The Release build compiles without a warning again, which is mostly worth
saying because that is where a real one would otherwise hide.
Shellhand 0.0.2
Nothing in the app has changed since 0.0.1.
This release exists to exercise updating itself. 0.0.1 shipped with the
machinery — Sparkle, a signed feed, a notarized DMG — but a first release has
nothing to update from, so none of it could be proven. 0.0.2 is the first
version an installed copy can actually find, download, verify and install, and
these notes are the first ever carried inside the feed.
If you are reading this in Shellhand's own update window, every part of it
worked.
Shellhand 0.0.1
First release.
A native macOS SSH client: the host list, tabs on real ssh, and files over
SFTP, in a window.
- The host list. Hosts filed in groups, with the user, the key and the jump
host inherited down the tree, and a detail pane that shows the exactssh
command a host will run and where each value came from. Found by tag as well
as by name — several tags at once, narrowing. - Tabs on real
ssh. Each tab is its own connection on its own pty, not a
multiplexed session. Five terminal palettes ship and the settings file can
add more; a group can set the colours for everything beneath it, so
production need not look like staging. - Files over SFTP, beside a pane for this Mac. Transfers queue a couple at
a time rather than all starting at once, and carrying a file onto one
already there asks first. - Import and export. Reads
~/.ssh/config, a CSV, or this app's own YAML,
with a dry run before it applies anything. Exports YAML meant for a dotfiles
repository — it names things rather than carrying ids, and holds no secrets.
Requires macOS 26. Universal, signed and notarized. Updates from here are
delivered in the app.
One known limitation. A host that logs in with a password only works in a
terminal tab, where ssh asks on the pty and you type it. SFTP cannot reach
such a host at all: its child process is given BatchMode=yes, and there is
nothing to answer a prompt with. Hosts that use a key are unaffected.