Add Engine.send_file(name, mime, data) and MessageHandler.on_file. Files stream over each open RTC data channel as binary frames — M<json meta> · C<16-byte id><16KB chunk>… · E<id> — and reassemble on the receiver in arrival order (the channel is reliable+ordered). The data channel now distinguishes string (clipboard) from binary (file) messages. Files are direct-only — never relayed, matching prefer-direct. Transport trait gains start(...files) + a default-noop send_file (only RTC implements it). The agent saves received files to ~/Downloads; the apps stub on_file (receive UI is a follow-up). All MessageHandler impls updated. Proven by examples/file_demo.rs: A sends a 50KB blob (4 chunks), B reassembles it to identical bytes over RTC. Follow-ups: file transfer over LAN (same-network without RTC); attach/preview UI; progress + size cap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tether-agent
Headless clipboard sync daemon on the shared tethercore engine (SSE + RTC +
LAN, prefer-direct E2E). One Rust binary for macOS / Linux / Windows.
tether-agent # run in the foreground (Ctrl-C to stop)
tether-agent install # run on login as a background service
tether-agent uninstall # remove the service
tether-agent status # service status
# config (applies to run + install; account derives the shared room):
tether-agent install --account you@example.com --name "Patrick's NAS"
- macOS: a launchd LaunchAgent at
~/Library/LaunchAgents/io.pecord.tether-agent.plist(logs →~/Library/Logs/tether-agent.log). - Linux: a systemd user unit at
~/.config/systemd/user/tether-agent.service(loginctl enable-lingerto start at boot without login). - Defaults:
--server https://tether.pecord.io, account-derived room, hostname as name.