The three pieces (all free)
Tailscale gives your phone a private, encrypted path to your machine from anywhere — no port forwarding, no public IP. tmux keeps the session alive between connections. An SSH app on the phone is the window into it.
One-time setup · ~5 minutes
- Install Tailscale on both devices.
tailscale.com/download on the Mac (or Linux box) and the phone app store; sign both into the same tailnet. Note your machine's tailnet name (e.g.
teds-macbook). - Enable SSH on the machine.
macOS: System Settings → General → Sharing → Remote Login (or
sudo systemsetup -setremotelogin on). Linux:sudo systemctl enable --now sshd. Prefer key auth: generate a key in the phone app, paste the public key into~/.ssh/authorized_keys. - Install tmux
brew install tmux(macOS) or your package manager. Recommended for cellular:brew install mosh. - Pick a phone SSH app.
iOS: Blink Shell (best keyboard for TUIs, mosh built in) or Termius. Android: Termius or JuiceSSH. Add a host entry for the tailnet name so connecting is one tap.
Daily use
On the machine, start (or rejoin) cheep inside tmux:
tmux new -As cheep # -As: attach if it exists, create if not
cheep
From the phone:
ssh teds-macbook -t 'tmux attach -t cheep'
# flaky networks / switching wifi↔cellular:
mosh teds-macbook -- tmux attach -t cheep
You're now in the exact same
session — same conversation, same running task, same tabs, same pending approvals. Detach
with ctrl+b d (or just close the app; tmux doesn't care). Anything you started
from the phone is still there when you sit back down at the desk — and vice versa.
The walk-away workflow
# at your desk:
› rewrite the storage layer to use sqlite; iterate until `go test ./...` passes
/budget 3 # bound the worst case
# … leave. later, from the couch:
ssh teds-macbook -t 'tmux attach -t cheep'
# glance at the tab glyphs (● running · ✓ done · ⚠ stuck · ✗ error),
# /tokens for spend, answer any queued approval, queue the next task, detach
Pair it with /nomistakes on and nothing can merge
while you're away — held work waits on branches for your sign-off, and the approval overlay
is right there the next time you attach. Before a long break, /stow writes
lessons and a done / in-flight / next-steps note to ~/.cheep/history/notes.md.
If the machine ever dies mid-task, the next launch lists exactly which delegations were
interrupted and which branches hold their partial work.
Tips
- Phone keyboardscheep leans on Tab / Shift+Tab / Ctrl+W / Esc. Blink and Termius
both show a key toolbar above the keyboard; slash commands (
/mode,/close,/history) cover the same actions when a chord is awkward. - mosh > ssh on the movemosh roams across wifi/cellular and survives the phone
sleeping for hours. Blink has it built in;
brew install moshon the machine. - Keep the machine awakemacOS:
caffeinate -sin another tmux window, or Energy Settings → prevent sleep on power. A sleeping Mac runs no agents. - Scrollback
ctrl+b [puts tmux in copy mode for scrolling history;qexits. Inside cheep, PgUp/PgDn scroll the focused tab. - Zellij works too
zellij attachbehaves the same way. Browser-based alternative: ttyd (ttyd -W tmux attach -t cheepbound to the tailnet address), but SSH + tmux is less to secure. - Why not a built-in server?A future
cheep servecould host the shell over the web — but tmux gives attach/detach resilience, multi-device access, and scrollback for free, with Tailscale handling auth and encryption. It works today.
Cheat sheet
| Where | Command |
|---|---|
| Machine, once per boot | tmux new -As cheep then cheep |
| Phone, connect | ssh <tailnet-name> -t 'tmux attach -t cheep' |
| Phone, flaky network | mosh <tailnet-name> -- tmux attach -t cheep |
| Anywhere, leave | ctrl+b d — detach; everything keeps running |
| Before stepping away | /stow · /budget · optionally /nomistakes on |