Live terminals
Full xterm sessions over WebSocket with scrollback replay. Reconnect from anywhere — the PTY keeps running on the server.
Self-hosted · single binary · your metal
helvi.sh is a web desktop for your SSH fleet. Open a browser and get real windows: live terminals you can share, dual-pane file transfers between hosts, system monitors, container and service managers — with access control, two-factor auth and a full audit trail underneath. It ships as one Go binary with an embedded UI and a single SQLite file. No agents on your servers, no SaaS in the middle.
curl -fsSL https://get.helvi.sh | sudo bash
Windows you drag, resize, minimize and restore — with a taskbar, a ⌘K launcher, folders and wallpapers. Your layout is saved per user and restored on sign-in.
helvi.sh talks plain SSH and SFTP to your endpoints. If you can ssh to it, you can manage it — no agents, no daemons, no firewall gymnastics.
Every credential is sealed in an encrypted vault, every session can be recorded, and every action lands in the audit log. Admins bypass nothing they can't see.
Every tool opens as a window on the same desktop, against the same endpoints, under the same permissions.
Full xterm sessions over WebSocket with scrollback replay. Reconnect from anywhere — the PTY keeps running on the server.
Browse two endpoints side by side and drag files across — host-to-host transfers stream server-side through a queued SFTP pipeline.
Live CPU, memory, network and storage sparklines per host, streamed over the same SSH connection. No exporters to deploy.
Manage Docker containers and systemd units from purpose-built windows — status, logs, restart — without leaving the desktop.
One-shot commands and saved playbooks fanned out across many hosts at once, with per-host output collected as it lands.
Point-and-click SSH tunnels: expose a database or an internal dashboard through any endpoint, and tear it down just as fast.
Terminal sessions record to asciicast — searchable, replayable in the built-in player, stored in your database and nowhere else.
SSH keys and agent credentials are sealed with age (X25519) under a key that never leaves your box. Write-only from the API.
Members see only the endpoint folders they're granted — connect, read files, write files — enforced in the API, not just hidden in the UI.
TOTP apps, email or SMS codes, backup codes — optional or enforced org-wide. Plus a PIN lock screen with auto-lock on idle.
Sign-ins, connections, transfers, admin changes, every agent command — timestamped, attributed, queryable from the Audit window.
Pin Grafana, your NAS, an internal wiki — any http(s) panel — as sandboxed desktop windows next to your terminals.
Share a live session with a teammate and both of you see the same terminal, byte for byte. One person types at a time — control passes with an explicit hand-off, so there's never two cursors fighting over one shell.
Need eyes from outside? Mint a public view-only link: watchers see output in real time but can't type, can't browse, and the link dies the moment you revoke it or the session ends.
maria joined the session (view)
dtest@alpha:~$ journalctl -u api --since -5m | tail -3
Sep 26 04:02:11 alpha api[912]: timeout dialing 10.0.4.7:5432
Sep 26 04:02:14 alpha api[912]: retry 1/5 …
control handed to maria
maria@alpha:~$ pg_isready -h 10.0.4.7
10.0.4.7:5432 - accepting connections
Attach a Claude-powered agent to any live session from its chat panel. It works through the same PTY you're watching: every command it runs is echoed in the terminal with a visible agent banner, captured in the recording, and written to the audit log.
The agent runs in a container on your helvi server, reaches the endpoint only through the session it's attached to, and its credentials are sealed in the vault. No side channels — if it isn't on your screen, it didn't happen.
you › disk is filling up on this box, find the culprit
◆ agent du -x -d2 /var 2>/dev/null | sort -rn | head -3
9812340 /var/log/journal
1240310 /var/lib/docker
812200 /var/cache/apt
agent › journald is 9.4 GB — cap it with
SystemMaxUse=1G in journald.conf?
helvi.sh sits between your team and production — so its own posture is the whole product.
Local accounts with argon2id hashing, or single sign-on against any OIDC provider — Okta, Entra, Keycloak, Google. Sessions are opaque and server-side, never JWTs in localStorage.
Authenticator apps (TOTP), email and SMS codes, single-use backup codes. Make 2FA optional, required for admins, or required for everyone — enforcement happens before the desktop loads.
Grants are (user or group) × endpoint folder × capability: connect, read files, write files. What isn't granted isn't just hidden — the API refuses it.
Private keys and agent credentials are envelope-encrypted with age (X25519) under a boot-sealed master key. The first-run wizard makes you back it up, then never shows it again.
Session recordings plus an append-style audit log: who signed in, who connected where, who moved which file, what every agent executed. Attribution survives shared sessions.
One static binary, one SQLite file, no runtime dependencies to patch. Ship it behind Caddy or Traefik, health-check /healthz, done.
One Linux box is all it takes. Your data never leaves it.
curl -fsSL https://get.helvi.sh | sudo bash
Installs Docker if missing (it asks first), generates the vault passphrase into root-only /etc/helvi/helvi.env, and starts the container. Idempotent — rerun the same command any time to upgrade; your data and settings survive.
docker run -d --name helvi --restart unless-stopped \
-p 8080:8080 -v helvi-data:/var/lib/helvi \
snaju/helvi
A ~30 MB Alpine image running as non-root. Everything — database, vault, recordings — lives in the /var/lib/helvi volume. Front it with Caddy or Traefik for TLS.
make all # embedded UI + static binary → bin/helvi
sudo cp bin/helvi /usr/local/bin/
sudo systemctl enable --now helvi # unit file ships in deploy/
Go ≥ 1.23 and Node ≥ 18 build the whole thing. The result is a single static binary — CGO-free, SQLite embedded — that runs anywhere Linux does.
curl -fsSL https://get.helvi.sh | sudo bash