System-Architektur

Wie Omnika unter der Haube funktioniert — Edge bis Datenbank.

High-Level-Diagram

User-BrowserCaddyTLS-Termination + StaticNext.js 16 (App-Router)RSC + Server-ActionsRedis (BullMQ-Jobs)Anthropic Claude (AI)SQLitebetter-sqlite3 + sqlite-vecResend (Email)LiveKit-SFUVoice/WebRTCY.js-WS-ServerMultiplayer (CRDT)

Edge (Caddy) → App (Next.js 16) → Daten (SQLite, sqlite-vec) · Echtzeit-Sidecars: LiveKit-SFU, Y.js · Jobs/AI/E-Mail: Redis, Anthropic, Resend

Tech-Stack

LayerTechnologyWhy
FrontendNext.js 16 (App-Router) + React 19RSC für SEO + streaming, Server-Actions für formulare.
StylingTailwind CSSUtility-first für schnelle Iteration ohne CSS-Bundling-Drama.
State (Client)React hooks + Y.js für MultiplayerHooks für UI-State, Y.js-CRDT für conflict-free Multiplayer.
AuthBetter-Auth + Argon2id-PasswordsSessions in SQLite, kein externer Auth-Provider, EU-konform.
DatabaseSQLite via better-sqlite3Single-box-fast, WAL-Mode, kein Network-Hop pro Query.
Vector-Searchsqlite-vecEmbedded — keine separate Vector-DB, ein File für alles.
SearchSQLite FTS5Built-in Full-Text, keine zusätzliche Suche-Infrastruktur.
JobsBullMQ + RedisDurable, retry-able Background-Jobs mit Backoff.
Cronnode-cron + cron-parserScheduled-Tasks in-process, kein externer Cron-Daemon.
Voice/VideoLiveKit SFUWebRTC + SIP, self-hosted, EU-Region.
MultiplayerY.jsCRDTs für conflict-free Real-Time-Edits.
AIAnthropic Claude + Google Generative AINika-Plugin-System — Modellwahl pro Workspace.
EmailResendTransactional + transactional, sauberer DKIM-Setup.
HostingHetzner Falkenstein DEEU-DSGVO-konform, deutsches Rechenzentrum.
DeployDocker + Caddy + GitHub-ActionsCaddy für TLS, Docker für reproducible Builds, GH-Actions für CI/CD.
CIGitHub Actions Self-Hosted Runners (4× Hetzner)Schneller als hosted Runner, kein Vendor-Lock-in.

Data-Flow-Diagrams

Read-Path

Page-Render aus dem Cache, eine Disk-Read pro Query.

BrowserCaddyNext-RSCSQLiteJSON

Write-Path

POST geht durch Auth, Audit-Log, dann erst in die DB.

BrowserPOST APIBetter-AuthAudit-LogSQLitePub/Sub

Multiplayer-Path

WS-Connection bleibt offen, Snapshot alle 5s in SQLite.

BrowserY.js-WSY.js-ServerSQLite-Snapshot (5s flush)

Security-Layers

  • TLS 1.3 in-transit
    Caddy terminiert TLS 1.3 mit HSTS, Auto-Renew via Let's Encrypt.
  • E2EE-Chat
    Double-Ratchet + X3DH-Setup — Server kann Channel-Inhalte nicht lesen.
  • Argon2id-Passwords
    Better-Auth-Sessions, 128 MiB / 8 Iterationen — GPU-resistent.
  • DSGVO + EU-Hosting + DPA
    Hetzner Falkenstein DE, Auftragsverarbeitungsvertrag auf Anfrage.
  • Audit-Log für Admin-Actions
    Actor-ID, Aktion, Ziel, Zeitstempel — append-only, nicht löschbar.
  • SQL-Injection-Protection
    Parameterized Queries only — keine String-Concatenation in SQL.

Scaling-Approach

Aktuell: Single-Hetzner-Box, ~50-100 concurrent users.

Phase 2 (V11+): Horizontal-Scaling per App-Server-Cluster + DB-Replication.

Why Single-Box bisher: 95% der Teams brauchen kein Cluster, 5% sind Enterprise-Tier wo wir custom-deployen.

Open-Source-Roadmap

Mittelfristig planen wir Omnika unter einer Source-Available-Lizenz zu öffnen.

Mehr zur OSS-Roadmap