Watch your terminal from your phone — a little stream of your shell.
rill wraps your shell (or any command) in a pseudo-terminal, mirrors it to
your local terminal and broadcasts it over a WebSocket. It prints a QR code;
scan it with your phone and you get a live xterm view with a touch keyboard.
A cloudflared tunnel gives a public https link so it works on cellular —
anywhere, not just the same Wi-Fi. When a long command finishes, your phone
gets pinged.
Built as a from-scratch, own-brand take on remoto.sh.
rill # share your shell
rill npm run build # run a command, stream it, get pinged when it finishes
rill --local # same Wi-Fi only (skip the public tunnel)
rill --port 7000 # pin a local portScan the QR, watch the live session, type on the touch keyboard. Exit the shell (Ctrl-D) — or Ctrl-C — to stop sharing.
cli/
bin/rill.js entry — arg parse + orchestration
src/
session.js node-pty wrap + rolling scrollback buffer
server.js http (serves web/) + ws broker, per-run token auth
tunnel.js cloudflared public-URL wrapper
net.js LAN address pick
ui.js the terminal-side connect card (QR + url)
web/ the mobile terminal (xterm.js + touch keyboard, PWA)
scripts/postinstall.js restores +x on node-pty's spawn-helper
- client ->
{type:'auth', token}then{type:'input', data}/{type:'resize', cols, rows} - server ->
{type:'hello', cols, rows, command},{type:'output', data},{type:'exit', code},{type:'resize',...},{type:'notify', title, body},{type:'denied'}
Core loop works end-to-end: PTY stream, QR, LAN + cloudflared tunnel, scrollback replay for late joiners, touch keyboard, in-page done-notifications.
Next: background web-push (VAPID), a hosted relay + short URLs at getrill.sh,
and the landing page.
— npx @hellowade/rill