
Chat da terminale sicura. Crittografia E2E, server di inoltro cieco con zero metadati. PyNaCl XSalsa20-Poly1305 + Ed25519 + segretezza in avanti. Python multipiattaforma.
Chat di gruppo crittografata end-to-end, messaggi privati e trasferimento file nel tuo terminale. Il server è un forwarder cieco: non può leggere i tuoi messaggi, non conosce il tuo nome utente, non conosce la stanza in cui ti trovi e non può collegare due messaggi alla stessa persona, anche se completamente compromesso.
https://github.com/user-attachments/assets/d9faabfb-73bd-46dd-92b2-23f63daf5b06
https://github.com/user-attachments/assets/e8e0220d-cd7d-45a2-9443-9a5f20b57f12
https://github.com/user-attachments/assets/15fb383d-a02a-433e-bbd9-8ebadecf9481
https://github.com/user-attachments/assets/bca10cb1-6959-425d-96d6-fc1fbf845538
NoEyes è uno strumento di chat da terminale in Python per piccoli gruppi fidati. Il server non decrittifica mai nulla e non vede mai chi sei - gestisce solo token opachi e inoltra byte crittografati.
Tu generi la chiave, la condividi out-of-band e il server non viene a sapere nulla delle tue conversazioni.
Utile per piccoli gruppi fidati che vogliono comunicazioni crittografate senza fidarsi di alcun server di terze parti, per chi vuole auto-ospitare una chat privata con vera crittografia end-to-end, o per chiunque voglia capire esattamente cosa un server può e non può vedere.
| Feature | Details |
|---|---|
| Server a metadati zero | Il server non vede mai nomi utente, nomi delle stanze o chiavi pubbliche, solo token opachi |
| Mittente sigillato | L'identità del mittente vive nel payload crittografato, mai nell'header di instradamento |
| Server di inoltro cieco | Zero decrittazione, il server inoltra blob crittografati che non può leggere |
| Forward secrecy | /ratchet start — protocollo Sender Keys, ogni messaggio è crittografato con una chiave derivata unica, i messaggi passati sono al sicuro anche se la chiave corrente viene compromessa |
| Chat di gruppo | Chiavi XSalsa20-Poly1305 per stanza derivate tramite BLAKE2b, stanze isolate crittograficamente |
| Messaggi privati | Handshake X25519 DH al primo contatto, chiave di coppia detenuta solo dalle due parti |
| Trasferimento file | Streaming ChaCha20-Poly1305, qualsiasi dimensione, basso utilizzo di RAM, pausa/ripresa tra le riconnessioni |
| Identità Ed25519 | Chiave di firma generata automaticamente, tutti i messaggi e i file sono firmati |
| TOFU | Le chiavi viste per la prima volta sono considerate affidabili; le discrepanze delle chiavi attivano un avviso di sicurezza visibile |
| Salt PBKDF2 casuale | Ogni installazione riceve un salt casuale unico, le tabelle arcobaleno sono inutili |
| TLS + cert pinning | Trasporto crittografato, certificato del server bloccato al primo contatto tramite TOFU |
| Protezione anti-replay | Deque degli ID messaggio per stanza, i frame riprodotti vengono scartati silenziosamente |
| Pannello laterale diviso | Stanze (in alto) e utenti (in basso) sempre visibili, ogni metà scorre in modo indipendente |
| Animazione di avvio CRT | Effetto fosforico a schermo intero con audio all'avvio |
| Animazione di attivazione del ratchet | Effetto CRT a schermo intero con arte a ingranaggi in braille, sfarfallio glitch, spazzata del riflettore, SFX sincronizzati e transizione della TUI verso il rosso |
| Launcher guidato | Interfaccia a menu con tasti freccia, nessuna esperienza con la riga di comando richiesta |
| Installer automatico delle dipendenze | Rileva la tua piattaforma, installa ciò che manca, chiede prima di modificare qualsiasi cosa |
python ui/setup.py
python ui/launch.py
`ui/launch.py` ti guida nell'avvio di un server o nella connessione a uno.
---
### Opzione B - Se Python non è ancora installato
| Piattaforma | Esegui prima questo |
|---|---|
| Linux / macOS / Termux / iSH | `sh install/install.sh` |
| Windows | `install\install.bat` |
Entrambi gli script installano Python se manca, poi passano automaticamente a `setup.py`.
---
### Opzione C - Manuale```bash
# 1. Install dependencies
pip install cryptography PyNaCl
# 2. On the server machine — generate the access key
python noeyes.py --generate-access-key
# Prints an access code hex string — share with clients via USB
# 3. On a client machine — generate chat.key from the access code
python noeyes.py --generate-chat-key <ACCESS_CODE_HEX> --key-file ./chat.key
# Distribute chat.key to all other clients via USB. Never put it on the server.
# 4. Start the server (does NOT need the key file)
python noeyes.py --server --port 5000
# Start without bore tunnel (LAN / static IP / custom tunnel)
python noeyes.py --server --port 5000 --no-bore
# Start without adding a firewall rule (not needed when using bore tunnel)
python noeyes.py --server --port 5000 --no-firewall
# 5. Connect clients - each person needs their own identity file
python noeyes.py --connect SERVER_IP --port 5000 --username alice --key-file ./chat.key --identity-path ~/.noeyes/identity_alice.key
python noeyes.py --connect SERVER_IP --port 5000 --username bob --key-file ./chat.key --identity-path ~/.noeyes/identity_bob.key
Importante: Ogni utente deve avere il proprio file di identità. Due client che condividono lo stesso file di identità ricevono lo stesso token della casella di posta e il server rifiuterà il secondo come sessione duplicata. Il file di identità viene generato automaticamente al primo avvio, basta passare un
--identity-pathunivoco per ogni utente.
Scarica Termux da F-Droid (consigliato): https://f-droid.org/packages/com.termux/
Mantieni viva la sessione - installa tmux così NoEyes continua a funzionare quando cambi app:```bash pkg install tmux -y tmux python ui/launch.py
**Permessi di archiviazione** - il trasferimento di file fallirà senza questo:```bash
termux-setup-storage
| Comando | Descrizione |
|---|---|
/help | Mostra tutti i comandi |
/quit | Disconnetti ed esci |
/clear | Cancella i messaggi dallo schermo |
/users | Elenca gli utenti nella stanza corrente |
/join <room> | Passa a una stanza (avvisa se si è in un ratchet attivo) |
/leave | Torna alla stanza generale (avvisa se si è in un ratchet attivo) |
/msg <user> <text> | Invia un messaggio privato cifrato E2E |
/send <user> <file> | Invia un file cifrato |
/whoami | Mostra la tua impronta di identità |
/trust <user> | Fida della nuova chiave di un utente dopo una reinstallazione |
/notify on|off | Attiva/disattiva i suoni di notifica |
/ratchet start | Propone chiavi rotanti a segretezza avanzata a tutti i membri della stanza (tutti devono confermare) |
/ratchet invite <u> | Re-invita un utente al ratchet dopo che si è ricongiunto (provoca un riavvio completo — nessuna chiave di catena viene inoltrata) |
/proceed | Durante l'attesa di migrazione, vota per abbandonare un peer offline e riprendere |
| Tasto | Azione |
|---|---|
↑ / ↓ | Scorri la chat in alto / in basso |
PgUp / PgDn | Scorri la chat di una pagina |
^P (Ctrl+P) | Mostra / nascondi il pannello laterale |
^C | Esci |