Technologie-Stack
HansaChat ist ein EU-Unternehmenschat mit einer Einsatzebene für Teams vor Ort – entworfen, gebaut und betrieben von einer Person. Diese Seite zeigt, womit jeder Teil gebaut ist und warum.
Versionen und Zahlen geprüft im Oktober 2026.
In den Repositories gezählt
- ConnectRPC-Services mit 179 RPCs, alle in Protobuf definiert
- 18
- Go-Binaries aus einer Codebasis: API, Worker, Outbox-Relay, Admin
- 4
- Plattformen aus einem Client: Web, macOS, Windows, Linux, iOS, Android
- 6
- Sprachen auf der öffentlichen Website
- 22
- Oberflächensprachen in der App
- 23
- Playwright-End-to-End-Specs auf einem isolierten Stack
- 70
Wie die Teile zusammenspielen
Drei Anwendungen teilen sich einen Edge und einen Cluster. Die Website verantwortet Abrechnung und Workspace-Register, das Go-Backend alles innerhalb eines Workspaces, und die Web-App spricht über generierte ConnectRPC-Clients mit dem Backend.
Clients
Browser
Website und Web-App
Tauri
Desktop- und Mobil-Hüllen
hansa CLI
Skripte und Agenten
Edge
Bunny.net CDN
TLS, Caching, DDoS-Schutz
IONOS Managed Kubernetes, Deutschland
Traefik
Ingress für jede Anwendung
Web-App Vue + Vite
Statischer Vue-Build
Chat-API
Go mit ConnectRPC
- Worker
- Outbox-Relay
Website Laravel + FrankenPHP
Abrechnung, Register, Bereitstellung
NATS JetStream
Dauerhafte Befehle und Events
Centrifugo
WebSocket-Verteilung
Valkey Sentinel + HAProxy
Cache, Präsenz, Sessions
LiveKit
Anrufmedien
Verwaltete Daten bei IONOS
MariaDB
Eine Datenbank pro Workspace plus ein zentrales Register
Object Storage S3
Dateien und Avatare
Externe Dienste
ElevenLabs · LLM · Clef
Transkription, Übersetzung, Triage
Creem · EmailLabs
Zahlungen und E-Mail
Außerhalb des Clusters
Cloudflare Workers D1
Externe Statusprüfungen
Bunny Storage restic
Verschlüsselte Backups in Frankfurt und Stockholm
Der Weg einer Nachricht
- Der Client ruft den Nachrichtendienst über ConnectRPC auf.
- Die API nimmt die Anfrage erst an, wenn NATS JetStream den Befehl dauerhaft gespeichert hat.
- Ein Worker schreibt die Nachricht und ein Outbox-Event in einer Transaktion in die Workspace-Datenbank.
- Das Outbox-Relay veröffentlicht das festgeschriebene Event an NATS und Centrifugo.
- Jeder geöffnete Client empfängt es per WebSocket; nach einer Unterbrechung laden Clients den maßgeblichen Stand von der API neu.
Chat-Backend
Alles, was innerhalb eines Workspaces passiert, läuft in Go: Nachrichten, Kanäle, Dateien, Anrufe, Echtzeit, Importe und das Reinigungs-Einsatzpaket. Die Website berührt nie Workspace-Daten.
- Go 1.26
-
Vier Binaries aus einer modularen Codebasis: die API, der Nachrichten-Worker, das Outbox-Relay und ein abgesichertes Admin-Kommando. Sie werden als statische Binaries in einem kleinen Image ausgeliefert.
Warum
Eine starke Standardbibliothek, berechenbare Performance und einfache Nebenläufigkeit passen zu einem Backend aus langlebigen Workern. Eine Sprache für den gesamten Workspace-Kern hält ihn für eine Person wartbar.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
18 Services und 179 RPCs sind in Protobuf definiert. buf erzeugt den Go-Server und die TypeScript-Clients mit lokalen Plugins, sodass kein Schema die Maschine verlässt.
Warum
Ein Vertrag bedient Web-, Desktop-, Mobil- und Kommandozeilen-Clients. Es gibt keine handgeschriebenen HTTP-Pfade und kein Antwort-Parsing, und eine Vertragsänderung zeigt sich als Compilerfehler statt als Laufzeitfehler.
- Eine Datenbank pro Workspace MariaDB · sqlc
-
Jeder Workspace erhält eine eigene physische MariaDB-Datenbank. Die API ermittelt den Workspace über seine Domain und öffnet den passenden Pool; Worker ermitteln ihn selbst erneut und vertrauen nie einem Datenbanknamen aus einer Queue-Nachricht. Abfragen sind einfaches SQL, das sqlc in typisiertes Go übersetzt.
Warum
Die Isolation ist strukturell statt eines Filters in jeder Abfrage. Export, Import, Wiederherstellung und Löschung funktionieren pro Unternehmen.
- NATS JetStream 2.10
-
Dauerhafte Streams für Befehle, Jobs und Events sowie ein Dead-Letter-Stream. Schreibvorgänge für Nachrichten laufen in 64 geordneten Partitionen.
Warum
Eine Nachricht wird erst nach einer dauerhaften Bestätigung angenommen. Nachrichten in einem Kanal bleiben in Reihenfolge, während unabhängige Kanäle parallel verarbeitet werden.
- Transaktionale Outbox
-
Fachliche Datensätze und das ausgehende Event werden in derselben Transaktion festgeschrieben. Ein Relay veröffentlicht festgeschriebene Events an NATS und Centrifugo, dedupliziert über die Event-ID, und hält Fehler für Wiederholungen fest.
Warum
Keine verlorenen oder Phantom-Events, wenn ein Prozess zwischen Datenbankschreiben und Veröffentlichen stoppt.
- Centrifugo v5
-
WebSocket-Zustellung für Nachrichten, Präsenz, Tippanzeigen und Anrufstatus. Clients abonnieren mit kurzlebigen Tokens pro Kanal, die die API erst nach Prüfung der Workspace-Mitgliedschaft ausstellt.
Warum
Ein eigener Echtzeit-Server hält langlebige Verbindungen aus dem API-Prozess heraus, und jedes Token nennt Workspace und Benutzer, sodass Identitäten aus getrennten Datenbanken nicht kollidieren können.
- S3-kompatibler Object Storage aws-sdk-go-v2
-
Dateien und Avatare liegen in IONOS Object Storage in der EU und werden über kurzlebige signierte Links ausgeliefert.
Warum
Dateispeicher skaliert unabhängig von den Datenbanken und ist serverseitig im Ruhezustand verschlüsselt.
- LiveKit 1.9
-
Ein selbst betriebener WebRTC-Medienserver für Anrufe in Direktnachrichten und audiozentrierte Kanalanrufe mit Kamera und Bildschirmfreigabe.
Warum
Open Source und selbst betreibbar, sodass Anrufmedien auf Infrastruktur laufen, die HansaChat betreibt.
- ElevenLabs Scribe
-
Spracherkennung für Sprachnachrichten. Das Transkript hängt an der Nachricht, ist durchsuchbar und wie jeder Text übersetzbar.
Warum
Teams vor Ort sprechen mehr, als sie tippen.
- LLM-Übersetzung
-
Übersetzung pro Leser über eine OpenAI-kompatible API. Jede Nachricht wird bei Bedarf übersetzt, einmal pro Zielsprache zwischengespeichert und übersprungen, wenn der Leser die Sprache bereits spricht.
Warum
Ein gemischtsprachiges Team arbeitet in einem Gespräch, während jedes Mitglied in seiner eigenen Sprache liest. Der Anbieter bleibt hinter einer Schnittstelle austauschbar.
- Cloudflare Clef
-
Ein Entscheidungsmodell ordnet operative Nachrichten nach Kategorie, Dringlichkeit und Konfidenz ein. Es liefert Wahrscheinlichkeiten für feste Fragen, keinen generierten Text. Derzeit im Pilotbetrieb.
Warum
Es gibt keine Freitext-Ausgabe zu parsen. Vorarbeiter sehen, was Aufmerksamkeit braucht; das Handeln bleibt immer eine menschliche Entscheidung.
- go-pdf 0.9
-
A4-Stundenzettel und Leistungsnachweise werden auf dem Server erzeugt.
Warum
Eine reine Go-Bibliothek hält das Backend-Image klein und frei von einem Headless-Browser.
- Sentry + slog
-
Fehler und Traces gehen an Sentry, Logs sind strukturiertes JSON aus der Standardbibliothek, und Worker stellen Metriken im Prometheus-Textformat bereit.
Warum
Wenige bewegliche Teile im Betrieb, und jeder Fehler kommt mit seinem Kontext an.
Apps und CLI
Ein Vue-Client bedient das Web und wird von Tauri für Desktop und Mobilgeräte verpackt. Der Kommandozeilen-Client nutzt dieselbe öffentliche API wie die Apps.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Ein einziger Client mit 118 Single-File-Komponenten, Pinia-Stores, vue-router und vue-i18n in 23 Oberflächensprachen, getestet mit Vitest.
Warum
Ein ausgereiftes, lesbares Komponentenmodell und strenges TypeScript machen einen großen Client für ein sehr kleines Team beherrschbar.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
Das Build-Werkzeug und die Gestaltungsebene: Tailwind CSS 4 mit hellem und dunklem Theme.
Warum
Schnelle Builds und Design-Tokens, die derselben dokumentierten Palette folgen wie die Website.
- Tauri 2.10
-
Verpackt denselben Web-Client für macOS, Windows, Linux, iOS und Android – mit nativen Benachrichtigungen, Deep Links und signierten Desktop-Updates.
Warum
Eine Oberfläche überall, mit der Webview des Systems statt einer in jede App gebündelten Browser-Engine.
- Generierte Connect-Clients connect-web 2.1 · protobuf-es 2
-
TypeScript-Clients, die aus dem Protobuf des Backends erzeugt und in die Web-App kopiert werden. Sie werden nie von Hand bearbeitet.
Warum
Eine Vertragsänderung wird zum Typfehler im Client statt zur Überraschung in der Produktion.
- centrifuge-js + livekit-client 5.7 · 2.20
-
Die Client-Bibliotheken für Centrifugo-Echtzeit und LiveKit-Anrufe.
Warum
Wiederverbindung, Wiederherstellung und Medienverarbeitung kommen von den Projekten, die auch die Server bauen.
- TipTap 3.22
-
Der Nachrichteneditor mit Erwähnungen, Links und Codeblöcken mit Syntaxhervorhebung.
Warum
Ein strukturierter Editor statt fehleranfälliger Zeichenkettenverarbeitung.
- hansa CLI Go 1.26 · Cobra
-
Ein zustandsloser Kommandozeilen-Client für Menschen, Skripte und LLM-Agenten. Standardmäßig JSON-Ausgabe, Zugangsdaten im Schlüsselbund des Betriebssystems und mit Minisign signierte Release-Prüfsummen.
Warum
Er nutzt dieselbe öffentliche API wie die Apps. Seine Protobuf-Verträge werden aus dem Backend kopiert und mit SHA-256-Hashes festgeschrieben, sodass Abweichungen in der CI auffallen.
Website, Abrechnung und Register
Laravel betreibt die öffentliche Website, die Kundendokumentation, Checkout, Abonnements und das zentrale Register der Workspaces. Einen Workspace legt es per authentifiziertem HTTP-Aufruf beim Go-Backend an – ohne gemeinsamen Code und ohne gemeinsame Queues.
- Laravel + PHP Laravel 12 · PHP 8.5
-
Die öffentliche Website, die Kundendokumentation, Checkout, Abonnements, Gutscheine, Lebenszyklus-Hinweise und das zentrale Register der Workspaces und Domains.
Warum
Abrechnung, E-Mail, Zeitplanung, Queues und Formulare sind Laravels Stärken. Der Chat bleibt in Go, und die Grenze dazwischen ist eine authentifizierte HTTP-Schnittstelle.
- FrankenPHP 1.13
-
Der PHP-Anwendungsserver im Container-Image, gebaut auf einem gemeinsamen Basis-Image, das PHP, seine Erweiterungen und Werkzeuge per Digest festlegt.
Warum
Ein Prozess bedient die Anwendung, und ein Neubau desselben Commits ergibt dieselbe Laufzeitumgebung.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Serverseitig gerenderte Seiten mit kleinen Alpine.js-Komponenten, gestaltet mit Tailwind CSS und gebündelt von Vite.
Warum
Inhaltsseiten laden schnell, ohne ein Single-Page-App-Framework auszuliefern.
- 22 Sprachen
-
Jede öffentliche Seite gibt es in 22 EU-Sprachen mit Sprachpräfix in der URL, hreflang-Verweisen und lokalisierter Sitemap. Ein Test schlägt fehl, wenn einer Sprache ein Schlüssel fehlt oder sie englischen Text ausliefert.
Warum
Ein europäisches Produkt sollte ab der ersten Seite in der Sprache des Käufers lesbar sein.
- Creem
-
Checkout, Steuern, Rechnungen und Abonnements, synchron gehalten über signierte Webhooks.
Warum
Zahlung, Steuern und Rechnungsstellung bleiben bei einem spezialisierten Anbieter, während die Website eine abgeglichene Kopie jedes Abonnements führt.
- EmailLabs
-
Transaktions- und Service-E-Mails wie Einladungen, Passwort-Links und Hinweise.
Warum
Ein EU-E-Mail-Anbieter für ein EU-Produkt.
- Pest 4.4
-
Mehr als 130 Testdateien decken Routen, Abrechnung, Bereitstellung, Übersetzungen und SEO ab, einschließlich Browsertests.
Warum
Schnelle, lesbare Tests, die bei jeder Änderung laufen.
Plattform und Betrieb
Produktion und Vorschau laufen bei IONOS in Deutschland. Jede Anwendung wird als Container-Image mit eigenem Helm-Chart ausgeliefert und über einen manuell ausgelösten GitLab-Job deployt.
- IONOS Managed Kubernetes
-
Produktions- und Vorschau-Cluster, verwaltetes MariaDB und S3-kompatibler Object Storage – alles betrieben von einem deutschen Anbieter in Deutschland.
Warum
Ein europäischer Anbieter unter EU-Recht, nicht die EU-Region einer außereuropäischen Cloud.
- Helm + Traefik
-
Jede Anwendung bringt ihr eigenes Chart mit. Traefik leitet den Verkehr im Cluster, und Migrationen der Workspace-Datenbanken laufen als Hook vor jedem Backend-Rollout.
Warum
Jedes Deployment ist versioniert, wiederholbar und leicht zurückzurollen.
- Bunny.net
-
CDN, DNS und DDoS-Schutz vor dem Cluster sowie der Speicher für verschlüsselte Backups.
Warum
Ein europäisches Unternehmen betreibt den Edge und hält die Backup-Kopien, sodass keines von beiden von einer außereuropäischen Cloud abhängt.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Drei Replikate mit Sentinel-Failover und einem HAProxy-Proxy, der immer auf den aktuellen Primary zeigt. Es trägt Caching, Sessions, Präsenz und den Echtzeit-Broker.
Warum
Ein Failover erfordert keine Änderung an den Anwendungen, weil jeder Dienst weiter mit derselben Adresse spricht.
- restic 0.18
-
Verschlüsselte Datenbank-Backups alle 6 Stunden an zwei EU-Standorte, mit wöchentlichen Integritätsprüfungen und einer automatisierten monatlichen Wiederherstellungsübung.
Warum
Ein Backup zählt erst, wenn eine Wiederherstellung bewiesen ist.
- GitLab CI
-
Tests, Image-Builds und Helm-Chart-Prüfungen laufen in der CI. Deployments in Vorschau und Produktion sind getrennte, manuell ausgelöste Jobs.
Warum
Die Automatisierung erledigt die wiederkehrende Arbeit; ein Mensch entscheidet, wann etwas bei Kunden ankommt.
Rund um das Produkt
Die Werkzeuge, mit denen ein Ein-Personen-Unternehmen beobachtbar, erreichbar und erklärbar bleibt.
- Cloudflare Workers + D1
-
Eine externe Statusseite, die App und Website alle fünf Minuten prüft und Störungen festhält.
Warum
Verfügbarkeit wird von außerhalb der Infrastruktur gemessen, die sie beschreibt.
- Umami 3.2
-
Selbst betriebene Web-Analyse, die erst läuft, nachdem Besucher eine Einwilligungsentscheidung getroffen haben.
Warum
Besucherdaten bleiben auf HansaChat-Infrastruktur, statt ein Werbenetzwerk zu speisen.
- Remotion 4.0
-
Die Produktvideos werden vom End-to-End-Testrunner in der echten Anwendung aufgenommen und im Code mit einer KI-Stimme zusammengesetzt.
Warum
Ändert sich die Oberfläche, wird das Video neu gerendert statt neu gedreht.
- TwentyCRM + WireGuard
-
Ein selbst betriebenes CRM, das nur über ein privates VPN erreichbar ist.
Warum
Vertriebsdaten sind überhaupt nicht aus dem öffentlichen Internet erreichbar.
Entwicklungspraxis
Die Gewohnheiten, mit denen eine Person ein mandantenfähiges Produkt ohne eigenes QA- oder Betriebsteam ausliefert.
Verträge werden generiert, nie von Hand geschrieben
Protobuf ist die einzige Quelle für den Go-Server, die TypeScript-Clients und die CLI. Die Generatoren sind auf exakte Versionen festgelegt, und die CLI hält den Hash jeder genutzten Vertragsdatei fest.
Migrationen führen Buch
Jede Workspace-Datenbank vermerkt, welche Migrationen sie angewendet hat. Ein Deployment-Hook wendet nur die fehlenden an und prüft nach dem Rollout erneut. Die Website behält ihre ursprünglichen Basis-Migrationen, damit bestehende Datenbanken sie nie doppelt ausführen.
End-to-End-Tests auf einem isolierten Stack
Ein Befehl startet Datenbanken, NATS, Valkey, Centrifugo und Object Storage auf freien Ports, baut die Go-Binaries, startet die Web-App und führt 70 Playwright-Specs mit einem frischen Workspace pro Test aus.
Tests auf jeder Ebene
478 Go-Testfunktionen, darunter Isolationstests mit zwei Workspaces, 109 Vitest-Dateien im Client und mehr als 130 Pest-Dateien auf der Website.
Leitplanken in der CI
Formatierungsprüfungen, eine Grenze von 1.000 Zeilen pro Go-Datei und Helm-Chart-Tests laufen in der CI neben den Testsuiten.
Manuelle Freigabe vor dem Deployment
Die CI baut und testet automatisch, aber Deployments in Vorschau und Produktion sind getrennte manuelle Jobs. Die Produktion erhält ein Release-Tag, das erst nach dem Merge der Änderung erstellt wird.
Backups, durch Wiederherstellung belegt
Jeder Backup-Lauf wird überwacht, und eine automatisierte Übung stellt die Datenbanken jeden Monat wieder her und prüft Tabellen und Zeilenzahlen.
Ein Designsystem
Website und App teilen eine dokumentierte Palette, Schriftskala und Komponentenregeln, mit hellem und dunklem Theme in der App.
KI-unterstützt, von Menschen freigegeben
KI-Coding-Agenten arbeiten mit einer Anweisungsdatei in jedem Repository, die auf ein zentrales Repository für Entwicklungsdokumentation verweist. Wiederkehrende Abläufe wie der End-to-End-Lauf sind als Agenten-Skills verpackt. Jede Änderung durchläuft dieselben Tests, und Deployments bleiben manuell.
Informationssicherheits-Management in Vorbereitung
HansaChat bereitet sich mit einem Risikoregister, einem Nachweisregister und einem Entscheidungsprotokoll auf eine Zertifizierung nach ISO/IEC 27001 vor. Eine Zertifizierung besteht heute nicht.
Was diese Seite behauptet – und was nicht
Alles oben beschreibt, was heute umgesetzt ist, und wurde in den Quell-Repositories gezählt. HansaChat beansprucht keine Sicherheitszertifizierung. Die Nachrichten-Triage ist im Pilotbetrieb, und Push-Benachrichtigungen für geschlossene Apps sind noch nicht live.
Fragen zur Architektur?
Wer HansaChat technisch prüft, bekommt direkte Antworten von der Person, die es gebaut hat.