Skip to main content

iOS App

The Mobitty iOS app is a thin native shell over the same web client you already use in the browser. It adds the parts the browser can't: a real on-screen terminal keyboard, multi-server connection rotation, 3-finger and edge-swipe gestures, and a touch-friendly selection layer with a magnifying loupe.

Available on iOS 17+. Distributed via TestFlight and the App Store.

Sessions and shells

Pick a shell when you open a server for the first time — bash, csh, dash, ksh, sh, tcsh, zsh, or any custom command line. Shell processes run on the server, so they survive the moments the client doesn't: network blips between Wi-Fi and cellular, swiping the app away, locking the phone overnight.

The same session also moves with you across devices. Start a build on your laptop in the office, watch it from your phone on the commute, and pick up on a tablet at home — the session list shows every live session on the server, with current marking the one you're attached to. Tap a different row and you're attached to that one instead; no need to keep the old device awake or even open.

Session list showing live and dead sessions with Servers, New Session, Settings, Edit buttons
Sessions panel — switch, create, edit, or clean up dead sessions.

The session switcher is built for thumbs, not key combos:

  • Open it with a left-edge swipe, or by tapping the menu button on the softkey bar. No Ctrl-chord required.
  • Switch by tapping any row — attaches you to that session and dismisses the panel in one tap. The previously-current session stays alive on the server.
  • Start a new one with New Session (which opens the shell picker), or jump straight to a different server with Servers.
  • Clean up dead sessions with Edit, or swipe a row left for a quick delete.
  • Each row shows the session name, its shell, PID, and the working directory at first sight, so you can identify "the build one" from "the agent one" without attaching first.
Shell picker showing bash, csh, dash, ksh, sh, tcsh, zsh with /bin/* paths
Shell picker on first session — all the shells the server announces.

Multi-server connection rotation

Save Production, staging, and lab boxes once. Each saved server can list several URLs — LAN, Tailscale, public hostname — tried in order until one connects. Your phone uses the office LAN when you're on Wi-Fi, falls through to your Tailscale address when you're on cellular, and gives up on the public hostname only after the first two fail.

Server list with localhost, Production, and Lab via Tailscale entries
Multiple saved servers — tap to switch, drag to reorder, swipe to delete.
Add Server form with Name, URLs, and Notes fields
Each server is a Name, an ordered URL list, and free-form Notes.

Native terminal keyboard

A SwiftUI key grid that lives below the terminal — separate from the web softkey bar. Pick from built-in Readline, Tmux, Vim, or Claude Code layouts, or design your own. Each key has a real position on a grid you drag-arrange yourself; layouts don't reflow across orientations.

The four built-in layouts in their default state:

Native Readline keyboard layout with Esc, Tab, arrows, C-a C-e C-w C-k C-u C-r C-l, C-c C-d C-z
Readline — line-edit shortcuts for any shell.
Native Tmux keyboard layout with Esc, Tab, arrows, C-b prefix, T:c T:n T:p T:d T:% T:", C-c C-d C-z C-l
Tmux — Ctrl-b prefix and the most-used Tmux chords.
Native Vim keyboard layout with :wq, :w, dd, yy, gg, G, ci", ci(, ci{, ci[, ciw, daw, da"
Vim — write/quit, change-inside chords, and the navigation row.
Native Claude Code keyboard layout with C-w C-y Home arrows End C-a C-c, /clear /compact /resume /branch, /rename /cost /diff /fork /btw /copy /goal
Claude Code — slash-commands and the readline keys that ride alongside them.

Customize in place: drag a key to move it, tap to edit its action, add new keys from the catalog. Define multiple layouts and cycle through them with one tap on the keyboard toggle.

Keyboard customizer panel with key catalog above the live editable grid
Customizer overlay sits above the live grid — drag-arrange below, browse the catalog above.

A built-in toggle hides the softkey bar automatically when a Bluetooth or Magic Keyboard is paired, so the terminal gets the full screen.

Settings — General, Softkeys, Gestures, Themes

Four tabs share the same profile model as the web client. Edit them on the phone and the desktop picks them up next time you connect.

Settings General tab with font family, font size, padding, softkey size, scrollback, image paste dir
General — font, padding, softkey size, scrollback, image paste directory.
Settings Softkeys tab with Page 1 keys (Esc, Ctrl, Alt, Shift, Tab) and Custom Keys editor
Softkeys — multi-page softkey bar, modifier keys, custom-chord editor.
Settings Gestures tab with 1-Finger Swipe and 1-Finger Flick direction bindings
Gestures — bind 1-finger swipes and flicks to your most-used keys.
Settings Themes tab with Light Theme, Dark Theme pickers and Theme Editor with color swatches
Themes — live theme picker and color editor. Light and Dark are bound to iOS appearance.

Touch selection

Tap to drop a Paste popup at the cursor. Long-press to start a selection — iOS-style handles attach to the boundaries and a circular magnifier loupe rides above your finger as you drag, so you can land the boundary on the right character without lifting and trying again. Copy and Paste menus float above the selection.

Terminal selection with handles, floating Copy menu, and circular magnifier loupe showing zoomed-in text
The loupe magnifies the selection boundary while you drag — and the Copy menu floats above.
Floating Paste popup over terminal output after a tap
Tap-anywhere Paste popup, positioned at the touch point.

File transfer and image viewing

Anything the mobitty-cli shell tool does on the desktop works in the iOS WebView, with the iOS twist that files land in the iOS files / photos app instead of a browser download folder.

  • View an imagemobitty-cli view photo.png opens a fullscreen viewer with pinch-to-zoom. Handy for screenshots, generated charts, PDFs the agent rendered, etc.
  • Download a filemobitty-cli download backup.tar.gz streams the file straight to the iOS download manager. From there you can Save to Files, AirDrop, or open in any other app.
  • Upload a file — tap the Upload softkey to pick a file from iCloud Drive, Photos, or any iOS document provider. The file is streamed up the WebSocket and dropped at the working directory.
  • Image paste — copy a screenshot to your clipboard (or take a screenshot with Side+Volume Up), tap the Paste softkey, and the file is written to your configured paste directory and its path is typed into the terminal. See Clipboard for the full flow.

Network adapts to you

Cellular, hotel Wi-Fi, the train tunnel between you and your office — the iOS app rides on the same adaptive protocol the browser client uses. The server measures round-trip time continuously and tunes the refresh rate from 60 fps on a LAN down to 4 fps on a slow link, so keystrokes stay snappy even when bandwidth gets squeezed. Updates are incremental (only what changed since the last frame) and the whole channel is compressed.

Your input is always sent immediately. Only screen refreshes are throttled, which is what keeps the terminal feeling responsive when the network doesn't.

iOS-specific gestures

GestureAction
3-finger long-press anywhereQuick menu — Reload, keyboard mode, Settings, Manage Servers
Right-edge swipe inOpen native server list
Left-edge swipe inOpen the web client's session list
Ctrl+Shift+S on hardware kbSame as left-edge swipe

All four are toggleable from the native Settings sheet:

Native iOS settings sheet with Appearance, Custom Keyboard, hardware-kb toggle, edge-swipe toggles
The native Settings sheet — also reachable from the bottom of the server list.

What the app does NOT do

The web client is the product. The iOS app does not duplicate any web functionality:

  • No SSH client built in — you bring the tunnel (Tailscale, Cloudflare Tunnel, WireGuard, plain SSH port-forward, whatever you like).
  • No credentials stored in the app. Authentication is handled by your tunnel.
  • No analytics, no telemetry, no fingerprinting. The privacy manifest declares one required-reason API: UserDefaults for the app's own saved-servers list.

See also

  • Remote Access — secure tunnels you can pair the iOS app with
  • Shell Tools (mobitty-cli)view, download, edit from inside the session
  • Adaptive Protocol — how the refresh rate, incremental updates, and compression tune to your network
  • Gestures — web-side gesture bindings (work alongside iOS-native gestures)
  • Soft Keys — web softkey bar (shown above the native keyboard)
  • Clipboard — iOS clipboard prompts and behavior