Mensajería en tiempo real
Chats privados, grupos y un chat personal de "mensajes guardados". Respuestas, reenvío, edición y borrado, menciones con @, reacciones, indicador de escritura y confirmaciones de entrega y lectura.
Socket.IOLINK es una aplicación de mensajería en tiempo real —chats privados, grupos, archivos, notas de voz y llamadas 1 a 1— que funciona en tu propia infraestructura. Es un proyecto independiente que construyo y mantengo en abierto: el código, las decisiones de diseño y las limitaciones conocidas están en el repositorio.
Lo que funciona hoy, tal como está en el código. Las limitaciones están más abajo, en Estado del proyecto.
Chats privados, grupos y un chat personal de "mensajes guardados". Respuestas, reenvío, edición y borrado, menciones con @, reacciones, indicador de escritura y confirmaciones de entrega y lectura.
Socket.IOAdjunta archivos e imágenes, graba notas de voz o toma una foto con la cámara. Los archivos se guardan en disco local o en cualquier servicio compatible con S3, donde las subidas grandes van por partes y se pueden reanudar.
Disco local o S3Llamadas 1 a 1 con WebRTC, de navegador a navegador: el servidor retransmite la señalización y guarda el historial, pero el audio y el video nunca pasan por él. Incluye tonos de llamada, cambio de cámara y micrófono, y notificaciones push de llamadas entrantes.
WebRTC • 1 a 1Admins por grupo y reglas propias de cada grupo sobre quién puede agregar o quitar miembros, editar el grupo, eliminarlo o salir de él, por encima de los valores generales de la instalación. Encuestas de opción única o múltiple y envío de contactos.
Encuestas • admins de grupoUn panel de administración para la configuración general y el almacenamiento, las cuentas de usuario (crear, restablecer contraseñas, desactivar), la política de sesión y contraseñas, la retención de mensajes y un registro de auditoría de las acciones sensibles.
Panel de administraciónUna Progressive Web App que puedes instalar en escritorio y en el móvil, con notificaciones Web Push. La interfaz está en español e inglés, con tema claro y oscuro.
PWAUn monorepo en TypeScript con dos aplicaciones: una API en Express + Socket.IO sobre PostgreSQL y un cliente en Next.js. Cada módulo del backend tiene su propio README con sus decisiones.
Socket.IO con una sala por conversación y una sala personal por usuario. El handshake se autentica con el token de sesión, y para entrar a la sala de una conversación se verifica la membresía. Mensajes, confirmaciones, indicador de escritura, reacciones y señalización de llamadas comparten ese canal.
backend/src/socket →WebRTC con la señalización (oferta, respuesta y candidatos ICE) retransmitida por Socket.IO. El backend sigue el estado de cada llamada y lo deja en el historial de la conversación. Para atravesar NAT hoy solo se usan servidores STUN públicos, sin TURN.
backend/src/modules/calls →
Dos caminos de subida: los archivos chicos pasan por el backend y los grandes se suben por partes directo al almacenamiento S3 con URLs prefirmadas, y se pueden reanudar. Las descargas usan URLs firmadas con HMAC de corta duración y se sirven con nosniff y una CSP en modo sandbox.
Cuentas locales por defecto: contraseñas con scrypt, tokens de sesión HS256 revocables por usuario y una política de sesión y contraseñas que define el admin (largo, vencimiento, historial, bloqueo). Que los proveedores de identidad externos sean intercambiables está en el roadmap.
Documento de diseño de la autenticación local →Logs estructurados en JSON (pino), correlacionados por request, evento de socket y tarea en segundo plano. Un registro de auditoría aparte guarda las acciones sensibles, con reglas de privacidad explícitas: nunca el contenido de los mensajes, nunca tokens.
Documento de diseño del logging →Todo cambio de comportamiento lleva sus tests unitarios (Vitest, en backend y frontend). La CI los corre con umbrales de cobertura, compila las dos aplicaciones y las imágenes Docker, y aplica las migraciones sobre una base vacía para detectar diferencias con el schema.
Documento de diseño de los tests →Sí. Docker Compose levanta PostgreSQL, el backend y el frontend, y las migraciones se aplican al arrancar el backend.
git clone https://github.com/anderlfrias/link.git
cd link
cp .env.example .env
# Completa POSTGRES_PASSWORD, LOCAL_AUTH_JWT_SECRET
# y las claves VAPID (el README explica cómo)
docker compose up -d --build
docker compose exec backend npm run auth:admin -- \
create-admin --email tu@example.com
Después abre http://localhost:3000 e inicia sesión con la contraseña temporal que muestra el último comando. Te va a pedir que la cambies.
LINK se puede usar hoy y sigue evolucionando. Estas son sus limitaciones reales, no una lista de ventas.
Los próximos pasos son intenciones, no compromisos. Cada cambio queda registrado en el CHANGELOG.
Sí. LINK se distribuye bajo la GNU AGPL v3.0. Puedes usarlo, modificarlo y ejecutarlo para tu equipo. Si lo modificas y lo ofreces a otras personas a través de una red, tienes que ofrecerles el código fuente de tu versión bajo la misma licencia.
De ninguno en el que tengas que registrarte. Los mensajes viven en tu PostgreSQL y los archivos en tu disco o en tu propio almacenamiento compatible con S3. Algunas cosas sí salen hacia afuera: las llamadas usan los servidores STUN públicos de Google para establecer la conexión entre navegadores, las notificaciones push pasan por el servicio de push de cada navegador (como en cualquier aplicación web) y la búsqueda de GIFs con GIPHY es opcional y viene desactivada.
No una nativa. LINK es una Progressive Web App: funciona en los navegadores modernos y se puede instalar en escritorio y en el móvil, con notificaciones push donde el navegador las soporta.
LINK es un proyecto independiente que construye y mantiene Anderson Frias. Empezó como el chat interno de un equipo real, donde se sigue usando a diario, y ahora se desarrolla en abierto.
Empieza por CONTRIBUTING.md. Los bugs y las propuestas van en los issues de GitHub. Las vulnerabilidades se reportan en privado, como explica SECURITY.md, no en un issue público.