clim CLI on mobile · open source · zero-knowledge relay

Your terminal,
in your pocket.

The clim CLI on mobile: drive Claude Code, Codex and Hermes from your phone — any agent you can run in a terminal. Direct over your own WiFi at home, end-to-end encrypted relay when you’re out. One command, no account.

$ npm install -g @dingalabs/clim && clim claude copy

The CLI is live on npm. The phone app is not on either store yet — build it from source.

0accounts required
<5mson LAN
MITlicensed, auditable
~ · clim claude
$ clim claude
server up on :8787
pair code 540 728 9:58 left

Or scan from the app.

Both devices stay on your network — nothing routes through us on LAN.

● live pty · keystrokes go straight into the REPL
at home

LAN direct. No hop, no relay, no latency.

anywhere else

E2E-encrypted relay. We can’t read the stream.

iOS 16+· Android· macOS · Linux · Windows· Node ≥ 18· MIT licensed
0.5.0· ~190 KB
01 — start

Three steps from zero to control.

No dashboard signup. No pairing code screens. No cloud account. Just one CLI and one QR.

1

Install the CLI on your Mac

Ships as a native npm package. Uses node-pty to spawn a real pseudo-terminal — so claude and codex think they're on a real TTY.

$ npm install -g @dingalabs/clim
2

Run clim claude

Starts the relay in the background, generates a PIN, prints QR codes for LAN and Cloud pairing, then wraps your session.

$ clim claude ▸ starting clim server on :8787… pair on phone → 540 728
3

Open the app · scan · done

Your iPhone camera reads the QR. Auto-detects LAN or Cloud, auto-pairs, decrypts. Every tap on your phone types directly into your Mac's live REPL.

live pty · sends type into REPL
02 — modes

Two modes, one app.
Pick your paranoia level.

Same UX. Same features. The difference is where the bytes travel.

● LAN — offline

Home WiFi.
Zero packets leave your router.

Your Mac runs the relay locally. Phone connects to it directly over WiFi. Airplane the internet — this still works. mDNS auto-discovery means the app finds your Mac without typing an IP.

  • No cloud, no signup, no third-party sees anything
  • mDNS Bonjour auto-discovery
  • PIN-based pairing, real secret exchanged automatically
  • Works on airplane WiFi, hotel WiFi, hotspot
✻ CLOUD — remote

Anywhere in the world.
E2E encrypted. Relay is deaf.

Different network from your Mac? Cloud mode routes through a zero-knowledge WebSocket relay. Every byte is XSalsa20-Poly1305 encrypted with a key that never touches the server.

  • Curve25519 key agreement, secretbox AEAD
  • Relay only sees ciphertext, sharded by session id
  • Runs on Cloudflare Workers + Durable Objects
  • Self-host in one docker run
03 — security

The relay can't read your code.

Not "we promise not to." Not "encrypted in transit." Cryptographically incapable of decrypting a single byte.

┌─── Mac (clim wrapper) ──────┐
  generates 32-byte key
  encrypts every message
       
        encrypted bytes
└───────┼──────────────────────┘
        
        
   ┌──────────────────┐
     relay (dumb)    ← sees only ciphertext
     fan-out by sid 
   └─────────┼────────┘
             
             
┌────── iPhone (clim app) ───┐
  same key from pairing QR
  decrypts on device
  renders session UI
└─────────────────────────────┘

Zero-knowledge relay

Server code is public. It receives base64 blobs and forwards them by session id. Server operator (you or Cloudflare) has no ability to decrypt anything.

Symmetric key from pairing

The pairing QR carries a 32-byte random key generated on your Mac. Phone reads it once, stores it locally. No key ever transits the relay.

Authenticated encryption

Every payload is XSalsa20-Poly1305 via tweetnacl. Any bit-flip attack fails the MAC and gets dropped.

LAN mode needs none of this

Because packets literally don't leave your router. Cryptography is bolted on for cloud mode as belt AND suspenders — TLS breaks, MAC still holds.

04 — the app

What it actually looks like.

Real screenshots, straight off the build. Swipe →

clim pairing screen showing the orange prompt mark, a Scan new QR button and a LAN/Cloud toggle
01 / 05
Pair once
Scan the QR your Mac prints — or paste the invite line if the camera isn’t an option.
clim devices screen listing one MacBook Pro on the LAN holding three sessions
02 / 05
Your Macs, listed
Every Mac running clim on the network, with how many sessions each one is holding.
clim session list with three live sessions, one Claude session marked needs input and one Codex session
03 / 05
Every session, at a glance
Claude and Codex side by side. The one waiting on you is outlined and marked needs input.
clim conversation view showing a Claude exchange with three tappable numbered option rows
04 / 05
Tap the answer
The conversation as it was actually said. Numbered options become rows you can tap.
clim showing a Codex session rendered as a conversation rather than raw terminal output
05 / 05
Codex reads the same
Codex and Hermes have no transcript, so clim reads their turns off the screen — no terminal chrome.
05 — features

What the app actually does.

Not a passive log viewer. A real control surface for a real REPL.

Y/N

Yes / No taps

Parses the last assistant line for (y/n). Renders two big tap buttons. One press. Landed in your terminal.

1·2

Numbered options

When claude offers 1) 2) 3), they become tap rows on your phone. Whole label visible, huge orange key.

Multi-select

Detects "select all that apply" plus numbered items. Renders checkboxes. Send picks in one call.

Live "thinking" state

The moment your prompt lands in the transcript, the card flips to thinking — and back when the reply arrives. Cycling loader in Claude Code style.

Real replies only

Messages are read from Claude's own transcript, not scraped off the terminal. Tool calls, hook output, banners and box-drawing never show up as chat.

Terminal drilldown

Tap a session card, see the full transcript in a boxed terminal window. Traffic lights, monospace, scrollable.

Session discovery

mDNS Bonjour announces the relay. App scans _clim._tcp.local. Nearby Macs show up automatically.

Any REPL, not just claude

clim wrap <cmd> wraps anything. Python, sqlite3, node — same pipeline, same phone control.

Auto-reconnect + heartbeat

WebSocket ping every 25s. On close, retries with 2s backoff. Handles phone lock, WiFi flap, network switch.

06 — how clim compares

Not another cloud-locked remote.

Most Claude Code remote-control tools require a cloud account, a proprietary relay, and an Expo-wrapped app. clim does none of that.

feature
clim
other tools
LAN-only offline mode
yes — no cloud needed
requires their cloud
Account signup
none
required
E2E encrypted cloud relay
yes — Curve25519 + secretbox
varies
mDNS auto-discovery on WiFi
yes
pairing code entry
Native iOS (no Expo)
bare React Native CLI
Expo
Command to start
clim claude
multiple steps + account
Wraps Codex + any REPL
yesclim codex, clim wrap <cmd>
Claude only
Self-hostable relay
one docker run
rarely
Server sees plaintext?
never — zero-knowledge
depends on vendor
Different priorities. clim bets on LAN-first + no signup + Codex parity. Perfect for privacy-conscious devs who don't want a Mac tethered to another company's cloud.

Get clim.

Ship code from your phone in the next five minutes.

07 — help us improve

Something broken, or missing?

Tell us what went wrong, what you expected, or what clim should do next. Every message lands in our inbox.

Prefer email? dingalabsdev@gmail.com