← Tutti gli articoli

TermHub: il terminale del mio server, da qualsiasi dispositivo

Volevo una cosa sola: poter lavorare dal telefono o dal tablet senza portarmi il PC. E non intendo “leggere qualcosa” o lanciare un comando una tantum, ma proprio lavorare — aprire un terminale sul mio server, lanciare script, guidare gli assistenti AI che girano lì, e riprendere dal punto esatto in cui ero, che fossi al portatile, al tablet sul divano o in fila alla posta.

Nessuno strumento faceva esattamente questo con la combinazione di sicurezza, persistenza e comoda usabilità da mobile che cercavo. Così ho costruito TermHub.


Cos’è e come è fatto

TermHub è una web-app multi-sessione e multi-macchina sviluppata su misura (Node.js, WebSocket ws, node-pty e frontend xterm.js), con persistenza tmux lato server e accesso cifrato via Tailscale.

In una riga: un solo cervello centrale, molti schermi. Il lavoro e i dati risiedono sul server domestico; i dispositivi personali sono soltanto finestre di visualizzazione.

   [ iPhone / iPad ]   [ Mac ]   [ PC Windows ]  <- Client (Browser / PWA)
           \              |            /
            \             |           /          Tailscale HTTPS (443 solo-tailnet)
             \            |          /
         ┌─────────────────────────────────┐
         │        TermHub (backend)        │     <- Node.js + node-pty sul Beelink
         │       sul server di casa        │
         └────────────────┬────────────────┘

         ┌────────────────┼────────────────┐
         │                │                │
    tmux locale     ssh → Mac       ssh → Windows
    (Beelink root)  (+ tmux brew)   (+ OpenSSH + tmux)

Ogni scheda del browser rappresenta una shell attiva. Può essere il server stesso (Beelink) oppure via SSH trasparente sulla tailnet privata con autenticazione a chiavi asymmetric, il Mac o una macchina Windows.

Tutte le sessioni lanciano un’istanza tmux dedicata (th-<sessione>): è qui che risiede il segreto della persistenza totale.


Il cuore: la sessione non muore mai

Il processo del terminale reale (il pty) ed il relativo comando vengono eseguiti sul server, mai sul dispositivo client. Quando lo smartphone spegne lo schermo, va in standby o passa dal Wi-Fi di casa alla rete 4G/5G, accade questo:

Telefono Attivo        Standby / Cambio Rete        Riattivazione Telefono
───────────────        ─────────────────────        ──────────────────────
WebSocket vivo   ──►   WebSocket cade         ──►   WebSocket si riconnette (<1s)
pty web attivo         pty web viene chiuso         nuovo pty web agganciato
tmux collegato         tmux STACCATO (VIVO!)        tmux RI-COLLEGATO al pty
                       (il lavoro continua)         tmux ridisegna: tutto identico!

La sessione tmux rimane staccata ma in costante esecuzione sulla macchina remota. Alla riconnessione — che avviene in automatico non appena sblocchi il telefono — TermHub ri-aggancia l’istanza tmux esistente e ridisegna lo schermo in meno di un secondo.

Niente lavoro perso, niente re-login, nessuna sessione interrotta. Sblocchi lo schermo e ti ritrovi esattamente dove avevi lasciato la riga di comando.


Perché non uso le alternative: il confronto reale

Esistono diversi approcci per interagire con i propri server in mobilità. Ecco perché ho preferito costruire TermHub rispetto alle alternative esistenti.

vs Agenti AI e Framework di Dispatch (es. OpenClaw e simili)

Strumenti come OpenClaw o gateway per agenti autonomi lavorano sul modello del dispatch asincrono: fornisci un prompt o un task, l’agente va in esecuzione autonoma e ti restituisce un log o un report finale.

  • La differenza: Il dispatch è delega, non controllo interattivo. Non ti fornisce un terminale live in cui guidare passo-passo la sessione, fare debug a mano, o interagire al volo con script e CLI.
  • Come coesistono: TermHub non sostituisce gli agenti, li esalta. Spesso lanciare un agente come OpenClaw, Claude Code o script di automazione all’interno di una sessione TermHub è la combinazione perfetta: l’agente lavora sul server e tu puoi seguire l’output dal vivo da qualsiasi schermo o lasciare che continui in background dentro tmux.

vs SSH “nudo” da smartphone

Usare un normale client SSH da telefono è notoriamente frustrante:

  1. La connessione è fragile: al primo cambio di rete o blocco dello schermo, la sessione TCP cade, il processo si interrompe e perdi l’output.
  2. Interfaccia non pensata per il touch: mancano i tasti di controllo rapidi (Esc, Tab, Ctrl, frecce) e lo scroll del buffer è macchinoso.

TermHub impacchetta tutto in un’esperienza nativa:

  • PWA installabile su iOS e Android.
  • Keybar touch personalizzata: include pulsanti rapidi e comandi dedicati per lo scroll della copy-mode di tmux (tasti e per risalire l’output dello schermo senza impazzire col touch).
  • Drag & Drop dei file: trascini un file nella finestra del browser dal telefono/PC e questo compare direttamente nel filesystem del server.

Tabella Comparativa

CaratteristicaAgenti / OpenClawSSH StandardIDE / Terminali CloudTermHub
Sessione Persistente (Standby-proof)❌ No⚠️ Dipende dal cloud🟢 Sì (<1s reconnect)
Controllo Interattivo Live❌ No (Asincrono)🟢 Sì🟢 Sì🟢
Sovranità sui Dati & Zero Lock-in🟢 Sì (se locale)🟢 Sì❌ No (dati su terzi)🟢 Sì (100% Locale/Tailnet)
Ottimizzato per Mobile / Touch⚠️ Parziale❌ No⚠️ Scomodo🟢 Sì (Keybar + PWA)
Multi-Macchina da un solo Hub❌ No❌ No⚠️ Con configurazione🟢 Sì (Server/Mac/Win)

Sicurezza: Cifratura totale senza porte esposte

Concedere l’accesso a una shell di sistema da un browser richiede massima attenzione alla sicurezza. TermHub implementa una difesa a livelli:

  1. Rete Privata Tailscale (tailscale serve): TermHub è in ascolto in HTTPS (porta 443) esclusivamente sulla tailnet privata. Non viene utilizzato alcun funnel pubblico; la web-app non è raggiungibile da internet, ma solo dai dispositivi autorizzati nella propria mesh VPN.
  2. Autenticazione via Token a Tempo Costante: L’accesso richiede un token cifrato salvato in modo sicuro.
  3. Isolamento delle Porte per Media e Upload: Eventuali servizi pubblici (es. server media temporanei) vengono veicolati su porte separate (es. 8443) per garantire che l’interfaccia di TermHub rimanga al 100% segregata e privata.

I limiti (onestamente) e le soluzioni adottate

Un’applicazione web eseguita nel browser non può sfruttare i protocolli di rete UDP nativi come mosh (progettato per mantenere connessioni instabili).

TermHub ottiene lo stesso identico risultato operativo combinando la persistenza di tmux lato server con la riconnessione automatica del client WebSocket. Se la rete si interrompe per 10 minuti, il server continua a lavorare in background; quando riapri la PWA sul telefono, lo stato viene ripristinato istantaneamente.


Conclusione

TermHub rappresenta l’applicazione pratica del principio di riprendersi la proprietà dei propri dati e della propria infrastruttura: invece di dipendere da servizi cloud terzi o da ambienti di sviluppo in abbonamento, un singolo server domestico diventa una centrale operativa accessibile in totale sicurezza da qualunque dispositivo.

Che sia per controllare un log, lanciare una pipeline di automazione o dialogare con l’AI mentre si è in viaggio, il terminale di casa è sempre lì: a un tap di distanza.


Fonti e Approfondimenti