Ghostty
Terminal
The terminal you actually live in, already up when you sit down.
com.mitchellh.ghostty row 1 · col 101 · Local-network remote for your Mac
Six fixed tiles on your iPhone launch or foreground the apps you live in. One tap, one request, straight across your own Wi-Fi — no cloud, no accounts, no remote screen to stare at.
companion ready · _vatsaremote._tcp · port 3040
Connected to
One deliberate layout. No editor, no custom list.
Approve once on the Mac. Credential stays in the Keychain.
Bonjour on your network. Nothing leaves the house.
iOS 17+ · macOS 14+. No Electron, no Node, no daemon.
02 · The tap path
Leagot does not paste commands, drive your keyboard or poke at windows. It asks macOS to bring one allowlisted application forward, then waits to see it happen before it answers the phone.
The phone sends an AppId. Never a path, a command or a keystroke.
One authenticated request to the Mac found over Bonjour.
A per-phone token, compared in constant time. Revoked means gone.
The AppId resolves to one of six compiled bundle identifiers.
It reports back only after the app is observed frontmost.
03 · The fixed catalogue
The phone never names an application. It sends one of six identifiers, and the Mac resolves it against a compiled allowlist of bundle IDs read from the real installs — never guessed from a product name.
Terminal
The terminal you actually live in, already up when you sit down.
com.mitchellh.ghostty row 1 · col 1Editor
Straight back to the file you were mid-thought inside.
com.todesktop.230313mzl4w4u92 row 1 · col 2Browser
The browser back on screen the second the link matters.
company.thebrowser.dia row 2 · col 1Editor
Cold start or warm window — one tap and it is frontmost.
dev.zed.Zed row 2 · col 2Notes
Your vault, front and centre before the thought evaporates.
md.obsidian row 3 · col 1Messages
Up and readable when the message is the reason you looked.
net.whatsapp.WhatsApp row 3 · col 204 · Why it is this small
A remote that can do anything needs a manual. Leagot does one thing on purpose: it puts the app you were thinking about in front of you before you reach the keyboard.
The Mac is awake and three rooms away. The app you want is not the app that is up.
Command-tab, Mission Control, six Ghostty windows and the one you meant is behind Slack.
By the time the right window is front, the reason you came over has gone quiet.
Launched, activated, or already frontmost — and it tells you which.
05 · Setup, once
There is nothing to sign up for, because there is no one to sign up with. Pairing is a conversation between two devices on the same network, approved by the person holding both.
The Mac app lives in the menu bar. Choose Pair a Phone… and a window opens with a fresh session secret behind a QR code.
The phone submits a pairing request. Nothing is trusted until you approve it on the Mac itself — there is no endpoint that can approve for you.
A per-phone token, 32 random bytes, stored on both ends. Revoke a phone from the Mac and it stops working on the next request.
Your phone finds your Mac over Bonjour and talks to it directly. That is the entire diagram — there is no service to go down, no region to pick, and no account to delete later.
07 · The boundary
The interesting question about a phone that can touch your Mac is not what it does — it is what it is structurally unable to do. Here is the whole line, on both sides.
08 · Where it goes
Pair once by QR, approve on the Mac, then use it like a purpose-built launcher that lives on your own Wi-Fi.
Pinned TLS between phone and Mac, a disposable pairing token separate from the issued credential, and credential writes that cannot lose a working pairing.
The boundary is the product. A tile list you can edit, a shell, or a cloud relay would each make Leagot something worth being careful about.
09 · Take it home
Grab the latest Mac companion from the download page and build the phone app from source. If a tile misbehaves on your machine, the bundle IDs and the activation path are both in the open — an issue with the outcome string is enough to go on.
iOS 17+ · macOS 14+ · built natively in Swift · no Node in the app