Sigmux

Help

For Sigmux 1.0 · updated October 8, 2026
Sigmux is an SSH terminal for iPhone and iPad built around tmux. It connects to servers you already have; there is no Sigmux account and no server of ours in the path except an optional relay for notifications. This page covers setup, the tmux and keyboard behaviour that is not obvious from the screen, and what to do when something is off.
  1. Requirements
  2. First connection
  3. Tailscale and private networks
  4. tmux
  5. Keyboard and input
  6. Agents and notifications
  7. Trial and purchase
  8. Troubleshooting
  9. Contact

Requirements

First connection

  1. Tap + on the Hosts screen. Enter a name, the host name or address, the port and the username.
  2. Choose how to sign in. Password is stored in the iOS Keychain. For a key, Generate new key makes an ed25519 key on the phone (you copy its public half to the server's authorized_keys), or Import new brings in a key you already have. Keys never leave the device.
  3. Under Connect to, pick tmux or a plain shell. For tmux, pick Control mode (tmux 3.2+) or Classic attach, and a session name; Sigmux attaches to it and creates it if it does not exist. The first time, with more than one session on the host, you choose one.
  4. Tap the host. On the first connection Sigmux shows the server's host key fingerprint and asks you to accept it; it is remembered and checked on every later connection.

Sigmux locks itself with Face ID or Touch ID (App Lock in Settings). Everything you save, hosts, credentials and settings, stays on the phone.

Tailscale and private networks

Many Sigmux users reach their servers over Tailscale (or another WireGuard mesh). Sigmux does not care: it is an SSH client, and a tailnet address is just an address. What does matter is whether the phone's path to the server is direct or goes through a relay, because a relayed path from a phone on cellular commonly has a round trip of 300 to 700 ms. Everything still works, but connecting takes seconds, every keystroke echoes late, and the tmux handshake can hit its timeout.

Set the host up once

Get a direct path

A phone on cellular sits behind carrier NAT, so the connection can only be direct if the server's side can be reached. Check with tailscale status on the server: a line that says relay "hkg" (or any relay name) next to the phone means every byte goes through that relay; direct with an address means you are done. Then, in order of effect:

  1. IPv6 at home or on the VPS. Carriers hand phones IPv6; if the server has a public IPv6 address too, Tailscale connects directly without any NAT tricks. This is the single most effective change.
  2. Let the router map a port. Enable UPnP or NAT-PMP on the home router, or forward one UDP port to the server and pin Tailscale to it: tailscale up --port=41641 (keep your other flags) and forward UDP 41641. On a cloud VM, open UDP 41641 inbound in the security group.
  3. Avoid double NAT. A 5G home gateway or an ISP modem in front of your own router usually means two NATs and no hole punching. Put the modem in bridge mode, or use the ISP's IPv6.
  4. A relay of your own nearby. If the server must stay behind a hard NAT, a small VPS in the same region as the phone running a custom DERP (or acting as a Tailscale peer relay) cuts the round trip to tens of milliseconds, still relayed but close.

tailscale netcheck on the server reports the NAT type and whether a port mapping was found; "MappingVariesByDestIP: true" with no mapping is the case that only IPv6 or a forwarded port fixes.

Living with a relayed link

tmux

Control mode

In control mode Sigmux attaches as a tmux control client. Windows and panes are listed in the palette: tap the window name in the title bar, or the tmux key on the key row. From there you switch, split, rename and close, and create new windows. Output in a window you are not looking at marks that window in the palette; a bell or an agent notification marks it too.

Switching windows does not replay what happened in the window since you last saw it. Sigmux asks tmux for the window's screen and the last 1,000 lines of its history and draws those, so the switch is immediate and the scrollback is what tmux has. Your own tmux prefix keys still work.

Classic attach and plain shells

Classic attach runs the ordinary tmux attach in a terminal, for servers with an older tmux. A plain shell is just a shell. In both, Sigmux can still show the tmux palette and key row: set tmux controls on the host to Auto (shown while a tmux is detected), On or Off, and set the Prefix (Ctrl-b or Ctrl-a) so the palette can drive tmux through keystrokes. If you start tmux with a custom socket, enter the path that tmux display-message -p '#{socket_path}' prints.

Server-side settings worth having

Busy windows and slow links

When a window produces output faster than the link can carry it, tmux pauses that window for Sigmux instead of letting everything queue behind it. The window you are looking at is resumed at once and redrawn from a fresh capture; a window you are not looking at stays paused until you open it. Hosts whose session is not on screen are paused the same way, so keeping three servers attached costs about what one does.

Keyboard and input

Agents and notifications

A coding agent on your server (Claude Code, Codex or OpenCode) can notify the phone when it finishes or waits for an approval, and you can answer Allow or Deny from the notification. The answer travels over your own SSH connection to your own server; nothing runs anywhere else.

  1. In Settings → Agents, turn notifications on and choose a service: Sigmux (the relay we run; it forwards an envelope encrypted on your server and cannot read it), or your own Bark, ntfy or Webhook endpoint.
  2. Under On your hosts, install on each host. Sigmux signs in with that host's credential and writes the agent hooks; nothing runs in the background on the host, the agents call the hook when they need you. Remove from host undoes it, with or without a purchase.
  3. Send a test notification checks the path end to end. "Break through Focus" marks a waiting approval as time-sensitive; "Include the message" puts the agent's words in the notification.

Inside a session, a waiting approval shows as a card above the key row with the same Allow and Deny, and the conversation can be read as native text instead of terminal scroll. A file the agent mentions opens in a reader; the git changes it made open as a diff.

Trial and purchase

Troubleshooting

Connecting takes several seconds, or output lags
On a mesh VPN (Tailscale and the like) a phone on cellular often reaches the server through a relay rather than directly, with a round trip of half a second or more. Everything still works; it is the network. See Tailscale and private networks for how to tell and what fixes it.
"tmux handshake timed out"
Sigmux attached but tmux did not answer in control mode within a few seconds. Usual causes: a tmux older than 3.2 on a host set to Control mode (switch the host to Classic attach), or a shell startup script that prompts for input (an updater, a license notice) before tmux can run. Sigmux waits for the shell to go quiet, but a script that keeps asking wins.
The keyboard will not appear, or appears over a sheet
Tap the terminal itself; scrolling and the key row's action keys are designed not to raise it. If it stays up over a sheet, close the sheet and drag down on the terminal.
Duplicated prompt lines in the scrollback
Some shells repaint the prompt on every resize and tmux pushes the old copy into history. set -g scroll-on-clear off in ~/.tmux.conf stops it.
A window shows an old screen after switching
Switching captures the window from tmux; if it looks stale, switch away and back to capture again. If it keeps happening, record a trace (below) and write to us.
Notifications stopped
Check Settings → Agents still shows the host as installed and send a test notification. If the trial ended, notifications pause until the purchase; removing hooks still works.
Recording a trace for a bug report
Settings → About → Runtime trace (session and tmux internals) or Terminal trace (rendering and keyboard sizing) write log files to the app's Documents folder, visible in the Files app under Sigmux. Reproduce the problem, turn the trace off, and send the file with a description of what you did. The files record control sequences, sizes and timings; with the byte payload option off they do not include what you typed.

Contact

Questions, bugs and feature requests: hezj07@gmail.com. How your data is handled is in the Privacy Policy.