Ir al contenido sobre tecnología
Volver al inicio

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

  1. El cliente llama al servicio de mensajes mediante ConnectRPC.
  2. La API solo acepta la solicitud después de que NATS JetStream haya almacenado el comando de forma duradera.
  3. Un worker escribe el mensaje y un evento de outbox en la base de datos del espacio de trabajo en una única transacción.
  4. El retransmisor de outbox publica el evento confirmado en NATS y Centrifugo.
  5. 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.

Escribir al desarrollador