# Backend & Kollaboration — Architekturentscheidung > Stand: 2026-06-29 · Ziel: komplett self-hosted, kollaborations-offen ## Grundsatz So lange wie möglich **client-only** bleiben; das Backend additiv einführen, ohne den Kern umzubauen. Die Pure-Ableitungs-Architektur (ein serialisierbares Modell, alle Sichten abgeleitet) ist bereits kollaborations-freundlich. ## Phasen | Phase | Persistenz / Backend | |---|---| | **0–3** (Modellierer) | **Client-only**: IndexedDB + Datei-Export/Import (JSON). Offline-fähig (PWA möglich). Kein Server. | | **5** (Konten/Persistenz) | **Supabase self-hosted** (Docker Compose): Postgres + Auth + Storage. Projekte, Versionen, Dateien (IFC/Pläne/Assets). Row-Level-Security pro Nutzer/Projekt. | | **6** (Kollaboration) | **Yjs (CRDT)** + **Hocuspocus** Sync-Server (Container), persistiert Snapshots nach Postgres. Presence/Cursors. Optional Supabase-Realtime nur für leichte Broadcasts. | ## Warum Yjs/Hocuspocus statt reinem Supabase-Realtime Gleichzeitiges Editieren eines strukturierten Dokuments braucht Konfliktauflösung (CRDT). Yjs ist dafür Standard; Hocuspocus ist der self-hostbare Server dazu und kann nach Postgres (Supabase) persistieren. Supabase-Realtime allein wäre nur Pub/Sub ohne Merge-Semantik. ## Was wir JETZT schon richtig machen (damit Collab nicht blockiert) - Dokumentmodell rein **JSON-serialisierbar**, keine Zyklen, stabile IDs. - Edits immutable über `setProject` → später leicht auf Yjs-Doc abbildbar (`Y.Map`/`Y.Array` je Sammlung: drawingLevels, layers, components, walls …). - Kein Wahrheits-Zustand im Three.js-Scene-Graph oder im DOM — alles ableitbar. - Ressourcen (Components/Hatches/Lines) als referenzierte Bibliotheken (IDs) → gut mergebar. ## Self-hosted Stack (Skizze, Phase 5/6) ``` docker-compose: supabase (postgres, gotrue auth, storage, kong gateway, studio) hocuspocus (yjs websocket sync, persist -> postgres) web (vite build, statisch via nginx/caddy) ``` Alles auf eigener Infrastruktur lauffähig; keine externe Cloud nötig. ## Offene Punkte - Granularität der CRDT-Struktur (pro Sammlung vs. pro Element). - Datei-Storage (Supabase Storage vs. S3-kompatibel/MinIO im selben Stack). - Auth-Modell (E-Mail, OIDC/SSO fürs Büro).