Illustrazione underground stile zine — mani su una tastiera, bagliore verde fosforescente del terminale, iconografia Unix in collage ai bordi

Sto scrivendo questo stesso post dal telefono via SSH — screenshot di Termius su iOS connesso a Claude Code dentro tmux

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_SOCK prevedibile 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. Nessun rischio di sicurezza da agent forwarding. Il Pi è l’agent.

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-PageUp entra in copy mode. Posso scorrere migliaia di righe di output di Claude, log del terminale, output dei build. history-limit settato 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-Y attiva/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.

I risultati

Negli ultimi 30 giorni, ho fatto più di 5.000 commit su una dozzina di progetti — tutto da questo setup:

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.


Contents