Your shells, wherever you are.

SSH with blocks, your Mac's shells on your iPhone and iPad, one Mac controlling another, and iCloud sync to tie them together.

Coming SoonCan be built locally. Source on GitHub. Requires iOS 18+.

SSH that keeps its blocks.

Type >prod and press Return. Every remote command still gets its own block with its exit code and the remote folder, and the input keeps completing, now against the server.

appgit:(main)(0.61s)
git pull
Already up to date.
>prod-db[email protected]:2222host
>proxyssh confighost
appmain
>p

Saved hosts, the right key, and sudo answered once.

Pick a key from ~/.ssh, or press Detect and Turm asks the server which of your keys it accepts. Import every Host in ~/.ssh/config in one go.

A password stays in the Keychain only when you ask, and is typed only at the prompt for that host's own user@host, once per connection, so a jump host never sees it. Opt in per host and Turm answers sudo's own prompt for a command you typed with sudo, automatically or with one click.

Add SSH Host
Name
>prod
Type >prod in the input to connect.
Host
prod.example.com
A hostname, an address or a Host alias from ~/.ssh/config.
User
deploy
Port
22
Key
Automatic
Password
Optional
Stored in the macOS Keychain.
Fill sudo password
Offers a button when a command you typed with sudo shows its own password prompt.
Sudo Password
Same as login password
Leave empty to use the login password. Needs Turm integration on the host.

Pair once, and your Mac is in reach.

Switch on Allow remote control on the Mac, then scan its QR code from the app, or type the 8-digit code and compare the 6-digit check code on both screens before you approve.

Macs on your network appear over Bonjour, and over Tailscale you enter the Mac's address. Every paired device gets its own key on an encrypted connection, and you can revoke it from the Mac at any time. If a Mac does not appear, a code fails, or hosts do not sync, the support page has the checks that usually fix it.

Pair a Device
Scan this in Turm on your phone, or choose Enter Code there.4829 1706192.168.1.20:7337
100.64.0.7:7337
Copy Pairing LinkExpires in 1:58

Your shells, on your iPhone and iPad.

Open the shells of a Mac running Turm as blocks, or SSH straight to your servers. The shells keep running on the Mac, and the app lists them, shows their history and lets you type into them.

A key bar puts esc, tab, ctrl and the arrows above the keyboard. On an iPad the sidebar and the session sit side by side.

9:41
Turm
Open Sessions
apiStudio ~/Projects/api
Macs
Studio2 sessions
turm~/Projects/turm
api~/Projects/api
New Shell

Control another Mac from a window.

Pair two Macs and the Remote Macs window (Shift-Command-R) lists the other Mac's shells with their state. Type in the bar at the bottom, interrupt with a click, and let Fit to This Window size the shell to what you see.

Each direction is its own pairing with its own key. Letting one Mac control another does not let it control you back, and each can be revoked or forgotten without touching the other.

Remote Macs
StudioConnected
api
web
docs
Mac miniNot connected
Nearby
LaptopPair
api~/Projects/apiShortcutsFit to This Window
~/Projects/apigit:(main)(0.52s)
git pull
Already up to date.
~/Projects/apigit:(main)running
swift test
Building for debugging... [41/58] Compiling APIKit Router.swift
Interrupt

And the details that make it work.

Files, notifications, sync, server setup, host keys and the iPhone keyboard.

Your Mac's files, one folder away.

From a folder chip the phone lists that folder on the Mac, and previews images and text. Upload sends a file back, which needs Allow file uploads on the Mac: it is off until you turn it on and choose the one folder it may write to.

FilesUpload
build
src
Package.swift
README.md
screenshot.png

Know when the build is done.

A command that finishes in a Mac shell you are attached to posts a notification with its exit code and how long it took, while the app is running in the background. iOS delivers nothing once it suspends the app, and Turm does not use a push server to get around that.

pnpm buildExited 0 · 1m 12s
now
cargo test --workspaceFailed (101) · 48s
now

iCloud sync, off until you turn it on.

Then your SSH hosts, global shortcuts, remembered passwords and stored keys follow you between Mac, iPhone and iPad through iCloud Keychain, which is end-to-end encrypted. Remote Access pairings and project shortcuts stay on the device that made them.

Sync with iCloudOff. Nothing leaves this device.
Syncs
SSH hosts
Global shortcuts
Remembered SSH and sudo passwords
SSH keys stored in Turm
Stays on each device
Project shortcuts
Interface preferences and usage statistics
Remote Access pairings
Trusted host keys and keyboard bar (iPhone)

Your dotfiles stay yours.

One click copies Turm's zsh, bash or fish hooks into ~/.turm/shell over the connection you already opened, with no second login. The server's .zshrc and .bashrc are never edited, and a newer Turm offers an Update.

appgit:(main)running
Last login: Mon Sep 28 09:14:02 2026 from 81.2.69.160 deploy@prod:~$
prod runs zsh without Turm integration. Install it to keep blocks, exit codes and theming over SSH.InstallNot nowNever for this host

Trusted once, checked every time.

The first connection from the iPhone or iPad shows the server's host key to trust. Every connection after is checked against it, and a server that presents a different key is refused.

Trust this host?Turm has not connected to prod.example.com:22 before. Check the fingerprint with the server's owner if you can.
Presented ssh-ed25519SHA256:Nq3b7Yl0w8Jt5sHcR2eVxKd9pFmZ1uAaT4gCoLhE6iw
CancelTrust and Connect

The keys a terminal needs.

esc, tab, arrows and symbols sit above the keyboard. ctrl and alt apply to the next key or lock with a double tap, arrows repeat when held, and a drag pad moves the cursor.

esctabctrlalthomeendpguppgdn|~/-_:;`'"$&*<>{}[]
fn
qwertyuiop
asdfghjkl
zxcvbnm
123return

The details, by topic.

Pick a topic, or search everything remote.

SSH

Connect with a name, and every remote command keeps its block while the input works against the server.

Connect with >

>prod opens a saved host with its user, port and key, and >prod uptime runs a command there. Hosts from ~/.ssh/config and >[email protected]:2222 work too. > file with a space is still a redirect.

Completion on the server

Remote folders and files, the commands on the server's PATH, its environment variables, git branches and tags, and its processes. Unknown commands still turn red.

The project bar, remotely

package.json, Cargo.toml, Makefile, compose files and Turm.json are detected on the server, and their actions run in the remote shell.

Paste and drop to upload

A file or image you paste or drop is uploaded to a private folder in the server's temp directory, and its path is inserted.

Chips that know the host

Click the host chip to save the server, copy its address or ssh command, or disconnect. The folder chip copies the remote path, or a user@host:path for scp.

Where the integration stops

After a second ssh hop, or with your own ssh function, blocks and exit codes still work but completion, git and the project bar are off. When a connection ends Turm returns to the local shell, and one that dropped while idle leaves a Disconnected block with ssh's last message.

Keep exploring.