Zum Technologie-Inhalt springen
Zurück zur Startseite

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

  1. Der Client ruft den Nachrichtendienst über ConnectRPC auf.
  2. Die API nimmt die Anfrage erst an, wenn NATS JetStream den Befehl dauerhaft gespeichert hat.
  3. Ein Worker schreibt die Nachricht und ein Outbox-Event in einer Transaktion in die Workspace-Datenbank.
  4. Das Outbox-Relay veröffentlicht das festgeschriebene Event an NATS und Centrifugo.
  5. 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.

E-Mail an den Entwickler