System- und Architekturübersicht

NachGedacht HQ

NachGedacht HQ ist eine zentrale, selbst gehostete Plattform für sichere Geschäfts- und Kundenkommunikation. Sie vereint Kunden-Onboarding, zentrales Postfach, Teamarbeit, Sicherheits- und Betriebsfunktionen in einer gemeinsamen Infrastruktur. Ziel ist es, Unternehmen eine datenschutzfreundliche, effizient verwaltbare Lösung zu bieten, unabhängig von externen Cloud-Diensten.

Jeder Kundenbetrieb ist vollständig mandantengetrennt. Daten, Benutzer und Postfächer bleiben sauber isoliert. Die Plattform automatisiert wiederkehrende Prozesse wie das Kunden-Onboarding, Benutzer- und Rollenverwaltung, Postfachanbindung sowie Sicherheits- und Compliance-Aufgaben. Gleichzeitig sind Funktionen wie Passkeys, AES-256-Verschlüsselung, Audit-Logs und ein Security Center fest integriert.

Der Betrieb erfolgt vollständig in eigener Infrastruktur, inklusive Build-, Test- und Release-Prozessen. Die Architektur ist modular aufgebaut: Studio für Marketing und Onboarding, Server für die Geschäftslogik, Desktop für die tägliche Arbeit im Team. NachGedacht HQ richtet sich an Unternehmen, die Sicherheit, Nachvollziehbarkeit und effiziente Zusammenarbeit in einer zentralen Plattform vereinen möchten.

3Repositories
5Nutzerrollen
AES‑256Postfach-Verschlüsselung
45Vorwärts-Migrationen
6Hintergrund-Dienste
3Selbst gehostete CI-Agenten
0Abhängigkeit von GitHub Actions

Postfach & Kommunikation

Jeder Kundenbetrieb bekommt ein eigenes, zentral verwaltetes Postfach — Zugangsdaten laufen nie roh durchs System.

Kern

Zentrales Kunden-Postfach

Ein Kundenbetrieb bindet sein bestehendes IMAP/SMTP-Postfach ein; Zugangsdaten werden AES-256-GCM-verschlüsselt gespeichert, nie im Klartext gehalten.

Team

Mehrere Zugänge pro Kunde

Kundenbetriebe verwalten ihr Team selbst — Kolleg:innen einladen, Zugänge entfernen. Ein Schutzmechanismus verhindert, dass der letzte Zugang gelöscht wird.

Echtzeit

IMAP-IDLE Push

Eine dauerhafte IDLE-Verbindung je Zentralkonto meldet neue Nachrichten innerhalb von Sekunden per WebSocket-Push an den Client — kein Warten auf den nächsten Poll-Zyklus.

Koordination

Nachrichten-Reservierung

Claim/Release-Mechanismus verhindert, dass zwei Teammitglieder gleichzeitig an derselben Anfrage arbeiten.

Routing

Zuständigkeiten & Abwesenheit

Routing-Regeln je Zuständigkeitsbereich, inklusive automatischer Vertretung während einer aktiven Abwesenheit — auch offen-endig.

Zustellung

Geschäftszeiten-Warteschlange

Antworten, die außerhalb der Geschäftszeiten entstehen, werden geparkt und automatisch verschickt, sobald das Zeitfenster wieder offen ist.

Zuverlässigkeit

Zentrale Antwort-Idempotenz

Eine State Machine über jeden ausgehenden Reply schließt die Doppelversand-Lücke — ein Retry nach Teilfehler erzeugt nie eine zweite Mail.

Schutz

Mail-Flood-Schutz

Obergrenze für Anhang-Größen und für die Anzahl Nachrichten je Sync-Durchlauf — verhindert, dass ein einzelner Sync-Zyklus den Server überlastet.

Eskalation

SLA-Wächter

Prüft alle 15 Minuten auf unbeantwortete Nachrichten jenseits einer Frist und eskaliert je Nachricht genau einmal per E-Mail an die zuständige Stelle.

Sicherheit & Compliance

Der Teil des Produkts, der Kunden in regulierten Branchen überhaupt erst überzeugt.

HinSchG

Anonymer Hinweisgeber-Kanal

Hybrides Ende-zu-Ende-Schema: der Client erzeugt einmalig einen symmetrischen Schlüssel, verpackt ihn per RSA-OAEP und nutzt ihn für den gesamten weiteren Nachrichtenwechsel. Der Fall-Schlüssel geht nie über die Leitung; strikte Mandantentrennung zwischen Kundenbetrieben.

DSGVO

Betroffenenanfragen-Selbstbedienung

Anfragen nach Art. 15 ff. DSGVO mit eingebautem Fristen-Tracking und stündlicher Erinnerung, sobald eine Frist auf drei Tage schrumpft.

DSGVO

Automatische Löschfristen

Ein täglicher Sweep löscht abgeschlossene DSGVO-Anfragen und geschlossene Hinweisgeber-Fälle nach Ablauf ihrer Frist — automatisch, protokolliert im Audit-Log (Art. 5 Abs. 1 lit. e).

Datenintegrität

Kunden-Löschung mit Abhängigkeitsprüfung

Ein Kunde lässt sich erst löschen, wenn alle produktiven CASCADE-Abhängigkeiten geprüft sind — keine stillen Kollateralschäden an Postfächern, Team-Zugängen oder Onboardings.

Audit

Security Center

Laufende Prüfung: Secret-Scanning (gitleaks), Abhängigkeits-Audit, Repository-Hygiene, Sicherheitssignale aus dem selbst gehosteten Forgejo — ein Statusbild statt Blindflug.

Login

Passkeys & Geräte-Alarme

Passkey-Anmeldung als phishing-resistenter Standard; automatische E-Mail bei Login von einem neuen Gerät. Für Inhaber- und Admin-Konten ist ein Passkey Pflicht für jede schreibende Aktion.

Login

Self-Service-Passwort-Reset

Kundenkonten setzen ihr Passwort selbst zurück. Bewusst nicht für Inhaber- und Admin-Konten — dort bleibt der Reset ein bewusster, geschützter Vorgang.

Kryptografie

AES-256 für Zugangsdaten

Mail-Zugangsdaten werden ausschließlich AES-256-GCM-versiegelt abgelegt; der Entschlüsselungs-Schlüssel liegt nur im Serverprozess und wird nie an einen Client gesendet oder geloggt.

Protokoll

Unveränderbares Audit-Log

Jede Rechteänderung, jeder Jarvis-Befehl, jeder sicherheitsrelevante Vorgang landet in einer append-only-Tabelle — ein Datenbank-Trigger weist UPDATE und DELETE hart ab.

Jarvis — Sprachsteuerung fürs HQ

Eine Betriebsassistenz, die den Server per Sprache oder Text abfragen und steuern kann — mit fest verdrahteten Sicherheitsklassen statt frei interpretierter Befehle.

Verarbeitung

Intent-Engine

Erkannter Text wird auf einen festen Intent abgebildet; unbekannte Eingaben enden sauber als UNKNOWN_INTENT statt in einer geratenen Aktion.

Ausführung

Action Registry

Jede Aktion ist einzeln registriert und einer Sicherheitsklasse zugeordnet: read_only, local_control, confirm_required oder restricted.

Statusbild

System-Check-Aggregator

Bündelt Ressourcen, Security Center, Client-Releases, Deployment-Status, SLA, Backups, Pipeline, Mailkonten und Voice zu einer einzigen gesprochenen Lagemeldung.

Host

Voice-Host-Registry

Ein WebSocket-Kanal verbindet den späteren Electron Voice Host; fehlt er, degradieren die betroffenen Routen sauber auf 503 statt zu blockieren.

Audit

Strukturiertes Befehls-Log

Jeder Befehl landet mit Intent, Ergebnisstatus, Dauer und Quelle (voice/text) in einer eigenen indexierten Tabelle — auswertbar, nicht nur ein JSON-Klumpen.

Kontrolle

Host-Steuerung

Stop, Aktivieren/Deaktivieren und Push-to-Talk laufen über einen einzigen, spät gebundenen Steuer-Kanal — dieselbe Instanz für Admin-Board-Testeingabe und echtes Voice.

Kunden-Self-Service & Onboarding

Vom ersten Formular bis zum aktiven Postfach, ohne dass jemand manuell etwas einträgt.

Onboarding

Direktes Kunden-Onboarding

Signierter HTTPS-Fastpath vom Marketing-Formular direkt zum Server, mit E-Mail-Relay als Fallback, falls der direkte Weg einmal nicht erreichbar ist.

Einladung

Wiederverwendbares Einladungssystem

Ein gemeinsamer Token-Mechanismus für Personal- und Kunden-Team-Einladungen — ein Weg für beide Fälle.

UI

Onboarding-Checkliste

Sichtbarer Fortschritt im Kundenportal, statt eines Postfachs, bei dem unklar bleibt, was als Nächstes zu tun ist.

Formular

Kontaktformular-Fastpath

Direkter, authentifizierter HTTPS-Weg vom öffentlichen Kontaktformular zum Server — bei fehlendem Token fällt die Website auf ihre normale Zustellung zurück.

Admin & Betrieb

Werkzeuge für den laufenden Betrieb — nicht kundensichtbar, aber jeden Tag im Einsatz.

Deploy

„Jetzt deployen“-Knopf

Git Pull, Neu-Build und der dokumentierte WinSW-Selbstneustart des Windows-Diensts — ein Klick im Admin Board statt manueller Terminal-Befehle.

Releases

Client-Releases-Übersicht

Version, Branch und Tag-Status des Desktop-Clients auf einen Blick, gespeist aus Forgejo, inklusive Steuerung des Release-Vorgangs.

CI/CD

Pipeline-Report-Dashboard

Builds, Tests und Deployments aus allen Repos laufen über einen Einzweck-Token in einem gemeinsamen Statusbild im Admin Board zusammen.

Kommunikation

Voice-Channel

LiveKit-gestützte Sprachräume für interne Team-Abstimmung, direkt im HQ integriert.

Ressourcen

Server-Ressourcen & Backups

CPU, Speicher, Plattenplatz und der Stand der verschlüsselten Backups als eigene Admin-Screens — Grundlage auch für Jarvis' Lagemeldung.

Updates

Client-Update-Feed

electron-updater-Artefakte werden über einen separaten Bearer-Token hochgeladen und unauthentifiziert ausgeliefert — vom übrigen Auth-Modell entkoppelt.

Architektur im Detail

Drei eigenständige Repositories, ein einzelner Node-Prozess, strikte Mandantentrennung auf Datenbankebene — und eine Request-Pipeline, die man Zeile für Zeile lesen kann.

nachgedacht-studio Next.js · Marketing + Onboarding nachgedacht-hq-server Node/TypeScript · zentraler Server Multi-Tenant, ein Server für alle Kunden PostgreSQL customers · mail_accounts · users nachgedacht-hq Electron · Mitarbeiter-Mailclient Kundenbetrieb Browser-Portal + eigenes IMAP/SMTP-Postfach signierter HTTPS-Fastpath REST + WebSocket-Push Portal-Login, IMAP/SMTP

Systemgrenzen: die Desktop-App spricht ausschließlich die dokumentierte HTTPS-API; Datenbank- und Mailzugänge bleiben im Serverprozess.

01 Prozess & Laufzeit

Der gesamte Server ist ein einziger Node-Prozess (src/index.ts), ohne Framework — roher node:http/node:https. Kein Application-Server, kein Container in Produktion: ein nativer Windows-Dienst über WinSW.

Ein Node-Prozess · src/index.ts Startup-Guard assertMigrationsApplied() — sonst Abbruch HTTP / HTTPS-Server TLS optional über Tailscale-Zertifikat Host-Header-Check für Onboarding-Subdomain createApp() — Route-Handler-Kette ~24 handle*Routes(), erste Übereinstimmung gewinnt · sonst 404 not_found Autorisierung zentral in authorization.ts WebSocket-Upgrades voice-signaling · jarvis-host mail-push (IDLE → Client) spät gebunden auf denselben http.Server 6 Hintergrund-Dienste mail-sync · mail-send · SLA-Wächter DSGVO-Reminder · Data-Retention IMAP-IDLE · Start/Stop mit dem Server Dependency-Injection ~40 Services, einmalig verdrahtet PostgreSQL 45 Vorwärts- Migrationen customers · users mail_* · audit_log jarvis_command_log

Alle Dienste teilen sich denselben Connection-Pool; die Scheduler starten nach listen() und werden bei SIGINT/SIGTERM sauber gestoppt.

02 Request-Pipeline

Eine einzige listener-Funktion in src/app.ts ruft die Route-Gruppen der Reihe nach auf. Jede Gruppe prüft Pfad und Methode selbst; die erste, die zuständig ist, antwortet und bricht die Kette ab. Kein Router-Framework, keine Middleware-Magie — die Reihenfolge ist der Code.

  1. system/health, /ready (DB-Ping), keine Auth
  2. auth — Better-Auth-Handler, Login-Seiten, Passkey-Setup, Account-Setup
  3. admin — Team-/Board-Verwaltung, hinter manage_users + Passkey
  4. customers / onboarding-mail / customer-onboarding-direct — Kundenregistrierung, signierter Onboarding-Payload (Relay + direkter HTTPS-Pfad)
  5. invite — Token-Einlösung über eine separate, signup-fähige Auth-Instanz
  6. customer-mailbox / mailbox-widget — Kundenportal, hart über customer_id gefiltert; öffentliches Antwortzeit-Widget
  7. secure-messages / whistleblower / gdpr-requests — je eigener Rate-Limiter, eigenes Browser-Client-Skript
  8. customer-team — Team-Selbstverwaltung des Kundenbetriebs
  9. mail-accounts / mail-messages — Zentralkonten, Ordner, Nachrichten, Senden, Reply-Idempotenz
  10. infrastructure — Deployment-, Backup-, Ressourcen-, Security-Center-, SLA-, Pipeline-Status
  11. projects / workspaces / contact-forms / contact-form-fast-path — Projektfreigaben, gehostete Formulare, Website-Fastpath
  12. conversations / voice / jarvis — Konversations-Sicht, LiveKit-Räume, Sprachbefehle
  13. updates — electron-updater-Feed (Download offen, Upload per Token)
  14. kein Treffer → 404 { error: "not_found" }

03 Autorisierung — eine Grenze für alles

src/authorization.ts ist die gemeinsame Sicherheitsgrenze. Jede geschützte Route ruft dieselbe Funktion mit ihrer konkreten Aktion auf; UI-Ausblendungen zählen nie als Schutz.

01
Gültige Better-Auth-Sitzung — sonst 401.
02
Verknüpftes, aktives HQ-Profil in users (auth_user_id). Gesperrte Konten verlieren sofort jeden Zugriff, auch mit noch gültiger Sitzung.
03
Feste Rolle erlaubt die Aktionowner · admin · support · viewer · customer_owner, jede mit einer festen Aktionsmenge. Ein Kunden-Login bekommt ausschließlich view_own_mailbox.
04
Bei projektbezogenen Daten die konkrete Freigabe (user_product_access). Nicht freigegebene und unbekannte Projekte liefern beide dieselbe neutrale 404.
Passkey als echter zweiter Faktor: für owner/admin verlangt jede Aktion außer read einen registrierten Passkey — ein Passwort-Login allein reicht dort nicht. Rechteänderungen beenden alle Sitzungen des betroffenen Kontos und landen im unveränderbaren Audit-Log.

04 Datenmodell & Mandantentrennung

45 nummerierte, ausschließlich vorwärts gerichtete SQL-Migrationen. Ein Startup-Guard verweigert den Start, wenn eine fehlt — es gibt keine automatische Migration beim Hochfahren.

Mandantentrennung ohne Sonderfälle: jede /api/customer/*-Route filtert strikt über mail_accounts.customer_id, nie über eine einzelne user_id. Dadurch funktionierten mehrere Team-Zugänge pro Kunde, sobald zusätzliche users-Zeilen existierten — ganz ohne Änderung am Autorisierungsmodell.
001–010

Fundament

products, users, user_product_access, sessions, audit_log (append-only-Trigger), Better-Auth-Tabellen, Geräteautorisierung.

011–018

Kundenmodul

customers, members, products, domains, E-Mail-User, Onboardings mit fixer URL, Formularzweck.

019–022, 030–044

Mail

mail_accounts (versiegelte Credentials), Sync-State, Reservierungen, Send-Schedule, In-Reply-To, Signaturen, Reply-Idempotenz.

023–029

Voice & CI/CD

voice_rooms, Pipeline-Runs, Security-Center-History, Findings ↔ Issues, Codex-Automation.

035–042

Sichere Kanäle

Mailbox-Secure-Messages, Hinweisgeber-Kanal, SLA-Wächter, DSGVO-Anfragen, Data-Retention, bekannte Login-Geräte.

045

Jarvis

jarvis_command_log — indexiert nach Zeit, Actor und Intent, mit Dauer und Ergebnisstatus.

05 Secrets & Ausfallverhalten

Jedes Geheimnis hat genau einen Zweck. Fehlt ein optionales, fällt nur das eine Feature sauber aus (503) — statt den ganzen Server zu reißen. Nur BETTER_AUTH_SECRET ist beim Start Pflicht.

MAIL_CREDENTIALS_ENCRYPTION_KEY

Versiegelt IMAP/SMTP-Zugangsdaten. Fehlt er, scheitern nur die Credential-Operationen — sonst nichts.

ONBOARDING_MAIL_SIGNING_SECRET

Nur zwischen Server und nachgedacht-studio geteilt. Ohne ihn ist Onboarding schlicht aus.

CICD_REPORT_TOKEN

Einzweck: ein geleaktes CI-Secret kann nur Pipeline-Läufe schreiben, sonst nichts.

UPDATE_UPLOAD_TOKEN

Gate nur für den PUT-Upload des Update-Feeds — vom übrigen Auth-Modell entkoppelt.

CONTACT_FORM_WEBHOOK_TOKEN

Fehlt er, liefert der Fastpath 503 und die Website nutzt ihre normale Zustellung.

LIVEKIT_KEYS

Ohne sie sind die Voice-Räume deaktiviert, der Rest läuft normal weiter.

06 Öffentliche Onboarding-Subdomain

Ist ONBOARDING_PUBLIC_BASE_URL gesetzt, prüft der Server bei jeder Anfrage serverseitig den Host-Header.

Anfragen mit diesem Host erreichen ausschließlich die öffentliche Formular-Oberfläche und ihr öffentliches Lese-/Submit-API. /admin und jede interne /api/admin/*-Route liefern dort eine neutrale 404 — keine Weiterleitung ins interne HQ, kein Informationsleck über die Existenz des Admin-Bereichs.

07 Betrieb & Deployment

Checkout

Getrennter Runtime-Checkout

Der laufende Dienst zieht per git pull --ff-only in ein eigenes Arbeitsverzeichnis, gebaut wird dort, nicht im Entwicklungs-Repo.

Neustart

WinSW-Selbstneustart

Der „Jetzt deployen“-Knopf triggert den dokumentierten restart!-Befehl des Service-Wrappers — kein manuelles Restart-Service nötig.

Netz

Tailscale-Overlay

Privates Netz zwischen Server, Windows-PC und MacBook; TLS-Zertifikat via tailscale cert, damit der Server auch außerhalb von localhost erreichbar ist.

Guard

Migrations-Startsperre

Fehlt eine Migration in der Datenbank, startet der Prozess gar nicht erst — ein Deploy mit vergessener Migration fällt sofort auf.

KomponenteTechnologieRolle
nachgedacht-hq-serverNode.js, TypeScript, PostgreSQLZentraler Server — Auth, Postfach-Verwaltung, Compliance-Automatisierung, Jarvis, Admin Board
nachgedacht-hqElectron, ReactDesktop-Mailclient für Mitarbeiter:innen, plus Kunden-Rolle und späterer Voice Host
nachgedacht-studioNext.jsMarketing-Website + Onboarding-Formular, signiert den Onboarding-Payload
Authentifizierungbetter-auth + Passkey-PluginSessions, WebAuthn-Passkeys, feste Rollen (owner · admin · support · viewer · customer_owner)
Mailimapflow, nodemailer, mailparserServer-eigene IMAP/SMTP-Anbindung je Zentralkonto, persistentes IDLE
SprachkanalLiveKitInterne Voice-Räume; Jarvis-Audio über den Electron Voice Host
NetzwerkTailscalePrivates Overlay-Netz zwischen Server, Windows-PC und MacBook
DienstbetriebWinSW (Windows-Dienst)Nativer Dienst mit dokumentiertem Selbstneustart für den Deploy-Knopf

CI/CD-Infrastruktur

Die komplette Build- und Release-Pipeline läuft auf eigener Infrastruktur — GitHub dient nur noch als automatisch synchronisierter Backup-Spiegel.

Auslöser war eine wiederholt erschöpfte GitHub-Actions-Kontingentgrenze, die einen Client-Release blockierte. Statt eine Zahlungsmethode bei einem weiteren US-Anbieter zu hinterlegen, wurde die komplette Git- und CI/CD-Kette selbst gehostet: Forgejo für Git-Hosting, Woodpecker CI für Build/Test/Release. Security Center und die Client-Releases-Übersicht im Admin Board beziehen ihre Signale seitdem aus Forgejo.

Linux · Docker

Docker-Agent

Lint, Build, Unit- und Integrationstests (inklusive echtem Postgres-Service), Secret-Scanning — für beide Repositories.

Windows · nativ

Windows-Agent

Baut den Windows-Installer — native Kompilierung (electron-rebuild, NSIS) braucht eine echte Windows-Umgebung, kein Container.

macOS · arm64, nativ

MacBook-Agent

Baut, signiert (Developer-ID) und notarisiert den macOS-Build — beides nur mit echtem macOS möglich.

Jede Plattform veröffentlicht sich selbst: statt eines zentralen Publish-Schritts lädt jede Plattform ihre Artefakte direkt hoch, sobald ihr Build fertig ist — ein Versions-Monotonie-Check verhindert dabei zuverlässig, dass eine ältere Version eine neuere überschreibt.