
Chat de terminal seguro. Servidor de reenvío ciego con cifrado E2E y cero metadatos. PyNaCl XSalsa20-Poly1305 + Ed25519 + secreto hacia adelante. Python multiplataforma.
Chat grupal cifrado de extremo a extremo, mensajes privados y transferencia de archivos en tu terminal. El servidor es un reenviador ciego: no puede leer tus mensajes, no conoce tu nombre de usuario, no conoce la sala en la que estás y no puede relacionar dos mensajes con la misma persona, incluso si está completamente comprometido.
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 es una herramienta de chat de terminal en Python para pequeños grupos de confianza. El servidor nunca descifra nada y nunca ve quién eres: solo maneja tokens opacos y reenvía bytes cifrados.
Tú generas la clave, la compartes fuera de banda, y el servidor no aprende nada sobre tus conversaciones.
Útil para pequeños grupos de confianza que quieren comunicaciones cifradas sin confiar en ningún servidor de terceros, para alojar tu propio chat privado con cifrado de extremo a extremo real, o para cualquiera que quiera entender exactamente qué puede y qué no puede ver un servidor.
| Característica | Detalles |
|---|---|
| Servidor de cero metadatos | El servidor nunca ve nombres de usuario, nombres de salas ni claves públicas, solo tokens opacos |
| Remitente sellado | La identidad del remitente vive dentro de la carga útil cifrada, nunca en la cabecera de enrutamiento |
| Servidor de reenvío ciego | Cero descifrado; el servidor reenvía blobs cifrados que no puede leer |
| Secreto de reenvío | /ratchet start — Protocolo Sender Keys, cada mensaje se cifra con una clave derivada única; los mensajes pasados están a salvo incluso si la clave actual se filtra |
| Chat grupal | Claves XSalsa20-Poly1305 por sala derivadas mediante BLAKE2b; las salas están aisladas criptográficamente |
| Mensajes privados | Handshake X25519 DH en el primer contacto; solo las dos partes poseen la clave por pares |
| Transferencia de archivos | Streaming ChaCha20-Poly1305, cualquier tamaño, bajo uso de RAM, pausa/reanudación entre reconexiones |
| Identidad Ed25519 | Clave de firma autogenerada; todos los mensajes y archivos están firmados |
| TOFU | Las claves vistas por primera vez son de confianza; las discrepancias de claves activan una advertencia de seguridad visible |
| Sal PBKDF2 aleatoria | Cada implementación obtiene una sal aleatoria única; las tablas arcoíris son inútiles |
| TLS + fijación de certificados | Transporte cifrado; el certificado del servidor se fija en el primer contacto mediante TOFU |
| Protección contra reproducción | Deque de ID de mensaje por sala; las tramas reproducidas se descartan silenciosamente |
| Panel lateral dividido | Salas (arriba) y usuarios (abajo) siempre visibles; cada mitad se desplaza de forma independiente |
| Animación de arranque CRT | Efecto fósforo a pantalla completa con sonido al inicio |
| Animación de activación del trinquete | Efecto CRT a pantalla completa con arte de engranaje en braille, parpadeo de glitch, barrido de foco, efectos de sonido sincronizados y transición del marco TUI a rojo |
| Lanzador guiado | Interfaz de menú con teclas de flecha; no se necesita experiencia en línea de comandos |
| Instalador automático de dependencias | Detecta tu plataforma, instala lo que falta y pregunta antes de cambiar nada |
python ui/setup.py
python ui/launch.py
`ui/launch.py` te guía para iniciar un servidor o conectarte a uno.
---
### Opción B - Si Python aún no está instalado
| Plataforma | Ejecuta primero esto |
|---|---|
| Linux / macOS / Termux / iSH | `sh install/install.sh` |
| Windows | `install\install.bat` |
Ambos scripts instalan Python si falta, y luego pasan automáticamente el control a `setup.py`.
---
### Opción C - Manual```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: Cada usuario debe tener su propio archivo de identidad. Dos clientes que compartan el mismo archivo de identidad obtienen el mismo token de bandeja de entrada y el servidor rechazará el segundo como sesión duplicada. El archivo de identidad se genera automáticamente en la primera ejecución; solo pasa una
--identity-pathúnica por usuario.
Descarga Termux desde F-Droid (recomendado): https://f-droid.org/packages/com.termux/
Mantén la sesión activa - instala tmux para que NoEyes siga ejecutándose cuando cambies de aplicación:```bash pkg install tmux -y tmux python ui/launch.py
**Permisos de almacenamiento** - la transferencia de archivos fallará sin esto:```bash
termux-setup-storage
| Comando | Descripción |
|---|---|
/help | Muestra todos los comandos |
/quit | Desconecta y sale |
/clear | Limpia los mensajes de la pantalla |
/users | Lista los usuarios en la sala actual |
/join <room> | Cambia a una sala (avisa si hay un ratchet activo) |
/leave | Vuelve a la sala general (avisa si hay un ratchet activo) |
/msg <user> <text> | Envía un mensaje privado cifrado E2E |
/send <user> <file> | Envía un archivo cifrado |
/whoami | Muestra tu huella de identidad |
/trust <user> | Confía en la nueva clave de un usuario después de que reinstale |
/notify on|off | Activa o desactiva los sonidos de notificación |
/ratchet start | Propone claves rotatorias de secreto hacia adelante a todos los miembros de la sala (todos deben confirmar) |
/ratchet invite <u> | Reinvita a un usuario al ratchet después de que se reincorpore (provoca un reinicio completo: no se reenvían claves de cadena) |
/proceed | Durante la espera de migración, vota para descartar un peer sin conexión y reanudar |