Questo sono io che scrivo questo post. Dal telefono. Via SSH. Dalla vasca da bagno, probabilmente.
Claude Code è un tool CLI. Gira in un terminale. E tanto mi bastava.
Il setup¶
Ho un Raspberry Pi 5 con Debian Trixie a casa. Si chiama nowhere (lunga storia). Claude Code gira lì, dentro tmux, 24/7. Lo raggiungo da qualsiasi dispositivo — telefono, tablet, laptop — con un SSH e un reattach:
ssh nowhere
tmux -u at
Tutto qui. Due comandi e sono esattamente dove ho lasciato. Il flag -u abilita il supporto Unicode (emoji nelle status line, caratteri box-drawing), e at è abbreviazione di attach -t 0. La sessione persiste attraverso disconnessioni, riavvii dei dispositivi client, cambi di rete — tutto. Posso iniziare un task sul laptop, continuarlo dal telefono mentre porto fuori il cane, e finirlo sul tablet dal divano.
Roaming totale delle sessioni tra dispositivi. Zero stato perso. Mai.
La filosofia Unix, viva e vegeta¶
Ecco lo stack, dal basso verso l’alto:
- Debian Trixie (aarch64) — perché ho un tatuaggio Debian sul braccio e a questo punto è un impegno
- Unit systemd utente per
ssh-agent— parte al login, attivata via socket,SSH_AUTH_SOCKprevedibile a/run/user/1000/openssh_agent - tmux — multiplexer, persistenza della sessione, scrollback, copia-incolla, gestione finestre
- Claude Code — l’AI che fa il lavoro vero
- SSH — il trasporto universale
Niente Docker. Niente Kubernetes. Niente tunnel remoti di VS Code. Niente IDE cloud. Niente Electron. Solo Unix.
Il trucco dell’SSH agent¶
L’agent è gestito da systemd e il path del socket è hardcodato in .bashrc:
export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/openssh_agent"
Questo significa che Claude Code — che gira dentro tmux, dentro una shell — ha automaticamente accesso alle mie chiavi SSH. Può fare git push, ssh sui miei server, deploy su staging e produzione, tutto senza agent forwarding. Le chiavi stanno sul Pi, l’agent è sempre in esecuzione, e ogni shell (inclusa quella di Claude) eredita il path del socket.
Nessun flag -A necessario dal lato client. Il Pi è l’agent.
Una nota di cautela (grazie a Yaroslav per la segnalazione): questa è una scelta di comodità che sacrifica un po’ di sicurezza. Avere le chiavi direttamente sul Pi significa che se la scatoletta viene compromessa, l’attaccante ha accesso a tutto quello che quelle chiavi aprono. L’approccio più sicuro è fare forwarding dell’agent dalla sessione terminale (con ssh -A) e caricare le chiavi on-demand da uno store protetto da password su un dispositivo sotto il vostro controllo fisico. Sto valutando di passare a chiavi solo in forwarding — il setup attuale regge perché il Pi non è esposto a internet e non può ricevere comandi da nessun servizio connesso alla rete, ma la defense in depth è sempre la scelta migliore.
tmux: il vero IDE¶
Il mio tmux usa Ctrl-F come prefix key (scusa, find, sei morto per me) e tengo finestre multiple con etichette descrittive:
0:sysadm 1:gastone 2:sindrome 3:gastone-logs
Ogni finestra è un progetto. Ogni progetto ha Claude Code in esecuzione. Posso saltare tra una e l’altra con ^F 0, ^F 1, ecc. Pane split per log, htop, o una shell parallela quando serve.
Le killer feature per questo workflow:
- Scrollback —
Shift-PageUpentra in copy mode. Posso scorrere migliaia di righe di output di Claude, log del terminale, output dei build.history-limitsettato a 10.000 righe. - Copia-incolla — il copy mode nativo di tmux con keybinding vi. Seleziona, yank, paste. Nessun mouse necessario (anche se il mouse mode è attivo per lo scroll pigro occasionale).
- Sync dei pane —
^F Ctrl-Yattiva/disattiva l’input sincronizzato su tutti i pane. Utile per mandare lo stesso comando su viste split.
WireGuard: mobilità seamless¶
Ho una VPN WireGuard configurata come on-demand su tutti i miei dispositivi. Quando sono sul WiFi di casa, il traffico va diretto sulla LAN. Quando esco, WireGuard si attiva automaticamente e mi tunnella a casa.
La connessione SSH cade quando l’endpoint cambia da un IP LAN locale a uno VPN — il TCP non sopravvive. Ma non importa: su Termius tocchi “Start over”, la connessione si ristabilisce in un secondo, scrivi tmux -u at, e sei esattamente dove eri prima. La sessione tmux non è andata da nessuna parte. Tempo totale: tre secondi.
Il mio ~/.ssh/config sul laptop e le connessioni salvate in Termius usano entrambi l’IP LAN locale del Pi. WireGuard gestisce il routing indipendentemente da dove mi trovo fisicamente. Stesso IP, stessa connessione, che sia in salotto o al bar.
Il setup da telefono¶
Su iOS uso Termius (versione free). Connessione salvata a nowhere, chiave SSH importata, fatto. Il trucco fondamentale: ho mappato Ctrl-F (il mio prefix tmux) su un pulsante sopra la tastiera. Questo mi dà il controllo completo di tmux dal telefono — cambiare finestre, splittare pane, entrare in copy mode, tutto.
Lo scrolling funziona benissimo — Termius converte gli eventi touch in scroll, quindi scorro su e giù nell’output di Claude col dito. Sensazione completamente naturale.
Il telefono è sorprendentemente usabile per questo workflow. Non scrivo codice da lì (quello lo fa Claude), ma posso rivedere diff, approvare tool call, leggere output dei build, controllare staging, e dare istruzioni a Claude. Che è il 90% di quello che faccio comunque.
E qui c’è il bello della scrittura da telefono: faccio un numero assurdo di typo. Guardate lo screenshot qui sopra — quel prompt è pieno di errori. Ma non importa. I LLM sono fuzzy matcher per natura. Interpretano l’intento, non i singoli tasti. “stsging” è “staging”, “tge” è “the”, “donMr” è “don’t” — Claude non batte ciglio. Questo trasforma quella che sarebbe normalmente una tortura (tastierina, dita grosse, autocorrect che ti rema contro) in un non-problema. Scrivi veloce, non correggi, e funziona. I typo diventano una feature del workflow, non un bug.
Perché non mosh?¶
Andrei mi ha suggerito di provare mosh — una shell mobile basata su UDP che sopravvive ai cambi di IP e alle disconnessioni senza perdere la sessione. Sembra il fit perfetto per questo tipo di workflow nomade, quindi l’ho provato.
Il problema insormontabile: mosh non supporta scrollback né eventi mouse. Funziona sincronizzando lo stato dello schermo invece di trasmettere byte grezzi — by design, dal 2012. Questo significa che su Termius perdo il touch-to-scroll, che è come leggo l’output di Claude, i log dei build, e i diff dal telefono. Il senso stesso del workflow mobile è scorrere centinaia di righe di output col dito, e mosh lo ammazza.
In pratica, le disconnessioni sono rare — WireGuard è molto efficiente nel tenere su il link VPN, il che permette a Termius in background di continuare a mandare TCP keepalive e tenere viva la connessione SSH. L’unico momento in cui cade è al cambio di endpoint (LAN ↔ VPN), e mi costa tre secondi e due comandi. Una tassa che pago volentieri per tenermi lo scrollback touch funzionante.
I risultati¶
Negli ultimi 30 giorni, ho fatto più di 5.000 commit su una dozzina di progetti — tutto da questo setup:
- Rifatto completamente questo blog — tradotti 69 post, ridisegnato il layout, aggiunto l’Easter egg della sequenza di boot. Nessun IDE, nessun Figma, nessun tool di design. Solo Claude Code e il live preview di Superpowers per il lavoro visuale.
- Scritto un componente custom per Home Assistant per Verisure Italy — reverse-engineered le loro API GraphQL, scritto l’intero componente Python, pubblicato su PyPI.
- Creato WiFi Dethrash, un analizzatore di reti mesh per OpenWrt.
- Scritto un sistema di rilevamento presenza WiFi per Home Assistant.
- Costruito tool per modem 5G per OpenWrt.
- Riprocessato due anni di log attraverso una pipeline di enrichment completa.
Ogni singolo progetto fatto dal terminale. CSS, Python, Go, Lua, shell script, template Hugo, config nginx, unit systemd, codice di networking kernel-adjacent. L’intero stack, dall’alto al basso, da riga di comando.
Perché funziona¶
L’intuizione è che Claude Code non ha bisogno di un IDE perché è l’IDE. Legge file, li modifica, lancia test, controlla l’output dei build, itera. Il terminale è il suo habitat naturale. Aggiungere un layer grafico sopra non aiuta — si mette in mezzo.
E tmux è il compagno perfetto perché ti dà tutto quello che il concetto di “workspace” di un IDE moderno offre — sessioni persistenti, contesti multipli, cronologia ricercabile, layout dei pane — senza nessun bloat.
Ho iniziato a programmare in QBasic su un Olivetti Prodest PC1 — un 8088 — nel 1988. Avevo sette anni, fissavo un terminale ambra 80x25, e pensavo fosse la cosa più magica del mondo. Poi l’industria ha speso 35 anni a convincermi che avevo bisogno di GUI, mouse, IDE, debugger visuali, tool di deploy point-and-click. Adesso l’AI mi riporta a un terminale, una tastiera, e la capacità di descrivere quello che voglio in linguaggio naturale.
Ho chiuso il cerchio, e non sono mai stato più felice a giocare con i computer.