Architecture

The terminal stays
on your computer.

Your computer owns the sessions. Your devices own the encryption keys. WebRTC carries terminal traffic directly between them whenever the network allows it. The relay handles setup, coordination and encrypted fallback.

Follow the data
Connection paths
Your computer

Computer service

Reads your terminal.
Encrypts screen updates.
Accepts authenticated input.

Keys stay here
WebRTC
data channel
Encrypted
terminal traffic
Your phone

Mobile app

Decrypts screen updates.
Renders the terminal.
Encrypts your replies.

Keys stay here
Your chosen relaySetup & coordination

Once WebRTC connects, screens, history and input travel directly between your devices. The relay stays connected for pairing, encrypted signaling, revocation and push.

Your terminal content stays encrypted on both routes. Transport details

Direct when available.
Relay when needed.

Setup starts with the relay. Shellbell then tries a direct WebRTC connection and moves terminal traffic onto it after the devices authenticate the new path.

01

Find each other.

Both devices connect outward to your chosen relay. Paired identities establish an encrypted session. Terminal access works on this route before WebRTC is ready.

02

Move the terminal traffic.

WebRTC offers, answers and network candidates travel inside encrypted relay signaling. The devices check certificates and fresh keys, then agree to switch. Screens, history and input use the direct data channel.

03

Recover if the route fails.

A blocked or lost direct connection uses encrypted relay transport. Shellbell retries WebRTC while the app is open. Input with an uncertain outcome is not automatically replayed during a switch.

Less terminal traffic at the relay.

Once WebRTC takes over, the relay no longer forwards terminal frames. Both relay sockets stay connected for signaling, pairing, revocation and push. Direct transport reduces terminal bytes, not the number of relay connections.

The network still matters.

STUN helps the devices discover addresses; it does not carry terminal content. No TURN server is configured. Restrictive networks can therefore remain on relay transport. Hosting your own relay does not change the clients’ STUN settings.

Direct transport & recovery

Pairing takes a scan
and your approval.

No Shellbell account or email signup. Pairing starts with the computer you control and the phone you approve.

01

Open the pairing window.

The computer creates a temporary QR code containing its public identity, relay address, a gate token, and a separate random pairing secret. The default window lasts five minutes.

02

Scan and check.

Your phone checks the computer identity from the QR. The relay checks the temporary gate and admits the request. It receives the gate hash, not the separate pairing secret.

03

Approve the phone.

Confirm the phone on your computer. The devices save their pairing keys locally. Routine reconnects and network changes don’t need another QR.

Pairing protocol details

Terminal access
without moving the work.

The computer service adapts existing terminal sessions into a bounded screen model. The phone displays that model and sends your input back.

Only the session you’re viewing.

The computer captures the watched session, coalesces screen changes, and sends bounded updates. History is requested in chunks. The phone has Terminal and Reading views, and does not resize the remote terminal to fit its screen.

Computer service & backends

Input has an acknowledgement.

The computer checks the pairing and session before sending input to its terminal backend. Request identifiers help handle reconnects. An acknowledgement confirms backend acceptance, and uncertain input is not automatically replayed.

Bounded streaming contract

A phone connection
that knows when to stop.

The mobile app closes live terminal connections when it goes into the background. Background alerts use the platform’s push system.

Live while you’re using it.

Screen updates serve the session you’re looking at. Leaving the app closes its WebSockets and active transport rather than keeping an always-on terminal stream in the background. Opening it again reconnects.

Mobile connection lifecycle

Push when you’re away.

The computer detects attention events. The relay sends bounded notification attempts through APNs or FCM, so the phone can receive alerts without continuously polling your terminal. This design limits background work; actual battery use depends on the device and your usage.

Native notification design

Two ways to run
the computer service.

The native Mac app and headless service use the same terminal engine and phone protocol, with different service ownership.

The Mac menu-bar app.

A native Swift controller owns the desktop service. It provides pairing, settings, service controls, and optional keep-awake preferences. Ordinary sleep prevention is available on external power while the desktop service is running.

Quitting the app stops its Shellbell service. Your terminal jobs remain on your computer. Headless mode does not inherit the app’s power controls.

Native app & lifecycle

The headless service.

Run without the desktop UI under your OS user’s service manager. macOS uses launchd; Linux uses systemd-user and tmux sessions. The service’s lifecycle is independent of the desktop controller.

You manage computer sleep separately. A Windows computer service is planned. Pairing identities and keys belong to the computer’s OS user.

Headless installation & operation

The relay routes.
The endpoints decrypt.

The relay coordinates connections, pairing and notifications. It carries encrypted terminal traffic during setup or fallback. Once a direct route is established, that terminal traffic leaves the relay.

Shared policy, two runtimes.

packages/relay-core owns authentication, pairing, revocation, resource limits, and notification policy. Cloudflare and Node adapters supply WebSockets, storage, and scheduling. On Cloudflare, a Durable Object coordinates each computer. On Node, a single process uses private local SQLite.

Metadata has an owner.

Public identities, device names, pairing relationships, connection timing, and push-routing data support the relay’s work. Terminal plaintext and terminal decryption keys are absent. Organizations can host the same core under their own account or hostname and set their own operational policies.

Relay hosting & organization setup

Privacy here means a specific boundary: the relay cannot read your terminal. It does not mean the relay holds no metadata. The privacy inventory records what it sees and stores.

The details
are in the source.

The website explains the system. These documents define its contracts and operational requirements.

Your terminal,
from your phone.

Free to use. Pair once, then return to the sessions you already have.

Get Shellbell