Shells that stay. Keys that don't move.
SpectaShell speaks plain SSH to your servers, keeps your shells running on them through your own login, and keeps each device’s key in a chip it never leaves. No Calida Lab server ever sees your terminal: the one server Calida Lab runs relays notifications from hosts, sealed on the host (HPKE) so that only your device can open them.
A shell normally belongs to the connection that started it: when the connection drops, the shell is hung up and whatever ran in it ends. SpectaShell starts each shell inside a small program of its own, spectashell-keeper, on the machine where the shell runs. The keeper holds the shell and the last part of its output, so the shell keeps running when the connection drops, the device sleeps or the app quits, and it shows you its screen again when you come back.
sshd → spectashell-keeper attach0700)spectashell-keeper attach through your SSH login. It sends nothing anywhere, except, once a device of yours has notifications on, a sealed notification to SpectaShell’s relay (Notifications from hosts)./tmp/spectashell-<uid>/keepers on Linux — the same place at every login, and kept when you log out, unlike $XDG_RUNTIME_DIR, as tmux keeps /tmp/tmux-<uid> — and in ~/Library/Application Support/SpectaShell/keepers on a Mac, which cleans its /tmp. Before using either, the keeper checks that the folder is a real folder, not a link, owned by you and closed to everyone else. If another user made it first, the keeper refuses to start rather than use it./tmp cleaning. The keeper touches its socket, its description and their folders every hour, so age-based cleaning (systemd-tmpfiles) passes them by; if the folder is removed anyway, the keeper makes it again and your shell can be reached as before.~/.local/share/spectashell/. A host where you say no works over plain SSH.~/.ssh/authorized_keys: restrict turns off the terminal, forwarding and the agent, and the forced command runs the keeper’s list, whatever the connection asks for.restrict,command="$HOME/.local/share/spectashell/current/spectashell-keeper list" ecdsa-sha2-nistp256 AAAA… SpectaShell listing on iPhoneSpectaShell has no sign-up and no login. Sync and teams run on your own Apple Account's iCloud, so there is no Calida Lab account, no password database and no server of ours that could leak your hosts or keys.
sha256sum ~/.local/share/spectashell/*/spectashell-keeper on your server.Each Mac, iPad and iPhone makes its own key in the Secure Enclave. Its private half can't be copied out, not by SpectaShell and not by anyone holding the device. It signs only after Face ID, Touch ID or the device's password, at every login.
Turn on agent forwarding for a host and that host can ask your device's key to sign — to log in elsewhere or sign a commit. Each request shows which host asks and what for, and needs your face or finger on its own. Cancel once and the connection gets no more requests.
On the Mac, SpectaShell reads ~/.ssh and your SSH agent as ssh does. It never changes, copies or uploads them.
Remove a lost device from another of yours: its keys are taken off your hosts as you reach them, and it can't list your shells again. A new device can list them only once one of yours approves it.
Synced items live in your own iCloud private database. SpectaShell’s relay never holds any of it.
push.calidalab.ai), only from a device you turned notifications on for and the hosts that notify it.Settings ▸ Notifications ▸ Notify This Device lets your hosts tell this device that a program needs you while none of your devices is in front. Apple delivers a notification to an app only from the holder of the app’s push key, which cannot be on your hosts, so a relay of Calida Lab’s stands between them.
~/.local/share/spectashell-push, readable by you alone, holds the key the host signs with, made there and never leaving it, and the device’s key it seals with. The keeper sends only over HTTPS, only when something happened, and still listens on nothing.No. Your shells go only between your devices and your hosts, synced settings sit in your own iCloud, and keys and passwords never leave your device. SpectaShell sends us no usage data: there are no analytics. The only thing that passes through a server of ours is a notification from a host, sealed so that only your device can open it.
No. There is nothing to sign up for and nothing to log in to. Sync and teams use the Apple Account your device is already signed in with.
A shared group is a CloudKit share between your Apple Accounts: only the people you invite can open it. Who may log in to a host is still decided by the host — each member uses their own device key, let in by someone who can log in there.
No. It listens on a Unix socket in a folder only your account can open. The only way in is your SSH login.
No. The keeper runs as you, from your home folder, and installs nothing system-wide.
Only your account — and root, who can reach every process on a machine, as with tmux or screen. On a server whose administrators you don't trust, keep anything secret out of its shells.
The shell's recent output, in memory, while the shell runs; and a small description beside its socket. Close the shell and the keeper ends and removes them at once; a shell whose program ended and that nobody opens again goes after 24 hours. In both cases a short note of how it ended stays for 30 days.
Forwarding always lets a host's root use what you forward. SpectaShell makes the device's key ask you, request by request, and refuses to let the host add or remove keys. Keys of the Mac's SSH agent are forwarded as ssh forwards them, so turn it on only for hosts you trust.
Never. A password, passphrase or one-time code is asked when needed and forgotten once the login has it. Your own password manager (Passwords, 1Password) can fill the dialog through the system's AutoFill: it keeps the password, SpectaShell does not. After one password login, SpectaShell can put the device's key on the host so the next login needs none.
On another of your devices, open Keys and choose Remove from Every Host… beside it. SpectaShell logs in to each of your hosts and takes its keys out; a host that was off loses them at your next login there. Its keys never go on a host again.
Close its shells, then delete ~/.local/share/spectashell and /tmp/spectashell-<your user id> (on a Mac, ~/Library/Application Support/SpectaShell/keepers), and remove the lines SpectaShell added to ~/.ssh/authorized_keys: for each device, its key, ending “SpectaShell on <device>”, and its listing key, the line that starts restrict,command= and ends “SpectaShell listing on <device>”.