Fretwire 0.2.0
The second beta. Most of it is about reaching a remote from a Mac that is not
the one the app was built on: running the git you installed rather than the
one Apple ships, ssh remotes and the host keys they need, and failures that say
which failure they are. Plus a crash on a wedged pipe, the tabs you had open at
quit, and repository badges that use more than one letter.
New
- Your git, and your PATH — a Mac app inherits launchd's environment, not the login shell's, so every command ran as
/usr/bin/gitwith almost no PATH under it. The app now reads the login shell's PATH once per launch and runs the firstgiton it — or one named in Settings ▸ Git, else Apple's shim — which brings gh's credential helper, gpg for signed commits and acore.sshCommandalong with it. Settings ▸ Git shows which git was chosen, its version, where it came from, and the whole search path. - SSH remotes — clone and publish over ssh rather than https. Both sheets show which transport they will write, preselected from whether this Mac has a key to offer and changeable in place, and
Change URL…moves a remote that already exists. An ssh remote pushes with no token in its environment at all. - Host keys — a host this Mac had never spoken to failed with "Host key verification failed" and nothing to do about it, since ssh can only ask that question on a terminal. The failure card now offers to look:
ssh-keyscan's fingerprints beside a link to the list the host publishes, andknown_hostsappended to only once you say they match. A key that changed gets no such button, only thessh-keygen -Rcommand to copy — that is either a rekeyed server or someone in the middle, and the app cannot tell which. - A silent ssh agent is named as one — a push that went nowhere looked exactly like a slow one, and the timeout blamed the network. An operation that involves ssh and is still running after eight seconds asks the agent whether it answers at all; if it does not, the app says so, with a Stop and the command to see it for yourself.
- Pushing a branch that has no upstream — creates it on the remote and records the upstream with it, so the toolbar's ahead/behind works and the next plain push lands. A one-off push to another remote publishes the branch there without quietly redirecting where it pulls from.
- The tabs from last time — the repositories open at quit, and which one was in front, come back at launch. A restored tab is not a visit: it does not reshuffle the recents order, and a path that has since moved or been deleted is dropped instead of opening as an error tab.
- Badges that tell repositories apart (#2) — the icon rail took the first letter of a name, so project-a, project-b and project-c all read "P". A badge now abbreviates the whole name, a letter from each of the first two words (project-a → PA, MyApp → MA). Where no rule can separate two names, it can be set by hand — letters and a colour, kept per repository, ahead of any icon found on disk.
- Install with Homebrew (#1) —
brew install --cask olegklimakov/fretwire/fretwire. Updates still arrive through the app.
Fixed
- A wedged pipe no longer takes the app with it — when something held a child's output pipe open past the child itself — a lingering
git-remote-https, an ssh ControlPersist master — the waiting thread was reclaimed by closing the descriptor under a read still in flight, andFileHandleanswers that with an Objective-C exception no Swiftcatchcan intercept. Output is read through DispatchIO now, where giving up on the rest is an ordinary cancel. - Remote failures say which failure they are — having no credentials at all was reported as "the remote rejected these credentials", which was both untrue and a dead end. Missing credentials, rejected credentials, a refused key, an unknown or changed host key and an unreachable host are now told apart, each naming the host git named, and a missing-credentials card offers to connect an account for it.
- The detail column stays where it was put — opening a file from the commit-detail list re-divided the window, and the column collected a little more width with every file until it stood at its maximum.
- "Use Default Icon" is offered to VoiceOver — the badge's context menu reaches VoiceOver as named actions, and the reset was missing from that list, so a custom badge could only be undone by reopening the sheet.
Requirements
- macOS 14 or later.
- A
git— whichever comes first on your login shell's PATH, else Apple's. With none installed at all, the Welcome screen says so once, with the command that fixes it.
Not here yet
- An interactive rebase editor. One commit at a time can be reworded, squashed or dropped; reordering a range still belongs in the terminal.
- A command palette.
During the beta
Free, for any use. Licensing starts at 1.0: free for personal projects, paid per seat for commercial use — see the EULA.
The app updates itself — each update is checked against a signature before it is applied. Settings ▸ Updates decides how much of that happens on its own. Bug reports and requests go to the issue tracker.