A persistent remote-shell console: real PTY shells on your server, streamed to your phone over WebSocket. Shells keep running when you disconnect — and survive server restarts.
Every link below always resolves to the newest release — no need to hunt through the release file list.
| What | Platform | Get the latest |
|---|---|---|
| Server | Linux / macOS | curl -fsSL https://samlo.cloud/tether/install.sh | sh (auto-detects OS/arch) |
| Server binary | Linux x64 | tether-linux-x64 |
| Server binary | Linux arm64 | tether-linux-arm64 |
| Server binary | macOS Apple Silicon | tether-darwin-arm64.tar.gz |
| Server binary | macOS Intel | tether-darwin-x64.tar.gz |
| Mobile | iOS | TestFlight beta (auto-updates) |
| Desktop | Linux / Windows / macOS | see Desktop app below |
Each …/releases/latest/download/<file> link is a permanent, one-click pointer to that file in whatever the current release is — safe to bookmark or share. (Desktop installers are versioned by the Tauri bundler, so they're picked per-file from the release page instead.)
Linux / macOS:
curl -fsSL https://samlo.cloud/tether/install.sh | sh
tether start
tether pairThe installer detects your OS/arch and downloads a single self-contained binary (no bun, git, or node_modules needed) from the latest release into ~/.local/bin/tether. If tether isn't found afterward, add ~/.local/bin to your PATH (the installer prints the exact line, and the commands it prints use the full path meanwhile).
tether serve | start | stop | restart | status | logs | present | pair | signal | devices | device | update | version- Update later:
tether updatedownloads the newest release binary and restarts. - macOS binaries are unsigned — the first run may need:
xattr -d com.apple.quarantine ~/.local/bin/tether. - Data (sessions + device registry) lives in
~/.tether/config/tether.db; override withTETHER_DB_PATH. - Environment:
TETHER_PORT(default 8085),TETHER_TLS(both|only|off),TETHER_TLS_PORT(default 8443),TETHER_DB_PATH,TETHER_REPO_SLUG.
Security: access is per-device. Pair with
tether pair; clients mint a short-lived bearer over Noise. The server serves TLS on:8443from a self-signed certificate clients pin on first pairing, alongside the plaintext:8085older clients use. The certificate is self-signed and CORS is open, so still run tether behind a tunnel (Tailscale / WireGuard / SSH) or keep it LAN-only.
- Persistent sessions — each shell runs in a detached holder process. Client disconnects, server restarts, even
tether restartupgrades: the shell (and whatever runs in it) keeps going. - Replay — every byte is logged to SQLite; reconnecting clients catch up from where they left off, with no output lost while the server was down.
- Mobile client — multi-session tabs grouped by host, full VT emulator (TUIs, box drawing, CJK/emoji), D-pad, search, snippets, git/files/previews.
- Desktop client — the same terminal as a native Linux/Windows/macOS app (docked sidebar, split view, physical keyboard, mouse selection, self-update).
- Agent previews — Codex CLI or Claude Code can run
tether present ./preview/index.html --project <name>to open a watched HTML/CSS/JS preview on desktop or iOS. Install the optional agent skills withtether present agent-install; declare session state withtether signal; clear previews withtether present reset [project-name].
Install TestFlight from the App Store, then open the public beta link on your iPhone:
https://testflight.apple.com/join/j7rPkfhq
New builds arrive automatically; each is testable for 90 days. No Mac, no AltServer, and nothing to re-sign every week.
Native push notifications — the ones that arrive in Tether itself — require this build. Apple only issues push entitlements to properly signed apps, which is why sideloading is no longer offered.
On first launch, pair the phone: enter the server's host/IP and port, then the 12-char code from tether pair (or scan the QR).
Not supported. Android builds were discontinued after v2.8.12; tether.apk stays attached to the releases up to that version and is not updated. The Android APK was also signed with the public React Native debug keystore, so it never offered any authenticity guarantee.
A native Tauri client — the same terminal, tuned for keyboard and mouse (docked session sidebar, physical keyboard, mouse selection, right-click menu). Download for your platform from the latest release:
| Platform | File |
|---|---|
| Debian / Ubuntu / Mint | Tether_*_amd64.deb |
| Fedora / RHEL | Tether-*.x86_64.rpm |
| Any Linux (incl. Arch) | Tether_*_amd64.AppImage |
| Windows | Tether_*_x64-setup.exe or .msi |
| macOS (Apple Silicon) | Tether_*_aarch64.dmg |
| macOS (Intel) | Tether_*_x64.dmg |
The app checks for updates on launch and offers to install one when it finds it. Every format updates itself: the AppImage, Windows and macOS builds replace themselves in place, and .deb/.rpm installs hand the new package to your package manager, which asks for admin rights. See the docs for details.
iOS needs a Mac + Xcode. From the repo root:
bash scripts/build-xcframework.sh
xcodebuild -project clients/apple/Tether.xcodeproj \
-scheme TetherIOS \
-destination 'generic/platform=iOS Simulator' \
-configuration Debug \
CODE_SIGNING_ALLOWED=NO \
buildDesktop: bun dev:desktop (or bun --cwd apps/desktop run tauri:build).
Bun-workspaces monorepo: apps/server (Bun + Hono + bun:sqlite), apps/desktop (Tauri), apps/relay, plus clients/apple (native iOS) and crates/.
bun install # link all workspaces
bun dev:server # backend on :8085, watch mode
bun dev:desktop # Tauri desktop client
bun lint # Biome + server/desktop typecheck
bun format # biome check --writeTests:
bun --cwd apps/server run test
bun --cwd apps/desktop run test
bun test scripts/See CLAUDE.md for architecture notes (data flow, holder processes, conventions).