MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m26s
Phase 2 of the collaboration plan: - frontend/src/lib/docSync: TypeScript port of the block tree, operations, effects and order keys (kept identical to Go via shared test vectors), diff from the editor's flat list to operations, IndexedDB persistence, HTTP transport and DocSyncEngine (one request in flight, idempotent resends, backoff, 3 s/30 s polling, keepalive flush and leave on exit, block leases for focus, 20 s grace and new blocks). - Text changes carry the version the user saw when typing (first change wins when coalescing; a stale focused field keeps its old base), so a concurrent edit becomes a conflict copy instead of a silent overwrite. - DocumentEditor uses the engine instead of the 800 ms whole-document PUT; editors (not only owners) can edit, remote changes appear live. - Server: task IDs of linked blocks are delivered again, linked tasks follow ticked/deleted blocks after sync, note tags are derived, title changes notify other users; block IDs already used in another note are renamed (starter content with fixed IDs was empty for every further user). - Fix: unlinking tasks from blocks wrote to non-existent columns and never worked (error was swallowed). - Tests: Go/TS order key vectors, diff round trips, engine races (lost responses, offline + reload, edits arriving between typing and sending, stale focused field, duplicate first block), plus a Playwright test with two browsers against the real image (e2e/run.sh). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MindSift Technische Dokumentation
Referenz für Entwickler und Administratoren. Alle Angaben wurden gegen den Code im Branch dev geprüft (Stand Oktober 2026). Abweichungen zwischen Doku und Code melde bitte als Fehler in flaws.md.
Inhalt
| Dokument | Inhalt |
|---|---|
| architecture.md | Aufbau, Technologie-Stack, Start, Konfiguration, Build |
| database.md | SQLite-Schema, Migrationen, Datenmodell |
| api/rest.md | Alle REST-Endpunkte |
| api/websocket.md | Echtzeit über WebSocket und SSE, Ereignisse |
| modules/triage.md | Schnellerfassung und Triage |
| modules/tasks.md | Aufgaben, Kanban, Alarme |
| modules/workspace.md | Outliner-Notizen, Ordner, Tags |
| modules/lists.md | Geteilte Listen |
| sharing-and-permissions.md | Rollen, Gruppen, Freigaben |
| reverse-proxy.md | Nginx, Traefik, Caddy, Cloudflare |
| theming.md | Themes und Design-Variablen |
| flaws.md | Bekannte Schwachstellen und technische Schulden |
| plans/kollaboration-notizen.md | Plan: gemeinsames Bearbeiten von Notizen |
Überblick in 60 Sekunden
- Ein Go-Binary liefert REST-API, WebSocket/SSE und das eingebettete React-Frontend (
go:embed). Es gibt genau einen Container und eine SQLite-Datei (/data/mindsift.db). - Datenhaltung: vollständig in SQLite. Es gibt keine
.md-Dateien auf der Platte; Markdown wird bei Bedarf aus den Blöcken erzeugt (documents.markdown_cache, Export als.md). - Echtzeit: ein Hub mit Räumen und Benutzer-Kanälen. Verteilt werden Ereignisse nach REST-Änderungen. Es gibt keine CRDTs, Sperren oder Cursor-Presence.
- Auth: JWT (HS256, 30 Tage) mit
token_versionund Sperrliste, dazu API-Keys (mindsift_sec_…) für Webhooks. - Freigaben: Aufgabenlisten und geteilte Listen mit Rolle Bearbeiter oder Leser, Notizen und Ordner nur lesend.
Entwickeln
# Backend (Go 1.23)
go vet ./... && go test ./...
# Frontend (Node 22)
cd frontend && npm ci && npx tsc --noEmit && npm run test:run && npm run build
Das Frontend wird für das Binary nach cmd/server/dist gebaut (siehe Dockerfile). Die CI läuft unter .gitea/workflows/build-and-publish.yaml.