Open source • AGPL-3.0 • En desarrollo activo

Un chat para equipos que puedes leer, ejecutar y alojar tú mismo.

LINK 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.

  • TypeScript de punta a punta
  • Tus datos en tu PostgreSQL
  • Se levanta con Docker Compose
  • Decisiones de diseño documentadas
Ilustración de la interfaz: una conversación de grupo con reacciones, una nota de voz y una encuesta.
  • TypeScript
  • Node.js
  • Express
  • Socket.IO
  • PostgreSQL
  • Prisma
  • Next.js
  • React
  • WebRTC
  • Web Push
  • Almacenamiento S3
  • Docker
  • Vitest

¿Qué puedes hacer con LINK?

Lo que funciona hoy, tal como está en el código. Las limitaciones están más abajo, en Estado del proyecto.

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.IO

Archivos y notas de voz

Adjunta 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 S3

Llamadas y videollamadas

Llamadas 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 1

Grupos

Admins 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 grupo

Administración

Un 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ón

Instalable y en dos idiomas

Una 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.

PWA

¿Cómo está construido?

Un 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.

Tiempo real

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 →

Llamadas

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 →

Archivos

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.

Documento de diseño de archivos grandes →

Autenticación

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 y auditoría

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 →

Tests y CI

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 →

¿Puedo ejecutarlo yo mismo?

Sí. Docker Compose levanta PostgreSQL, el backend y el frontend, y las migraciones se aplican al arrancar el backend.

Terminal
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.

  • Requisitos: Docker con Compose. Sin Docker: Node.js 22.12+ o 24, y PostgreSQL.
  • Almacenamiento: disco local por defecto. El almacenamiento compatible con S3 es opcional.
  • Hoy los secretos se generan a mano. Está previsto un comando de configuración que lo haga por ti.
Guía de instalación completa

Qué está hecho y qué no

LINK se puede usar hoy y sigue evolucionando. Estas son sus limitaciones reales, no una lista de ventas.

Funciona hoy

  • Chats privados, grupos y mensajes guardados
  • Archivos, imágenes, notas de voz y fotos con la cámara
  • Llamadas y videollamadas 1 a 1
  • Encuestas, reacciones, menciones y respuestas
  • Panel de administración, cuentas locales y registro de auditoría
  • PWA con notificaciones push
  • Interfaz en español e inglés, tema claro y oscuro

Limitaciones conocidas

  • El backend corre en una sola instancia (todavía sin un adaptador compartido para Socket.IO)
  • Las llamadas son solo 1 a 1 y usan servidores STUN públicos sin TURN, así que pueden fallar detrás de NAT estrictos
  • No hay presencia en línea / desconectado
  • La búsqueda dentro del chat solo cubre los mensajes ya cargados
  • No hay cifrado de extremo a extremo
  • Los archivos de más de 16 MiB requieren, por ahora, almacenamiento compatible con S3
  • Algunos textos siguen solo en español (errores del servidor, notificaciones)

Próximos pasos

  • Proveedores de identidad intercambiables (OIDC, LDAP…)
  • Un comando de configuración que genere los secretos
  • Subidas grandes sin S3
  • Una revisión y refuerzo de seguridad
  • Servidores STUN/TURN configurables
  • Completar la traducción al inglés
  • Tests de extremo a extremo

Los próximos pasos son intenciones, no compromisos. Cada cambio queda registrado en el CHANGELOG.

Preguntas frecuentes

¿Puedo usar LINK en mi organización?

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.

¿Depende de servicios externos?

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.

¿Hay una aplicación móvil?

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.

¿Quién está detrás de LINK?

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.

¿Cómo puedo contribuir o reportar un problema?

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.

El código está en GitHub

Léelo, ejecútalo, abre un issue o manda un pull request.