MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 59s
Failed logins are counted per account+address (3), per account (20) and per address (30) within 15 minutes; a full bucket answers 429 with Retry-After for 15 minutes. Locking the account+address bucket first means an attacker cannot lock the owner out from elsewhere. Unknown names count like accounts. Success clears the account buckets, a password reset (mail or admin) lifts the lock. LOGIN_PROTECTION=false switches it off. chi's RealIP believed X-Forwarded-For from anyone. The client address now comes from the headers only when the connection is from a trusted proxy: TRUSTED_PROXIES=private (default: loopback, Docker, LAN), all (old behaviour), none, or CIDRs. A proxy that sends no client address is logged once and per-address limits are skipped for it. 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/collaboration.md | Gemeinsames Bearbeiten von Notizen: Log, Sperren, Konflikte, Offline, Transport-Stufen |
| 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 |
| ui-patterns.md | Einheitliche Bedienelemente: Personensuche, Profilbild-Stapel, Zähler |
| flaws.md | Bekannte Schwachstellen und technische Schulden |
Ü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 (WebSocket, SSE als Ersatz). Verteilt werden Ereignisse nach Änderungen.
- Notizen gemeinsam bearbeiten: server-autoritatives Operations-Log mit Versionen und Sperren pro Bullet, Konfliktkopien statt Überschreiben, Offline-Warteschlange in IndexedDB, Abgleich auch hinter restriktiven Proxys (modules/collaboration.md).
- Auth: JWT (HS256, 30 Tage) mit
token_versionund Sperrliste, dazu API-Keys (mindsift_sec_…) für Webhooks. - Freigaben: Aufgabenlisten, geteilte Listen, Notizen und Ordner jeweils mit Rolle Bearbeiter oder Leser.
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.