Pila tecnológica
HansaChat es un chat de empresa europeo con una capa operativa para equipos de campo, diseñado, desarrollado y operado por una sola persona. Esta página muestra con qué está construida cada parte y por qué se eligió.
Versiones y recuentos revisados en octubre de 2026.
Contado en los repositorios
- servicios ConnectRPC con 179 RPC, todos definidos en Protobuf
- 18
- binarios de Go a partir de una única base de código: API, worker, retransmisor de outbox y administración
- 4
- plataformas desde un solo cliente: web, macOS, Windows, Linux, iOS y Android
- 6
- idiomas en el sitio web público
- 22
- idiomas de interfaz en la aplicación
- 23
- especificaciones de extremo a extremo con Playwright en un entorno aislado
- 70
Cómo encajan las piezas
Tres aplicaciones comparten un mismo edge y un mismo clúster. El sitio web se encarga de la facturación y del registro de espacios de trabajo, el backend en Go de todo lo que ocurre dentro de un espacio de trabajo, y la aplicación web se comunica con el backend mediante clientes ConnectRPC generados.
Clientes
Navegador
Sitio web y aplicación web
Tauri
Envoltorios de escritorio y móvil
hansa CLI
Scripts y agentes
Edge
Bunny.net CDN
TLS, caché, protección DDoS
IONOS Managed Kubernetes, Alemania
Traefik
Ingress para cada aplicación
Aplicación web Vue + Vite
Compilación estática de Vue
API del chat
Go con ConnectRPC
- Worker
- Retransmisor de outbox
Sitio web Laravel + FrankenPHP
Facturación, registro, aprovisionamiento
NATS JetStream
Comandos y eventos duraderos
Centrifugo
Difusión por WebSocket
Valkey Sentinel + HAProxy
Caché, presencia, sesiones
LiveKit
Medios de las llamadas
Datos gestionados en IONOS
MariaDB
Una base de datos por espacio de trabajo más un registro central
Almacenamiento de objetos S3
Archivos y avatares
Servicios externos
ElevenLabs · LLM · Clef
Transcripción, traducción, clasificación
Creem · EmailLabs
Pagos y correo electrónico
Fuera del clúster
Cloudflare Workers D1
Comprobaciones de estado externas
Bunny Storage restic
Copias de seguridad cifradas en Fráncfort y Estocolmo
El recorrido de un mensaje
- El cliente llama al servicio de mensajes mediante ConnectRPC.
- La API solo acepta la solicitud después de que NATS JetStream haya almacenado el comando de forma duradera.
- Un worker escribe el mensaje y un evento de outbox en la base de datos del espacio de trabajo en una única transacción.
- El retransmisor de outbox publica el evento confirmado en NATS y Centrifugo.
- Todos los clientes abiertos lo reciben por WebSocket; tras una interrupción, los clientes vuelven a cargar el estado de referencia desde la API.
Backend del chat
Todo lo que ocurre dentro de un espacio de trabajo se ejecuta en Go: mensajes, canales, archivos, llamadas, tiempo real, importaciones y el paquete operativo para limpieza. El sitio web nunca accede a los datos de los espacios de trabajo.
- Go 1.26
-
Cuatro binarios a partir de una base de código modular: la API, el worker de mensajes, el retransmisor de outbox y un comando de administración protegido. Se distribuyen como binarios estáticos en una única imagen pequeña.
Por qué
Una biblioteca estándar sólida, un rendimiento predecible y una concurrencia sencilla encajan con un backend formado por workers de larga duración. Un solo lenguaje para todo el núcleo del espacio de trabajo permite que una sola persona lo mantenga.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
18 servicios y 179 RPC están definidos en Protobuf. buf genera el servidor en Go y los clientes en TypeScript con plugins locales, de modo que ningún esquema sale de la máquina.
Por qué
Un único contrato sirve a los clientes web, de escritorio, móviles y de línea de comandos. No hay rutas HTTP escritas a mano ni análisis manual de respuestas, y un cambio de contrato aparece como error de compilación en lugar de como fallo en tiempo de ejecución.
- Una base de datos por espacio de trabajo MariaDB · sqlc
-
Cada espacio de trabajo tiene su propia base de datos MariaDB física. La API identifica el espacio de trabajo por su dominio y abre el pool correspondiente; los workers lo vuelven a identificar por sí mismos y nunca confían en un nombre de base de datos recibido en un mensaje de cola. Las consultas son SQL simple que sqlc compila a Go tipado.
Por qué
El aislamiento es estructural, no un filtro en cada consulta. La exportación, la importación, la restauración y la eliminación funcionan por empresa.
- NATS JetStream 2.10
-
Streams duraderos para comandos, tareas y eventos, además de un stream de mensajes fallidos (dead-letter). Las escrituras de mensajes se ejecutan en 64 particiones ordenadas.
Por qué
Un mensaje solo se acepta tras una confirmación duradera. Los mensajes de un mismo canal mantienen su orden, mientras que los canales independientes se procesan en paralelo.
- Outbox transaccional
-
Las filas de dominio y el evento saliente se confirman en la misma transacción. Un retransmisor publica los eventos confirmados en NATS y Centrifugo, sin duplicados gracias al ID del evento, y registra los fallos para reintentarlos.
Por qué
Ningún evento perdido ni fantasma cuando un proceso se detiene entre la escritura en la base de datos y la publicación.
- Centrifugo v5
-
Entrega por WebSocket de mensajes, presencia, indicadores de escritura y estado de las llamadas. Los clientes se suscriben con tokens de corta duración por canal que la API emite solo después de comprobar la pertenencia al espacio de trabajo.
Por qué
Un servidor de tiempo real dedicado mantiene las conexiones de larga duración fuera del proceso de la API, y cada token identifica tanto el espacio de trabajo como el usuario, de modo que las identidades de bases de datos distintas no pueden colisionar.
- Almacenamiento de objetos compatible con S3 aws-sdk-go-v2
-
Los archivos y avatares se guardan en IONOS Object Storage en la UE y se entregan mediante enlaces firmados de corta duración.
Por qué
El almacenamiento de archivos escala de forma independiente de las bases de datos y está cifrado en reposo en el lado del servidor.
- LiveKit 1.9
-
Un servidor de medios WebRTC autoalojado para llamadas en mensajes directos y llamadas de canal centradas en el audio, con cámara y uso compartido de pantalla.
Por qué
Es de código abierto y autoalojable, así que los medios de las llamadas circulan por infraestructura que opera HansaChat.
- ElevenLabs Scribe
-
Conversión de voz a texto para los mensajes de voz. La transcripción se adjunta al mensaje y se puede buscar y traducir como cualquier texto.
Por qué
Los equipos de campo hablan más de lo que escriben.
- Traducción con LLM
-
Traducción por lector mediante una API compatible con OpenAI. Cada mensaje se traduce bajo demanda, se almacena en caché una vez por idioma de destino y se omite si el lector ya comparte el idioma.
Por qué
Un equipo multilingüe trabaja en una misma conversación mientras cada miembro lee en su propio idioma. El proveedor sigue siendo sustituible detrás de una única interfaz.
- Cloudflare Clef
-
Un modelo de decisión clasifica los mensajes operativos por categoría, urgencia y grado de confianza. Devuelve probabilidades para preguntas fijas, no texto generado. Actualmente en fase piloto.
Por qué
No hay salida de texto libre que interpretar. Los supervisores ven qué requiere atención; actuar en consecuencia sigue siendo siempre una decisión humana.
- go-pdf 0.9
-
Las hojas de horas y los informes de servicio en formato A4 se generan en el servidor.
Por qué
Una biblioteca escrita íntegramente en Go mantiene la imagen del backend pequeña y sin navegador headless.
- Sentry + slog
-
Los errores y las trazas van a Sentry, los logs son JSON estructurado generado con la biblioteca estándar y los workers exponen métricas en el formato de texto de Prometheus.
Por qué
Pocas piezas que operar, y cada fallo llega con su contexto.
Aplicaciones y CLI
Un único cliente en Vue sirve la versión web y Tauri lo empaqueta para escritorio y móvil. El cliente de línea de comandos usa la misma API pública que las aplicaciones.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Un único cliente con 118 componentes de archivo único, stores de Pinia, vue-router y vue-i18n en 23 idiomas de interfaz, probado con Vitest.
Por qué
Un modelo de componentes maduro y legible y un TypeScript estricto hacen que un cliente grande sea manejable para un equipo muy pequeño.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
La herramienta de compilación y la capa de estilos: Tailwind CSS 4 con un tema claro y otro oscuro.
Por qué
Compilaciones rápidas y tokens de diseño que siguen la misma paleta documentada que el sitio web.
- Tauri 2.10
-
Empaqueta el mismo cliente web para macOS, Windows, Linux, iOS y Android, con notificaciones nativas, enlaces profundos y actualizaciones de escritorio firmadas.
Por qué
Una sola interfaz en todas partes, usando el webview del sistema en lugar de incluir un motor de navegador en cada aplicación.
- Clientes Connect generados connect-web 2.1 · protobuf-es 2
-
Clientes en TypeScript generados a partir del Protobuf del backend y copiados en la aplicación web. Nunca se editan a mano.
Por qué
Un cambio de contrato se convierte en un error de tipos en el cliente en lugar de en una sorpresa en producción.
- centrifuge-js + livekit-client 5.7 · 2.20
-
Las bibliotecas cliente para el tiempo real de Centrifugo y las llamadas de LiveKit.
Por qué
La reconexión, la recuperación y la gestión de medios las aportan los mismos proyectos que desarrollan los servidores.
- TipTap 3.22
-
El editor de mensajes, con menciones, enlaces y bloques de código con resaltado de sintaxis.
Por qué
Un editor estructurado en lugar de un frágil manejo de cadenas de texto.
- hansa CLI Go 1.26 · Cobra
-
Un cliente de línea de comandos sin estado para personas, scripts y agentes LLM. Salida JSON por defecto, credenciales en el llavero del sistema operativo y sumas de verificación de las versiones firmadas con Minisign.
Por qué
Consume la misma API pública que las aplicaciones. Sus contratos Protobuf se copian del backend y se fijan con hashes SHA-256, de modo que cualquier divergencia se detecta en CI.
Sitio web, facturación y registro
Laravel gestiona el sitio público, la documentación para clientes, el proceso de pago, las suscripciones y el registro central de espacios de trabajo. Crea un espacio de trabajo llamando al backend en Go mediante HTTP autenticado, sin código compartido ni colas compartidas.
- Laravel + PHP Laravel 12 · PHP 8.5
-
El sitio web público, la documentación para clientes, el proceso de pago, las suscripciones, los cupones, los avisos del ciclo de vida y el registro central de espacios de trabajo y dominios.
Por qué
La facturación, el correo, la programación de tareas, las colas y los formularios son los puntos fuertes de Laravel. El chat se queda en Go, y la frontera entre ambos es una única interfaz HTTP autenticada.
- FrankenPHP 1.13
-
El servidor de aplicaciones PHP dentro de la imagen de contenedor, construido sobre una imagen base compartida que fija PHP, sus extensiones y sus herramientas por digest.
Por qué
Un solo proceso sirve la aplicación, y recompilar el mismo commit produce el mismo entorno de ejecución.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Páginas renderizadas en el servidor con pequeños componentes de Alpine.js, con estilos de Tailwind CSS y empaquetadas con Vite.
Por qué
Las páginas de contenido cargan rápido sin necesidad de enviar un framework de aplicación de una sola página.
- 22 idiomas
-
Cada página pública existe en 22 idiomas de la UE, con URL prefijadas por idioma, enlaces hreflang y un sitemap localizado. Una prueba falla si a algún idioma le falta una clave o si muestra texto en inglés.
Por qué
Un producto europeo debería poder leerse en el idioma del comprador desde la primera página.
- Creem
-
Pago, impuestos, facturas y suscripciones, sincronizados mediante webhooks firmados.
Por qué
Los pagos, los impuestos y la facturación quedan en manos de un proveedor especializado, mientras el sitio web conserva una copia conciliada de cada suscripción.
- EmailLabs
-
Correo transaccional y de servicio, como invitaciones, enlaces de contraseña y avisos.
Por qué
Un proveedor de correo de la UE para un producto de la UE.
- Pest 4.4
-
Más de 130 archivos de pruebas cubren rutas, facturación, aprovisionamiento, traducciones y SEO, incluidas pruebas en navegador.
Por qué
Pruebas rápidas y legibles que se ejecutan con cada cambio.
Plataforma y operaciones
Producción y preproducción se ejecutan en IONOS en Alemania. Cada aplicación se entrega como imagen de contenedor con su propio chart de Helm y se despliega mediante un job de GitLab que se lanza manualmente.
- IONOS Managed Kubernetes
-
Clústeres de producción y de preproducción, MariaDB gestionado y Object Storage compatible con S3, todo operado por un proveedor alemán en Alemania.
Por qué
Un proveedor europeo sujeto a la jurisdicción de la UE, no la región europea de una nube no europea.
- Helm + Traefik
-
Cada aplicación incluye su propio chart. Traefik enruta el tráfico dentro del clúster, y las migraciones de las bases de datos de los espacios de trabajo se ejecutan como hook antes de cada despliegue del backend.
Por qué
Cada despliegue está versionado, es reproducible y se revierte con facilidad.
- Bunny.net
-
CDN, DNS y protección DDoS delante del clúster, además del almacenamiento para las copias de seguridad cifradas.
Por qué
Una empresa europea opera el edge y custodia las copias de seguridad, de modo que ninguno de los dos depende de una nube no europea.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Tres réplicas con conmutación por error mediante Sentinel y un proxy HAProxy que siempre apunta al primario actual. Da soporte a la caché, las sesiones, la presencia y el broker de tiempo real.
Por qué
Una conmutación por error no requiere cambios en la aplicación, porque todos los servicios siguen hablando con la misma dirección.
- restic 0.18
-
Copias de seguridad cifradas de las bases de datos cada 6 horas en dos ubicaciones de la UE, con comprobaciones de integridad semanales y un simulacro de restauración mensual automatizado.
Por qué
Una copia de seguridad solo cuenta cuando se ha demostrado que se puede restaurar.
- GitLab CI
-
Las pruebas, la compilación de imágenes y las comprobaciones de los charts de Helm se ejecutan en CI. Los despliegues en preproducción y en producción son jobs independientes que se lanzan manualmente.
Por qué
La automatización hace el trabajo repetitivo; una persona decide cuándo algo llega a los clientes.
En torno al producto
Las herramientas que mantienen observable, localizable y explicable una empresa de una sola persona.
- Cloudflare Workers + D1
-
Una página de estado externa que comprueba la aplicación y el sitio web cada cinco minutos y registra las incidencias.
Por qué
La disponibilidad se mide desde fuera de la infraestructura que describe.
- Umami 3.2
-
Analítica web autoalojada que solo se ejecuta después de que el visitante haya tomado una decisión sobre el consentimiento.
Por qué
Los datos de los visitantes permanecen en la infraestructura de HansaChat en lugar de alimentar una red publicitaria.
- Remotion 4.0
-
Los vídeos del producto se graban a partir de la aplicación real con el ejecutor de pruebas de extremo a extremo y se componen en código con una locución generada por IA.
Por qué
Cuando cambia la interfaz, el vídeo se vuelve a renderizar en lugar de volver a grabarse.
- TwentyCRM + WireGuard
-
Un CRM autoalojado al que solo se puede acceder a través de una VPN privada.
Por qué
Los datos comerciales no están expuestos en absoluto a la internet pública.
Prácticas de ingeniería
Los hábitos que permiten a una sola persona entregar un producto multiinquilino sin un equipo aparte de QA ni de operaciones.
Los contratos se generan, nunca se escriben a mano
Protobuf es la única fuente para el servidor en Go, los clientes en TypeScript y la CLI. Los generadores están fijados a versiones exactas, y la CLI registra el hash de cada archivo de contrato que utiliza.
Las migraciones llevan un registro
Cada base de datos de espacio de trabajo registra qué migraciones ha aplicado. Un hook de despliegue aplica solo las que faltan y vuelve a comprobarlo tras el despliegue. El sitio web conserva sus migraciones base originales para que las bases de datos existentes nunca las ejecuten dos veces.
Pruebas de extremo a extremo en un entorno aislado
Un solo comando arranca las bases de datos, NATS, Valkey, Centrifugo y el almacenamiento de objetos en puertos libres, compila los binarios de Go, inicia la aplicación web y ejecuta 70 especificaciones de Playwright con un espacio de trabajo nuevo para cada prueba.
Pruebas en todas las capas
478 funciones de prueba en Go, incluidas pruebas de aislamiento entre dos espacios de trabajo, 109 archivos de Vitest en el cliente y más de 130 archivos de Pest en el sitio web.
Barreras de protección en CI
Las comprobaciones de formato, un límite de 1000 líneas por archivo de Go y las pruebas de los charts de Helm se ejecutan en CI junto a los conjuntos de pruebas.
Despliegues con aprobación manual
La CI compila y prueba automáticamente, pero los despliegues en preproducción y en producción son jobs manuales independientes. Producción despliega una etiqueta de versión que solo se crea después de fusionar el cambio.
Copias de seguridad demostradas con restauraciones
Cada ejecución de copia de seguridad se supervisa, y un simulacro automatizado restaura las bases de datos cada mes y valida las tablas y el número de filas.
Un único sistema de diseño
El sitio web y la aplicación comparten una paleta documentada, una escala tipográfica y unas reglas de componentes, con un tema claro y otro oscuro en la aplicación.
Asistido por IA, con control humano
Los agentes de programación con IA trabajan a partir de un archivo de instrucciones en cada repositorio que remite a un repositorio central de documentación de ingeniería. Los flujos de trabajo repetibles, como la ejecución de extremo a extremo, están empaquetados como skills de agente. Cada cambio sigue pasando las mismas pruebas, y los despliegues siguen siendo manuales.
Gestión de la seguridad en preparación
HansaChat se está preparando para la certificación ISO/IEC 27001 con un registro de riesgos, un registro de evidencias y un registro de decisiones. A día de hoy no está certificado.
Lo que afirma esta página y lo que no
Todo lo anterior describe lo que está implementado hoy y se ha contado a partir de los repositorios de código fuente. HansaChat no afirma contar con ninguna certificación de seguridad. La clasificación de mensajes está en fase piloto, y las notificaciones push para aplicaciones cerradas aún no están disponibles.
¿Preguntas sobre la arquitectura?
Los ingenieros que evalúan HansaChat reciben respuestas directas de la persona que lo ha construido.