Back to the dev blog Engineering update

Development update, July 2026: a steadier Desk, and a smarter keyboard on the way

Three things this month: a bug-fix build of SharkTTY Desk you can download today, an honest look at what's in progress for the iPhone & iPad app (in progress — none of it has shipped yet), and a status report on an experimental terminal transport. This is the engineering account; the short user-facing notes live in What's New.

SharkTTY Desk 0.8.0 — July 10 build (available now)

This is a follow-up build to last week's 0.8.0 release, still versioned 0.8.0. Download it here.

The Stop Sharing bug

We hit this one ourselves, in daily use. Whenever your screen is being viewed, macOS puts its own indicator in the menu bar, with its own “Stop Sharing” control. Ending a session from there — rather than from inside SharkTTY — could leave Desk wedged: the QR code gone, the service claiming to be starting, and every reconnect failing until you quit and relaunched the app. Toggling remote control off and on didn't help. That's the worst kind of failure: not a crash you can report, just a service that quietly stops being one.

What was actually going on: after a session ends, the agent rebuilds its network listener so it's ready for the next connection, and the rebuild needs the same local port back. The old listener's port, though, was only released as a side effect of internal cleanup whose timing depended on how the session had ended — and on this specific path, that cleanup could lag far behind the rebuild, or never finish at all. The rebuild would try to bind, find the port still held, give up after a retry window that turned out to be shorter than the cleanup ever was, and leave the agent with no listener. From the outside: permanently “starting”.

The fix makes the handoff a contract instead of a coincidence: shutting down now explicitly releases the port and confirms the release before the rebuild is allowed to proceed, and the rebind itself is more patient and logs each attempt so a future report is diagnosable from Console. The lesson we're taking with us: teardown deserves the same determinism as startup. “The port frees itself eventually” is not a contract.

Connection key display

Three smaller fixes to how the connection key is displayed on the Mac, all display-only — nothing about how the key is generated or protected changes. A hidden key now shows a fixed-length placeholder rather than one dot per character, so the masked state no longer hints at how long your key is. Long custom keys scale to fit on a single line instead of overflowing the card (the culprit was letter-spacing that didn't shrink along with the font). And Desk now remembers that you chose to hide the key, across launches — hiding it shouldn't be a chore you repeat every morning. Revealing still asks for Touch ID or your password, as before.

Compatibility is unchanged: this build works with SharkTTY 1.6 or later on iPhone and iPad. If you're on an older app version, the SharkTTY Desk 0.5.0 build is still there for you.

SharkTTY for iPhone & iPad — in development

To be clear up front: nothing in this section has shipped. It's what already works in our development builds and is headed for the next App Store update — we'd rather tell you where things stand than stay quiet until launch.

The floating keyboard, round two

The floating keyboard is getting its second act. It grows from one layout to six — US, UK ISO, Japanese JIS, French AZERTY, German QWERTZ, and Spanish ISO — and these are real layouts, not relabeled keycaps: the European ones carry a proper AltGr third level (a terminal without | { } [ ] \ is no terminal at all), ISO boards get their extra key beside the left Shift, and the fn→F1–F12 row is mapped per layout by physical position. We wrote a test that walks every layout and proves every terminal-critical character is reachable — it caught two missing keys during development, which is exactly the kind of thing you want a test to be embarrassing about. Switching between the floating keyboard, the voice board, and the system keyboard now lives in the keyboard's own settings popover, where it should have been all along.

Above the keys sits a new candidate strip: completions drawn from what your terminal has recently printed, the words you've typed this session, and a short list of common shell commands. All of it is computed on-device from text your screen already shows — nothing leaves the device to make a suggestion. The keyboard's mic button gains press-and-hold dictation with a live preview in that same strip, and the result is only inserted when you tap it. That last part is deliberate: a terminal is an unforgiving place for misheard words, so speech never goes straight to the shell.

Voice input board

The voice input board picks up the same window manners the floating keyboard already has: move it, resize it, dial its opacity down until the shell reads through it. One set of controls, two boards, no surprises.

Remote desktop tabs that survive a disconnect

A consistency fix that was overdue: disconnecting a remote-desktop session closed its tab, while disconnecting an SSH session kept the tab with a reconnect button. Same app, two philosophies. Desk tabs now behave like SSH tabs — disconnect keeps the tab, reconnect is one tap, and closing a tab is only ever something you do on the tab itself.

Sync robustness

The least visible work this month, and maybe the most important. Your saved hosts, scripts, and settings sync between devices, and during any rollout your devices will run a mix of app versions — that's not an edge case, it's the normal state of the world for weeks at a time. We've reworked the sync format handling so that data written by a newer version passes through an older version untouched: the older app keeps what it doesn't understand and writes it back verbatim, instead of choking on it or quietly flattening it into the shape it knows. The rule we now hold ourselves to is simple: an old app must never be able to destroy what a newer app wrote. You'll never see this feature — which is the point.

Experimental: Eternal Terminal transport

SharkTTY speaks SSH and Mosh. Mosh is what makes a terminal survive a train tunnel — but it runs over UDP, and some networks simply won't pass UDP. Eternal Terminal solves the same problem over plain TCP, and plenty of people already run etserver on their machines. Our position is simple: if you already run a server that solves this, you shouldn't need our infrastructure to benefit from it — the app should just speak your server's language.

So we built a client for the open ET protocol from scratch in Rust, and it now completes the full journey against a real etserver: connect, type, drop the link mid-stream, reconnect, and lose nothing. It sits behind an experimental flag while it earns real-world mileage; once it has, it'll appear as a third per-host transport next to SSH and Mosh. If you run etserver today and want to help kick the tires when the flag opens up, watch this blog.

Questions or bug reports for anything above? The feedback board is the fastest way to reach us.