Repository navigation
Latch v3.1.0
Both apps now keep themselves current, the Mac says why a PC is slow and
asks the stream for what the path can carry, and the clipboard follows
you across.
Updates
- The Mac checks GitHub about every six hours and twenty seconds after it
starts (Settings has the switch and Check now). A newer app is
downloaded, checked against the SHA-256 GitHub publishes and against its
own code signature, moved over/Applications/Latch.apponce no
stream is running, and relaunched. - The Mac sends the new
brolink-host.exeto every PC whose Latch Host
reports an older version, over the same Tailscale-authenticated control
API that can put the PC to sleep (POST /v1/update). The host verifies
the digest, that the bytes are a Windows executable and a newer version,
swaps the file in beside itself and restarts; a running stream is not
interrupted. A PC that is asleep gets it the next time the Mac sees it. - A PC still on 3.0 has no update route. PC → Update Latch Host… in
the stream toolbar installs 3.1 through the stream: the Mac serves the
executable on its own Tailscale address to that PC only, presses Win+R,
types one PowerShell line and presses Enter; the script checks the
SHA-256 baked into it, swaps the file and starts the new service. The
PC's desktop has to be unlocked.
Path and quality
- Each PC shows Direct · 38 ms or Relayed via Tokyo · 210 ms.
Both apps runtailscale netcheck; when a PC is relayed, the lobby says
which router is in the way and what would fix it (UPnP or NAT-PMP on
the PC's router, a forwarded UDP port, or IPv6 on both ends). - Auto quality, the default, picks resolution, frame rate and bitrate
from the path right before connecting: 1080p/30/4 Mbps through a relay,
1080p/60/8 across a long round trip, 1440p/60/15 nearby, 1440p/60/30 on
a LAN. The toolbar's Quality menu switches between Auto, Smooth,
Balanced and Sharp with a reconnect, and a dropped session offers Try
again at Smooth. - The decoder takes frames straight from the receive thread and accepts
HEVC reference-frame invalidation, so a lost packet costs a repair frame
rather than a keyframe. An explicit HEVC choice no longer falls back to
H.264. Stats show packet loss, path and quality. - Latch Host reads which encoder Sunshine settled on from its log; the
lobby and the host window warn when it is software encoding.
Clipboard
- Latch Host serves
/v1/clipboard(text only, up to 32 KB). While
streaming, text copied on the PC is in the Mac's clipboard within a
second, and ⌘V on the PC first sends the Mac's text across, then
presses Ctrl+V there. Notices under the toolbar say when something
crossed.
Keyboard and mouse
- A chord no longer releases a modifier the user is still holding, so ⌘C
then ⌘V in one ⌘ hold both work. - The keys macOS keeps for itself and what ⌘ does on the PC live in one
Keys menu; the mouse mode is a menu that explains each choice.
Staying reachable
- Latch Host starts with Windows by default and sets that again at every
service start unless the owner turned it off. It holds the PC awake
while plugged in (a new setting, on by default; setup also zeroes the AC
sleep timers). The Mac's offer to sleep the PC after a session is off by
default. - PCs are remembered with their Tailscale address and when they were last
seen, so they stay listed while Tailscale on the Mac is down, and every
machine whose Tailscale node key is due to expire gets a warning.
Sound
- The Mac plays at the output device's own rate, channel count and sample
format (48 kHz stereo f32 that the DAC refused was silence, with the
reason only in the log). A short pre-roll avoids a click on the first
packet; stats and a toast say where sound goes, or why it does not. - Latch Host reads Sunshine's log for a failed audio capture (no
speakers, a missing sink). The lobby and the host window say so, with
how to add a virtual device.
Fixes
- Launched from Finder or the Dock, the Mac app reported "Tailscale is
needed" with Tailscale running: the CLI inside Tailscale.app only answers
whenSHLVLis set. - The Mac bundle has an icon.
- The Mac no longer POSTs the executable at a host older than 3.1 (which
showed as a broken pipe); socket timeouts and closed connections read as
such everywhere, and a push is retried on a transient error. - The host's POST routes accept only JSON or an executable, so a web page
open in a browser on the PC or on the Mac cannot sleep the PC, stop the
service or replace its clipboard through a cross-origin form post. - The Smooth preset (4 Mbps) survives a restart; the saved bitrate used to
be raised to 5 Mbps on load. - A downloaded app that fails its signature or version check is discarded
and fetched again at the next check instead of failing the same way
every fifteen minutes. - Ctrl+Alt no longer toggles mouse capture every frame while the chord is
held. - VideoToolbox recreates its session after sleep/wake or a GPU reset
instead of staying on a black picture until reconnect. - An old Latch Host window no longer kills a just-updated service in a
loop; it relaunches itself from the new exe. - Setup scripts are UTF-8 with a BOM, so a Korean Windows username or
adapter name is not mangled, and the Sunshine installer path is quoted
for msiexec. - Holding a key repeats on the PC; a cancelled connect is not shown as an
error; Sunshine's certificate changing (a reinstall) pairs again instead
of asking the user to edit a file.