SharkTTY 1.6 went out on June 27, alongside SharkTTY Desk 0.6.0 for the Mac. It is the release where remote desktop stopped meaning one screen. Most of the work, though, is underneath: a connection that gives up in the right places, retries in the right places, and tells you which of the two happened.
Every screen, not just one
Until 1.6, connecting to a Mac with three monitors gave you one of them. You could pick which, and that was the whole story. It made a multi-display Mac feel smaller from a phone than it is in person, and the part of your desktop you needed was reliably on the display you were not looking at.
1.6 sends all of them. The aggregated view lays the displays out together, and tapping or dragging on any one of them takes control of that screen — the pointer goes where your finger goes, on whichever display it lands. Each display streams on demand rather than all at once, which is the only reason a three-monitor Mac is usable over a phone's connection at all.
The same release let you edit a saved desktop and grab its share link without leaving the session, so setting up access for a second device no longer meant disconnecting first.
Reconnects that actually reconnect
A remote desktop that drops on a lift ride is not a remote desktop. The connection path in 1.6 was rebuilt around a simple order of preference: try a direct peer-to-peer path first, because it is faster and involves nobody else, and fall back to a relay only when the direct path does not come up. Peer-to-peer first is scheduling, not a preference toggle — the app races the paths and takes what answers.
Retrying is where these things usually go wrong, in one of two directions. Retry everything and a wrong credential turns into an infinite loop that looks like a network problem. Retry nothing and a two-second cellular hiccup ends your session. So 1.6 splits the cases: an authentication rejection stops the fallback walk immediately, because trying the next path with the same wrong key will fail the same way, while a transport failure backs off with jitter and keeps trying. The jitter matters more than it sounds — without it, every client that dropped at the same moment comes back at the same moment.
On top of that: the app now notices when the network returns and recovers instead of waiting out the rest of its backoff, the WebSocket path got a keepalive so idle sessions stop being reaped by middleboxes, and the accept loop stopped dropping connections that arrived while it was busy with the previous one.
Short links, and connecting without copying anything
A pairing string is a long line of text with a host, a port, a certificate fingerprint and a token in it. It is fine to scan and miserable to send someone. 1.6 added short links for both the standalone relay and the managed one: the app resolves the link, receives a token back, and connects with it — no fingerprint to compare by eye, nothing to paste.
Small related fix, in the category of things that should never have needed saying: the QR scanner now ignores codes that are not a desk pairing string or a short link, instead of trying to make a connection out of a Wi-Fi QR code someone left on a poster.
Encryption on the relay path
The WebSocket relay frames are encrypted in 1.6, and the managed relay issues tickets rather than accepting anything that turns up in the right room. Both are steps in the same direction: the relay's job is to forward bytes between two ends that have already agreed with each other, and the less it can do with those bytes, the better. If you would rather not trust anyone's relay at all, the standalone one is open source and you can run it yourself.
Versions that negotiate instead of guess
The app and the Mac agent now exchange a protocol version and a set of capability bits before doing anything else. This is unglamorous and pays for itself the first time an old app meets a new agent: instead of a connection that half-works and then fails somewhere confusing, the app knows exactly what the other end can do, and an app that is too old gets a clear prompt to update. Everything since has leaned on those capability bits — the audio codec negotiation in 1.8 is the same mechanism.
Connection-code authentication landed here too, with throttling and an allowlist on the Mac side, so a code that leaks cannot be brute-forced quietly.
Six languages, finished
The interface was localized in all six supported languages in this release rather than most of them. Terminal apps accumulate a lot of short strings, and the last twenty percent of them are the ones nobody sees until something goes wrong — which is exactly when reading an error in your own language matters.
And the small ones
- Terminal safe-area margins, so text no longer runs under the rounded corners and the home indicator.
- Per-host keyboard memory: the keyboard you were using with a host is the keyboard you get back.
- An xHD quality ceiling for the remote desktop, for when you have the bandwidth and want the pixels.
- The SSH port is typed rather than stepped, which anyone who has ever tapped up to 2222 will appreciate.
Every feature in 1.6 is free. The only in-app purchases are optional tips, and they unlock nothing.
Read this post in: English · 中文 · 日本語 · Español · Français · 한국어 · Українська
More on the app itself in the SharkTTY guide, the short user-facing notes in What's New, and the fastest way to reach us is the feedback board. Back to the dev blog.