Parley: chat federado y descentralizado que habla IRC puro sin plugins
El proyecto reparte la red en instancias por dominio, las empareja solas mediante DNS y firmas ed25519, y sirve todo a irssi, WeeChat o Textual tal cual. Es una prueba de concepto que ya funciona.
Parley es una red de chat federada y descentralizada en la que cada persona o equipo levanta una instancia para su propio dominio y habla con clientes IRC corrientes —irssi, WeeChat, Textual— sin plugins de por medio. El autor lo presenta como una prueba de concepto que funciona: el diseño se demuestra de extremo a extremo y hay una instancia real en marcha, pero avisa de que todavía no está endurecido.
La identidad se parece a una dirección de correo. alice@foo.com vive en foo.com y bob@bar.com en bar.com; Bob escribe /msg alice@foo.com y la conversación arranca aunque las dos instancias no se hayan visto nunca. Al otro lado llega IRC de siempre: el nick es la parte local de la dirección y la instancia es el host, así que prefijos, NAMES, WHO y WHOIS coinciden entre sí y un nick que ves en NAMES es uno al que puedes escribir.
Descubrimiento y federación
Los nodos se localizan por DNS con un registro SRV _parley._tcp.<dominio> y publican su clave pública ed25519 y su bandeja en https://<host>/.well-known/parley/instance.json; un fichero hermano confirma que un usuario existe. Salty IM resuelve el mismo problema de forma parecida.
Cada evento viaja como un documento JSON enviado por POST a la bandeja del par, con firma ed25519 separada en las cabeceras. El receptor verifica con la clave que ha descubierto por su cuenta. La federación es abierta: cualquier instancia cuya firma cuadre puede hablar. Y el emparejamiento es automático, porque las instancias enlazadas se intercambian los pares que conocen y la malla se forma sin tocar configuración.
Del lado del cliente, el servidor ofrece las extensiones IRCv3 habituales en este terreno: server-time, message-tags, echo-message, multi-prefix y setname, además de relay de TAGMSG para indicadores de escritura, que viajan por la federación igual que entre clientes locales. Las etiquetas de un mensaje se conservan, así que un +reply sigue siendo una respuesta cuando sale del historial, y draft/multiline convierte un párrafo pegado en un solo mensaje. CHATHISTORY pagina canales y mensajes privados, un JOIN reproduce lo que no se había visto y draft/read-marker deja el punto de lectura en la cuenta, de forma que marcar un canal como leído en el móvil lo limpia en el escritorio.
Canales, moderación y despliegue
Hay dos clases de canal. #dev es global: se replica en todas las instancias enlazadas con miembros dentro. No tiene dueño, así que tampoco tiene tema ni operadores. ¬es es local, no sale de la instancia, es invisible para los pares y es el único sitio con tema.
Como nadie posee los canales globales, no se puede expulsar a nadie de ellos: /ban se convierte en una lista de bloqueo por máscara, desde una persona concreta hasta un dominio entero. La lista de tu cuenta cubre tu cuenta; la de un administrador cubre la instancia. El control de pares se lleva con parleyctl peers.
Las cuentas viven en el directorio de datos, no en un fichero de configuración, y se crean con parleyctl, la página de administración o la API HTTP. Admite inicio de sesión único con cualquier proveedor OpenID Connect o con cabeceras de identidad de un proxy inverso; los usuarios acuñan tokens IRC desde su página de ajustes y los bots son cuentas con rol de bot. El historial de canales va a SQLite con índice de texto completo (parleyctl search) y se sirve en /channels/<nombre>/feed. Cuando un par vuelve tras una caída se trae lo que se perdió, y los clientes reciben el historial reciente al hacer JOIN.
Para montarlo hay imagen de contenedor, prologic/parley, y un docker-compose de ejemplo. Hace falta /data en almacenamiento persistente —ahí van la clave de la instancia, la caché de pares, los registros de canales y las cuentas—, un proxy inverso que termine TLS delante del puerto 8443, porque parleyd sirve HTTP plano salvo que se le pasen certificado y clave, y un registro SRV para que los demás te encuentren; sin él, los pares tiran de https://example.com/.well-known/parley/. El listener IRC también es texto plano y hay que envolverlo en TLS aparte. Si no hay token de administrador y aún no existe ninguna cuenta, parleyd registra en el log una URL /setup de un solo uso que crea el primer administrador desde el navegador.
IRC lleva décadas funcionando y el modelo de instancias pequeñas que se descubren solas es el mismo que ya usan el correo o el Fediverso, así que la parte difícil no es el diseño: es el endurecimiento que el propio proyecto admite que le falta. Merece seguimiento si te interesa montar mensajería sin depender de un servidor central, pero hoy es un banco de pruebas, no algo que poner delante de un equipo entero.


