Shells that outlive your connection.
Close the lid, switch networks, come back tomorrow. Everything is exactly where you left it.
Website · Get started · Features · Releases
Status: 0.24.0 engineering preview. Working code, integration tests, tutorials and release automation. It is not a claim of production maturity, universal terminal compatibility, or superiority over established tools. Read the verification report and known limits.
TERYON separates the life of your shell from the life of your connection. A per-user service on your Mac mini or Linux host owns the terminals; OpenSSH transports the interface. Disconnect, close the client, or put your laptop to sleep, then reconnect to the same live shells.
| Persistent | Real PTYs on the host. Reattach to the same shells from any client. |
| Plain OpenSSH | Your keys, ports, jump hosts and aliases. No new ports, no new accounts. |
| Native desktop | A GPU window with pane trees, a command palette, a Finder-like file browser with a syntax-colored Quick Look, and Ports and Host health windows. |
| Built for agents | Status chips for Claude Code, Codex, Gemini, aider, Cursor and OpenCode; Git worktrees; a sandbox; an MCP server. |
| A link that explains itself | When the connection drops you see the real reason and the next step. |
| 23 themes | Apple, Mac27, Tokyo Night, Catppuccin, Dracula, Nord and more, with a WezTerm export. |
One slim bar, and the command palette (⌘K) for everything else.
⌘B opens a file browser that follows cd, locally or over SSH. All captures are real macOS captures of a throwaway demo workspace.
teryon # pick a host and workspace (recents, config, ~/.ssh/config)
teryon setup # guided first run: tools, SSH hosts, reachability, themeSigned and notarized TERYON-<version>.dmg and .pkg (macOS) and tar.gz archives (macOS arm64, Linux x86_64) are on the releases page. Checksums are in the SHA256SUMS-* files next to them.
Requires Rust (the repository pins 1.94.0 via rust-toolchain.toml), macOS or Linux, and a UTF-8 terminal.
cargo build --release --locked
./target/release/teryon connect local --workspace helloBuild the native desktop app:
cargo build --release --features desktop --locked
./target/release/teryon desktop local --workspace helloThe remote machine only needs the smaller default build. Both builds speak the same protocol. Press Ctrl+Space, release, then ? for help. Ctrl+Space → d detaches; your shells remain running. Open the same command again to reattach.
claude mcp add teryon -- teryon mcp --allow-write # durable panes for MCP clients
teryon sandbox -- claude # writes limited to this repository
export ANTHROPIC_API_KEY=…; teryon ai "open Calculator" # or ⌘J in the desktop appSee docs/MCP.md and docs/AI.md. The sandbox is a guard against mistakes and leaked credentials, not a boundary against a hostile program.
- On the mini, enable System Settings → General → Sharing → Remote Login for your user.
- Establish SSH key authentication and verify the mini's host key using ordinary
sshfirst. TERYON requires a trusted host key and working noninteractive key/agent authentication. - Build on the mini and install the binary:
cargo build --release --locked
./scripts/install.sh ./target/release/teryon- On your MacBook:
teryon doctor susant@mini.local
teryon connect susant@mini.local --workspace fluxvm
# If your client was built with the desktop feature:
teryon desktop susant@mini.local --workspace fluxvmDefault remote executable: $HOME/.local/bin/teryon. Use global --remote-bin /absolute/path if necessary. SSH ports, identities, agents, jump hosts, VPN routing, and aliases stay in your existing OpenSSH configuration. TERYON does not bypass firewalls or NAT.
See the complete Mac mini tutorial, every command, and deployment.
A static landing page lives in site/ and deploys to GitHub Pages through .github/workflows/pages.yml (set Settings → Pages → Source to "GitHub Actions" once). Preview it with scripts/build-site.sh && open site/dist/index.html.
The full table of implemented behavior is in docs/FEATURES.md; desktop details are in docs/DESKTOP.md.
teryon sessions mini
teryon panes mini --workspace fluxvm
teryon connect mini --workspace fluxvm --readonly
teryon capture mini --workspace fluxvm --pane 1 > build-output.txt
teryon exec mini --workspace builds --wait -- /usr/bin/uname -a
teryon push mini ./project/ ./project/
teryon pull mini ./results/ ./results/
teryon forward mini 3000:3000 --reconnect
teryon themes --preview
teryon dashboard
teryon import-ssh --dry-run
teryon layout save mini --workspace fluxvm ./fluxvm-layout.json
teryon layout open mini --workspace fresh-fluxvm ./fluxvm-layout.jsonmini can be an OpenSSH alias, or a TERYON config alias created with teryon init. Edit the generated config to match your username.
| Prefix: Ctrl+Space, then… | Action |
|---|---|
n |
New shell pane |
Tab |
Focus next pane |
s |
Cycle layout: single, vertical, horizontal, grid |
z |
Zoom / unzoom the focused pane |
w |
Fuzzy pane switcher |
x |
Close focused pane (asks to confirm) |
t |
Cycle the built-in themes |
: |
Command palette |
/ |
Search retained output |
h |
Retained-output viewer (y copies it via OSC 52) |
e |
Offline draft editor |
? |
Help |
d |
Detach without killing shells |
| Ctrl+Space again | Send NUL to the remote program |
In the native desktop app, use the visible controls or ⌘K (macOS) / Ctrl+Shift+K (Linux) for the command palette. ⌘D creates a pane and ⌘F opens output search on macOS.
cargo fmt --all --check
cargo clippy --all-targets --all-features --locked -- -D warnings
cargo test --all-targets --all-features --locked
python3 -m pip install -r tests/requirements.txt
python3 scripts/e2e.py --binary target/debug/teryonThe Python fixture serves SSH only during tests. Production TERYON has no Python dependency. GitHub Actions runs Rust checks on Linux/macOS and SSH integration on Linux. These workflows are provided; their hosted runs occur after you push the repository.
- A client disconnect does not intentionally terminate remote panes.
- Reconnection needs a reachable mini, a running daemon, and valid SSH authentication.
- A reboot, daemon crash, logout that terminates the service, or power failure can end live processes. Saved layouts recreate shells, not process memory.
- Offline screens are cached; they cannot establish whether remote jobs are still running.
- File transfers and forwarded HTTP/WebSocket connections have their own interruption behavior. A restored tunnel does not restore an existing TCP connection.
- Input acknowledgment means accepted into a bounded daemon queue, not executed or committed by the application.
- Mac mini walkthrough
- CLI and command palette
- Themes and customization
- Architecture and wire protocol
- Deployment, upgrades and packaging
- Security model
- Testing and evidence
- Limitations and next milestones
- Contributing
Apache-2.0. See LICENSE.
Free under Apache-2.0. If it helps you, you can donate any amount you like: https://rzp.io/rzp/utwdYh3. A donation is voluntary and supports development and maintenance. It is not a purchase: it buys no support, SLA, features, priority or license, and it is not tax-deductible (Zyvor AI Labs Private Limited is a company, not a charity). Support contracts are separate: sales@zyvor.dev.