termoak-server, the optional self-hosted server of
Termoak, the open-source SSH client for desktop and
mobile. A single binary that keeps everything in SQLite and adds to the apps:
- Server sessions that stay alive when you close your laptop or lose coverage, with the scrollback intact when you attach again from any device (and a separate session holder, so restarting the server does not cut them).
- Shared sessions with users, teams or a link, in view or control mode.
- Sync of the encrypted vault across devices.
- Accounts and teams: two-step verification, invitations, roles, administration and an audit log.
- Background AI with approvals from your phone, multi-provider, and an MCP server for external agents.
- A basic web app (
web/, built into the binary): sign-in, sessions with a terminal in the browser, teams and account settings. It is not indexed by search engines (/robots.txtdisallows everything); a custom front-end in[web] dircan ship its own robots.txt, sitemap, favicons,.well-known/files and prerendered pages (see DEPLOYMENT.md). - Push notifications (APNs and FCM), email and update downloads for the apps.
It depends on the shared crates of TermoakSSH/core through a git
tag (see Cargo.toml).
The server is a single binary that keeps everything in SQLite.
With Docker:
docker compose up -d # uses docker-compose.yml; data in the termoak-data volumeWith the binary (from the server releases,
or built from this repository with cargo build --release):
termoak-server example-config > config.toml # edit public_url, data_dir...
termoak-server --config config.toml serve # listens on 0.0.0.0:7722Open http://<server>:7722 and sign up: the first account becomes the
administrator, and after that registration is closed (invitations only)
unless you set registration = "open". For production, put it behind TLS
(Caddy or nginx) and run it with the bundled systemd units: see
docs/DEPLOYMENT.md.
| Repository | Contents |
|---|---|
| TermoakSSH/core | Shared crates (SSH engine, vault, API client, AI engine, FFI bindings, updates) and the termoak CLI |
| TermoakSSH/server | termoak-server: HTTP/WebSocket API, basic web app, deployment files |
| TermoakSSH/desktop | Desktop app (GPUI) for Windows, Linux and macOS |
| TermoakSSH/mobile-android | Android app (Jetpack Compose) |
| TermoakSSH/mobile-ios | iOS app (SwiftUI) |
| TermoakSSH/public-web | Public website of termoak.com: landing, pricing and downloads |
cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo test # some end-to-end tests use the system sshd (Linux)tests/ffi_*.rs run the engine of the mobile apps (termoak-ffi, from core)
against this server. To work on core at the same time, see
"Using the libraries" in the core README.
If Cargo.toml points to a core tag that only exists in a local checkout
(created but not pushed yet), make git fetch from that checkout instead of
GitHub, without touching any file:
export GIT_CONFIG_COUNT=1 \
GIT_CONFIG_KEY_0=url./path/to/core.insteadOf \
GIT_CONFIG_VALUE_0=https://github.com/TermoakSSH/core \
CARGO_NET_GIT_FETCH_WITH_CLI=true
cargo build # Cargo.lock gets the same commit as once the tag is pushedThe server is released with scripts/release-local.sh (server-vX.Y.Z):
scripts/release-local.sh status
scripts/release-local.sh version server 0.2.1
scripts/release-local.sh build server
scripts/release-local.sh publish server --dockerDetails in docs/DEPLOYMENT.md.
- Deployment
- HTTP API, with the full contract at
/api/openapi.json - WebSocket protocol
- Architecture, AI engine, Security and Internationalization (in core)
Bug reports, fixes, features and translations are welcome: see CONTRIBUTING.md. Translating Termoak into your language needs no programming: copy the English strings file of an app, translate it and open a pull request (docs/I18N.md).
Copyright © Ohz Digital SL.
Termoak is free software released under the GNU Affero General Public License v3.0 (AGPL-3.0-only).
"Termoak" and the Termoak logo are trademarks of Ohz Digital SL and are not covered by the code license: see TRADEMARK.md.