Architecture

Helm108 is a real SSH terminal for iPhone and iPad built around one idea: bring your environment with you, and never leave a mess on someone else's box.

The three models

Three ways the app relates to the remote shell — for three kinds of user

They don't compete. An ops engineer hopping between boxes, a developer on their own gear, and everyone who just wants things to render correctly each get a different one.

1

Permanent provisioning

// for servers you own

A one-tap, idempotent installer writes a managed block into the host's .zshrc — bounded by sentinel markers, backed up first, and safe to re-run or revert. Everything inside the markers is ours; everything outside is untouched.

2

Ephemeral / portable shell  the differentiator

// for machines you don't control — jump boxes, cloud instances, coworkers' servers

Carry your plugins and theme to any host without touching its config, and tear it down on disconnect. Most SSH apps hand you a raw PTY and walk away — Helm108 brings your shell with you. How it works is below.

3

Client-side layer

// for everyone

A real terminal emulator (SwiftTerm) with correct rendering, color, and input handling. It's what keeps interactive REPLs, full-screen TUIs, and AI coding agents from looking broken.

The portable shell

Bring your shell with you — without polluting the host

Define a Profile — plugins, theme, tools — once. On connect, Helm108 stages a config bundle and re-execs zsh against it, so the shell reads your config instead of the host's.

# 1. SFTP a staged bundle into a cache dir on the host
~/.cache/aiconsole/<profile-hash>/

# 2. Re-exec zsh with ZDOTDIR pointing at the bundle —
#    zsh now reads OUR .zshrc/.zshenv, the host's config is untouched
exec env ZDOTDIR=~/.cache/aiconsole/<hash> zsh -l

# 3. Plugins lazy-install on first use via antidote (a single 50KB file)
# 4. The bundle carries its own cleanup: trap 'rm -rf "$ZDOTDIR"' EXIT

Non-invasive by construction

The custom ZDOTDIR is the whole trick: zsh reads the bundle's .zshrc, so the host's real config never changes. Nothing to undo, nothing left behind.

Cached, not re-uploaded

The first connect uploads to ~/.cache (survives reboots). Every connect after checks a content hash and skips the upload — so it's instant.

Self-contained or manifest

Ship the plugins pre-cloned (works air-gapped) or a tiny manifest that lazy-installs on first use. Manifest is the default; both are user-selectable.

Pre-flight & fallback

Locked-down hosts (no zsh, no writable cache) are detected up front, with a graceful fall back to the host's native shell rather than a broken session.

Honest by design. Ephemeral mode writes files to the host — less invasively than a native install, but still real. The app says so plainly, in the UI and the store listing.

Sessions vs. Profiles

Two clean concepts: where you connect, and what you bring

Session

The destination — host, port, username, credential (in the Keychain), and an optional preferred profile. This is where you're going.

Profile

The environment — plugin manager, plugins, theme, tools. This is what you bring with you. Both models read from a Profile; one profile can ride to many hosts.

Concurrent live sessions

A tab is a whole live terminal — not a saved tab

Each tab owns its own SSH connection, PTY, and terminal widget. A backgrounded tab keeps draining its shell into its own buffer — so a long-running agent keeps streaming while you work elsewhere.

The motivating case

Run Codex or Claude Code streaming in one tab, open a second tab to the same host, and aws s3 cp something — without killing the first session.

Multiplexed transport

SSH multiplexes many channels over one connection; a same-host second tab is a new channel, effectively instant. A different host is a new connection.

Buffers survive

Switching tabs, or a screen-sleep reconnect to the same host, preserves your scrollback — you never lose the conversation you were reading.

The Locker

A device-local staging area — two-way, between any hosts

Move files and whole folder trees over SFTP: host A → iPad → host B. Or bring in screenshots and files straight from the iPad, then push them to a host.

Rides the tab's connection

SFTP runs over the same connection the tab already holds — no separate login, no new transport.

Device ⇄ hosts

Import from Photos (screenshots) or Files, download from a host, upload to another — the locker is the hub in the middle.

Encrypted at rest

Staged files use iOS Data Protection, tied to your device passcode; also surfaced in the Files app for AirDrop and export.

Input, done right

Multi-line prompts for AI agents — on any keyboard

Shift+Return inserts a newline instead of submitting — the muscle memory Claude Code and Codex assume on the desktop. On a hardware keyboard it's intercepted at the terminal view; for the on-screen keyboard and voice dictation, an explicit newline key does the same. No core interaction is locked behind owning extra hardware.

Security & privacy

Your data stays yours

Password or SSH key

Log in with a password or an Ed25519 key. Keys are generated on-device (private key in the Keychain) and installed on the host in one tap — ssh-copy-id without the copy-paste. A one-tap reset cleans both sides.

Credentials in the Keychain

SSH passwords and private keys live in the iOS Keychain, the system's encrypted credential store — never in app files.

Nothing phones home

No accounts, no analytics, no trackers. The only network connections are the SSH sessions you set up, directly to your own servers.

On-device, encrypted

Sessions, profiles, and locker files stay on your device with Data Protection. Read the privacy policy →

The roadmap

Built in phases — each one shippable on its own

Phase A

Profiles foundation

shipped

The Profile model, local storage, and editor — the entry point both models read from. Plus clone-from-host.

Phase B

Ephemeral mode

shipped

The portable shell: ZDOTDIR plumbing, antidote plugin wiring, and theme application over SFTP.

Phase C

Caching & self-contained

in progress

Persistent host-side cache (shipped); cache-management UI and an air-gapped self-contained bundle to come.

Phase D

Permanent provisioning

planned

The managed-block installer with backup, idempotent re-run, and one-tap revert.

Phase E

iCloud sync & share

planned

CloudKit-backed profiles, and export/import a setup as a single shareable file.

Phase F

Concurrent sessions

shipped

In-app tabs, each a live interactive terminal, with buffers that survive backgrounding.

Phase G

File transfer / Locker

in progress

Two-way SFTP locker with Photos/Files/folder import (shipped); an optional security gate and one-tap host-to-host relay to come.

Phase H

SSH-key auth

shipped

Password or Ed25519 key login. Generate a key on-device and install it on the host with one tap — like ssh-copy-id, no key files to copy by hand — plus a one-tap reset that cleans both sides.

Back to Helm108