Skip to content

Repository files navigation

Tether icon

Tether

License: GPL-3.0 Latest release CI Release builds Platforms: iOS, Linux, macOS Buy me a coffee

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.

Download

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.)

Install the server

Linux / macOS:

curl -fsSL https://samlo.cloud/tether/install.sh | sh
tether start
tether pair

The 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 update downloads 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 with TETHER_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 :8443 from a self-signed certificate clients pin on first pairing, alongside the plaintext :8085 older 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.

What you get

  • Persistent sessions — each shell runs in a detached holder process. Client disconnects, server restarts, even tether restart upgrades: 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 with tether present agent-install; declare session state with tether signal; clear previews with tether present reset [project-name].

Mobile app (iOS)

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).

Android

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.

Desktop app (Linux / Windows / macOS)

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.

Building the app from source

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 \
  build

Desktop: bun dev:desktop (or bun --cwd apps/desktop run tauri:build).

Development

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 --write

Tests:

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).

License

GPL-3.0

About

A persistent remote-shell console: real PTY shells on your server, streamed to your phone over WebSocket. Shells keep running when you disconnect.

Topics

Resources

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages