Termavox

Your terminals, always on.

Close the browser, come back anywhere, and pick up exactly where you left off. Termavox is a self-hosted runtime that holds your SSH sessions open on a server you control; the browser is only a view.

v0.1.0 release candidateFree software under the AGPL-3.0Source on GitHub

The Termavox workspace: named sessions grouped by state on the left, a live shell on the right

The browser lifecycle is not the terminal lifecycle.

In most web SSH tools, the browser tab is the session: close the laptop or lose Wi-Fi, and the connection dies with it. Termavox flips that around. It keeps every session open on its own server, indefinitely, until you end it. Browsers only attach and detach, and when you come back, from the same laptop, another computer or your phone, the terminal is exactly as you left it.

What happens…Typical web SSHTermavox
You close the browser tabTypical web SSHThe SSH session diesTermavoxKeeps runningNothing; the session keeps running
You reopen it on another deviceTypical web SSHYou start overTermavoxSame screenInstantly, full-screen apps included
Your Wi-Fi drops for a minuteTypical web SSHThe session is lostTermavoxReconnectsBehind the scenes; the shell never noticed
The Termavox service restartsTypical web SSH—TermavoxRestoresProtected sessions come back as they were
Two devices open the same sessionTypical web SSHUsually not supportedTermavoxBoth attachThe one you are typing on sets the size

How it works

Three ideas carry the design.

Any browser A synchronized view, laptop or phone
Termavox Self-hosted: authoritative terminal emulators
Your servers Invisible tmux: shell, vim, htop…
A terminal emulator lives on the server
For every session, Termavox keeps an authoritative emulator fed with the raw SSH output. A browser that attaches receives a snapshot of that state followed by the live stream, so it renders an exact copy, alternate screen and terminal modes included.
tmux protects sessions, and you never see it
Every SSH session runs inside a dedicated tmux on its server, driven through tmux's control mode: no status bar, no prefix key, normal scrollback. After a network drop or a restart, Termavox reattaches and rebuilds the screen and history. Servers without tmux still work, marked as not protected.
Sessions belong to the service, not the browser
The web app manages users, servers, credentials and layout; the session manager owns connections, emulators and reconnection. Deploying a new web version never drops a terminal.

Where it fits

For anyone who keeps shells open on remote machines and wants to reach them from anywhere.

A development server or a VPS
Keep editors, builds, test watchers and log tails running on the machine where the code lives, and pick them up from your laptop, another computer or your phone.
Long-running jobs and coding agents
A deploy, a migration, a data job or an AI coding agent working in a terminal keeps going while your laptop sleeps. Check on it from any browser.
A remote shell in the browser
A self-hosted, web-based SSH client, and an alternative to Apache Guacamole when what you need are terminals that stay open: no SSH client or key on the device you happen to use, host keys verified, credentials encrypted on your server.
On call from a phone
The session list, a full-screen terminal and an extra-key bar for Esc, Ctrl, Alt, Tab and the arrows.

It works alongside the tools you already use. Termavox runs tmux for you, invisibly, so you never type tmux attach again, and your own tmux, Zellij, Herdr or any other terminal program still runs inside a session and keeps going when the browser leaves.

A look around

Real captures against test SSH servers.

What you get

Run it

Three containers behind a single origin: Caddy for TLS, the web app and the session manager. You need Docker with Compose v2 on a Linux host.

A release

With the images it publishes for amd64 (arm64 coming soon).

git clone https://github.com/ativaone/termavox.git termavox && cd termavox
git checkout v0.1.0                            # the release to install (see Releases)
deploy/scripts/init-secrets.sh                 # generate the secrets; back up deploy/secrets/master_key
cp deploy/.env.example deploy/.env             # the settings: edit them before starting (below)
docker compose -f deploy/compose.yaml pull     # the release's images from ghcr.io
docker compose -f deploy/compose.yaml up -d    # start the stack
docker compose -f deploy/compose.yaml logs web | grep "setup token:" | tail -n 1

The latest source

With the images built on this host: it needs a couple of GB of memory free, and is also the way to run it on arm64 for now.

git clone https://github.com/ativaone/termavox.git termavox && cd termavox
deploy/scripts/init-secrets.sh                 # generate the secrets; back up deploy/secrets/master_key
cp deploy/.env.example deploy/.env             # the settings: edit them before starting (below)
docker compose -f deploy/compose.yaml up -d --build
docker compose -f deploy/compose.yaml logs web | grep "setup token:" | tail -n 1

Edit deploy/.env before you start. As copied, it serves https://localhost with a certificate from Caddy's local CA, for a trial on this machine. For another name, set TERMAVOX_DOMAIN to it, with TERMAVOX_TLS=auto for a public domain (a Let's Encrypt certificate) or internal for a LAN name or an IP address. The last command prints the one-time setup token and the address where it creates the first admin. The installation guide covers domains and TLS, reverse proxies, verifying the images, backups, upgrades and troubleshooting.