# 🧠 MindSift ### *Der Kopf frei in drei Sekunden.* [![Self-Hosted](https://img.shields.io/badge/100%25-Self--Hosted-2563eb?style=flat-square)](#) [![Docker](https://img.shields.io/badge/Deployment-Single%20Container-2496ed?style=flat-square&logo=docker&logoColor=white)](#-schnellstart) [![SQLite](https://img.shields.io/badge/Daten-SQLite-003b57?style=flat-square&logo=sqlite&logoColor=white)](#-deine-daten-gehören-dir) [![Version](https://img.shields.io/badge/Version-v0.49.1-16a34a?style=flat-square)](CHANGELOG.md) **MindSift** ist eine selbst gehostete Schaltstelle fĂŒr spontane Gedanken, Aufgaben mit Kanban-Board, hierarchische Outliner-Notizen, die mehrere Personen gleichzeitig bearbeiten können, und gemeinsame Listen. Alles lĂ€uft als ein einzelner Container mit eingebetteter SQLite-Datenbank, auf deinem eigenen Server.

MindSift Triage am Desktop, links hell, rechts dunkel

Links das helle, rechts das dunkle Theme. [Philosophie](#-die-philosophie) ‱ [Funktionen](#-funktionen) ‱ [Schnellstart](#-schnellstart) ‱ [Betrieb](#-betrieb--konfiguration) ‱ [Entwicklung](#-entwicklung) ‱ [Dokumentation](#-dokumentation)
--- ## 💡 Die Philosophie Die meisten Notiz- und Aufgaben-Apps verlangen Struktur im falschen Moment: Wenn dir ein Gedanke kommt, willst du keinen Ordner suchen und keine Felder ausfĂŒllen. MindSift trennt deshalb **Erfassen** und **Organisieren**: 1. **Abladen:** In die Eingabeleiste tippen, `Enter`, fertig. Wer will, weist den Gedanken gleich einer Aufgabe, Liste oder Notiz zu. 2. **Sichten (Triage):** SpĂ€ter gehst du den Stapel Karte fĂŒr Karte durch: verwerfen, zur Aufgabe machen, in eine Notiz oder Liste verwandeln. 3. **Vertiefen:** Aus losen Ideen werden Aufgaben mit Unteraufgaben, vernetzte Outliner-Notizen oder geteilte Listen fĂŒr Familie und Team. --- ## ✹ Funktionen ### ⚡ Schnellerfassung & Triage * Eingabeleiste im Kopf der App, jederzeit mit `C` oder `/` fokussierbar; auch per Spracheingabe: ĂŒber den Browser oder datenschutzfreundlich ĂŒber einen eigenen Whisper-Container (optional in `docker-compose.yml`, siehe [Architektur](Doku/architecture.md#spracherkennung)); auf Smartphones auch per GedrĂŒckthalten des `+`-Knopfs (Hold-to-Record mit Pegel-Wellen). * Ziel beim Erfassen wĂ€hlbar: Posteingang, Aufgabe (mit Aufgabenliste), Listeneintrag oder Notiz; die Wahl bleibt fĂŒr die nĂ€chsten EintrĂ€ge stehen. Mit eigenem Whisper-Server erscheint der Text schon beim Sprechen; jede Person wĂ€hlt selbst, ob ihr Mikrofon Whisper oder die Erkennung des Browsers nutzt. * **Triage-Deck:** `H`/`←` verwerfen, `L`/`→` zur Aufgabe, `T` Aufgabe mit Termin, `D` in Notiz verwandeln, Leertaste = spĂ€ter. Auf dem Smartphone per Wischgeste oder ĂŒber große Knöpfe unter der Karte; die Warteschlange klappt bei Bedarf auf. * **Teilen aus anderen Apps:** Als installierte App erscheint MindSift im Teilen-MenĂŒ des Smartphones; geteilte Texte und Links landen im Posteingang und lassen sich direkt danach mit einem Tipp zur Aufgabe oder auf eine Liste schicken. * Papierkörbe mit Wiederherstellen fĂŒr verworfene Gedanken, gelöschte Aufgaben und Notizen; unter Kontoeinstellungen → Aufbewahrung legt jede Person fest, nach wie vielen Tagen Erledigtes und Gelöschtes aufgerĂ€umt wird.

MindSift Triage am Smartphone, helles Theme    MindSift Notiz am Smartphone, dunkles Theme

### ✅ Aufgaben & Kanban * Listen- und Kanban-Ansicht, Spalten pro Aufgabenliste frei konfigurierbar (Name, Farbe, Erledigt-Spalte). „Alle Aufgaben“ fĂŒhrt die Spalten aller Listen nach Namen zu einem Board zusammen. * PrioritĂ€ten, FĂ€lligkeitsdatum, Hashtags, Unteraufgaben mit Fortschrittsbalken, Markdown-Notizen. * Filter, Gruppierung und Sortierung; Drag & Drop in Liste und Board, auch auf den Reiter einer anderen Aufgabenliste. `Strg+Z` nimmt Löschen, Verschieben und Abhaken zurĂŒck. * **Papierkorb und Aufbewahrung:** Gelöschte und aufgerĂ€umte Aufgaben lassen sich aus dem Papierkorb zurĂŒckholen; erledigte Aufgaben wandern nach einer selbst gewĂ€hlten Frist (Standard 30 Tage) dorthin. * **Aufgabenlisten teilen** mit Benutzern oder Gruppen, wahlweise als **Bearbeiter** oder **nur lesend**. * **Aufgaben beobachten:** Beliebige Aufgaben per Klick abonnieren, um ĂŒber alle Änderungen informiert zu werden. * **Wiederholungen:** Wiederkehrende Aufgaben (tĂ€glich, wöchentlich, monatlich, jĂ€hrlich) mit automatischer Folgeaufgabe beim Abhaken. * **Tageszusammenfassung:** TĂ€gliche Übersicht fĂ€lliger Aufgaben zur selbst gewĂ€hlten Uhrzeit per E-Mail, Discord, eigenem Webhook oder Push. * **Push-Benachrichtigungen** auf Handy und Desktop (auch bei geschlossener App; iPhone/iPad als Home-Bildschirm-App), als eigener Kanal je Ereignis. * **Alarme & Benachrichtigungen:** FĂ€lligkeits-Alarme sofort, alle ĂŒbrigen Ereignisse (Freigaben, erledigte geteilte Aufgaben, beobachtete Aufgaben) gebĂŒndelt; pro Ereignis wĂ€hlbar ĂŒber E-Mail, Discord, eigenen Webhook und Push.

MindSift Aufgaben und Kanban-Board

### 📝 Workspace: Outliner-Notizen * Jeder Gedanke ein Bullet: `Enter`, `Tab`/`Shift+Tab`, Ein-/Ausklappen, Drag & Drop ganzer Äste; am Handy eine Leiste ĂŒber der Tastatur zum Ein-/AusrĂŒcken und Verschieben. Text lĂ€sst sich mit der Maus ĂŒber mehrere Punkte markieren und wie in einem Texteditor löschen, ersetzen oder kopieren. * **Zoom-Fokus** per Klick auf den Bullet, Breadcrumbs zum ZurĂŒcknavigieren; **Fokus-Modus** (`Strg+Umschalt+F`) zeigt nur die Notiz in Lesebreite, Ordner gleiten bei Bedarf von links herein. * **Journal:** eine Notiz pro Tag, alle Tage untereinander (heute oben, Ă€ltere laden beim Scrollen nach), mit Kalender zum Springen; einzelne Tage lassen sich teilen. Pro GerĂ€t abschaltbar. * Blocktypen und Slash-Befehle: `/todo`, `/number` (nummerierte Liste: 1., a., i.), `/link`, `/h1`–`/h3`, `/code` (mit Syntax-Hervorhebung), `/callout`, `/divider`, `/extract`, `/image`, `/audio`, `/diktat`. * **Bilder & Audio in Notizen:** `/image` (Datei, Kamera, Zwischenablage oder Link), `/audio` (Sprachnotiz oder Datei-Upload) und `/diktat` (Live-Transkription). * **Link-Vorschau:** Vorschaukarte (Titel, Beschreibung, Bild) fĂŒr Punkte, die nur aus einer Web-Adresse bestehen, z. B. ĂŒber `/link`; die Seite ruft der Server ab, nicht dein Browser. Pro GerĂ€t abschaltbar. * **Ast auslagern & Notizen zusammenfĂŒhren:** Bulletpoints samt Unterbaum in eigenstĂ€ndige Notizen auslagern (`/extract`) oder Notizen per Drag & Drop bzw. MenĂŒ zusammenfĂŒhren (jeweils mit vollstĂ€ndiger RĂŒckgĂ€ngig-Funktion). * Wiki-Links `[[Notiz]]`, auch auf **einzelne Punkte** (`[[Notiz#^id|Text]]`, kopierbar an jedem Punkt), Links und `#Hashtags`; Tag-Seiten bĂŒndeln alle Fundstellen. * Ordner, Favoriten, **To-Do-Rollup** ĂŒber alle Notizen und Export einer Notiz als `.md`. Mehrere Notizen mit `Strg`/`Shift`+Klick markieren und gemeinsam in einen Ordner oder auf den Papierkorb ziehen. Notizen und Listen bekommen ein Emoji als Symbol, oder keins. * **Aufgaben aus Notizen:** Ein HĂ€kchen lĂ€sst sich zur Aufgabe erweitern (und eine Aufgabe zur Notiz vertiefen); Haken, Titel und Unteraufgaben bleiben in beide Richtungen abgeglichen. * EingefĂŒgtes Markdown wird zur Gliederung: Überschriften werden zu Abschnitten mit eingerĂŒcktem Inhalt, Listen (auch nummeriert) behalten ihre Ebenen, AbsĂ€tze werden eigene Punkte. KĂŒrzel beim Tippen: `- `, `1. `, `[] `, `# `, `Strg+B`/`I`/`K`. `Strg+Z` / `Strg+Umschalt+Z` nimmt eigene Änderungen zurĂŒck bzw. stellt sie wieder her. * **Teilen:** Notizen und ganze Ordner lassen sich Benutzern oder Gruppen als **Bearbeiter** oder **Leser** freigeben. EmpfĂ€nger sortieren sie in ihren eigenen Baum ein. #### đŸ€ Gemeinsam bearbeiten * **Live:** Mehrere Personen schreiben gleichzeitig in derselben Notiz; Änderungen erscheinen bei den anderen in Bruchteilen einer Sekunde. Die Leiste ĂŒber der Notiz zeigt, wer gerade mitliest. * **Kein Überschreiben:** Wer in einem Bullet schreibt, hĂ€lt ihn kurz fĂŒr sich; andere sehen ein Schloss mit Namen und arbeiten in den ĂŒbrigen Bullets weiter. Kommt es doch zu einem Konflikt (z. B. nach Offline-Arbeit), bleibt der zweite Text als markierte Kopie mit „Übernehmen“/„Verwerfen“ erhalten. * **Offline-fest:** Jede Eingabe wird zuerst im Browser gesichert und spĂ€ter ĂŒbertragen, auch nach Neuladen oder Tagen ohne Netz. * **Hinter strengen Proxys:** WebSocket → SSE → Long-Polling → Abfrage alle 3 s; MindSift wĂ€hlt automatisch, was durchkommt. Der aktive Weg steht in der Leiste ĂŒber der Notiz („Live“, „Abgleich alle 3 s“). Technik dahinter: [Doku/modules/collaboration.md](Doku/modules/collaboration.md).

MindSift Workspace: zwei Personen in derselben Notiz

MindSift Journal mit Kalender

### 🛒 Geteilte Listen * Einkaufs-, Pack- und Checklisten mit Kategorien per Hashtag (`Hafermilch #KĂŒhlregal`), Mengenangaben und Drag & Drop zwischen Kategorien oder in eine andere Liste. Abgehakte EintrĂ€ge verschwinden nach einer wĂ€hlbaren Frist (Standard 7 Tage) von selbst. * Freigabe an Benutzer und Gruppen (Bearbeiter oder Leser); abgehakte EintrĂ€ge erscheinen bei allen in Echtzeit.

MindSift Geteilte Listen

### 🏱 Benutzer, Gruppen, Administration * GefĂŒhrte Ersteinrichtung, Rollen *Admin* und *Mitglied*. Einladungen als Code oder Link (auch fĂŒr mehrere Personen, auf Wunsch per E-Mail verschickt). Registrierung ohne Einladung wahlweise geschlossen, mit Freigabe durch einen Admin, nur fĂŒr bestimmte E-Mail-Endungen oder offen, auf Wunsch mit BestĂ€tigung der E-Mail-Adresse per Link – auch fest per Umgebungsvariable. * Gruppen mit Gruppen-Admins fĂŒr Freigaben. * Admin-Bereich: Benutzer, Einladungen, Instanzname, SMTP, Freigabe-Modus, Sicherungen, Spracherkennung, ob „dauerhaft aufbewahren“ erlaubt ist. ### 🎹 Darstellung & App * **FĂŒnf Farbfamilien** mit je einer hellen und dunklen Variante: Klassik, Fjord, Terrakotta, Polarized, Suri. Hell/Dunkel auf Wunsch „Wie System“, dazu eine eigene Akzentfarbe, Ecken rund oder eckig und Knöpfe mit oder ohne Rahmen (pro GerĂ€t). FĂŒr eigene Themes gibt es einen Theme-Manager (eine CSS-Datei). * **Installierbar als App (PWA)** auf Smartphone und Desktop. Nach einem Server-Update meldet die offene App „Neue Version verfĂŒgbar“ und lĂ€dt auf Wunsch neu; beim Neuladen bleibt der zuletzt offene Bereich offen. Sie startet auch ohne Netz mit dem zuletzt geladenen Stand; offline erfasste Gedanken und abgehakte Aufgaben oder ListeneintrĂ€ge werden nachgereicht, sobald die Verbindung wieder da ist.
Farbfamilie Fjord, links hell, rechts dunkel
Fjord
Farbfamilie Terrakotta, links hell, rechts dunkel
Terrakotta
Farbfamilie Polarized, links hell, rechts dunkel
Polarized
Farbfamilie Suri, links hell, rechts dunkel
Suri
### 🔌 Integrationen * **API mit SchlĂŒsseln:** Pro SchlĂŒssel schaltbare Rechte (Aufgaben und Listen lesen, anlegen, Ă€ndern; Inbox fĂŒllen), gleich fĂŒr beide ZugĂ€nge. Notizen und Einstellungen bleiben außen vor. * **curl / Smart Home:** z. B. `GET /api/v1/tasks?due=today&status=open` fĂŒr einen Home-Assistant-Sensor „Heute fĂ€llig“, abhaken per `PATCH`, Gedanken, Aufgaben und ListeneintrĂ€ge einliefern per `POST /api/v1/webhooks/ingest`. * **KI-Agenten (MCP):** MindSift ist ein MCP-Server (`POST /api/v1/mcp`, Streamable HTTP). Claude Code, OpenAI Codex, Claude Desktop, Cursor und eigene Agenten lesen, legen an, Ă€ndern, haken ab und löschen Aufgaben, legen Aufgabenlisten und Listen an und fĂŒhren Einkaufs- und Checklisten. `claude mcp add --transport http mindsift https://
/api/v1/mcp --header "X-API-Key: mindsift_sec_
"` * **Herkunft:** Was ein SchlĂŒssel anlegt oder Ă€ndert, trĂ€gt dauerhaft eine Badge mit seinem Namen; Mouseover oder Tippen zeigt, wer wann angelegt und geĂ€ndert hat. * **Ausgehend:** eigener Webhook als Benachrichtigungskanal (JSON per POST), Discord, E-Mail, Push. * Persönliche API-Keys, Datenexport als JSON, Markdown-Archiv (Obsidian-kompatibel). --- ## 🚀 Schnellstart MindSift lĂ€uft als einzelner Container mit Webserver, API, Datenbank und Frontend. ### Option 1: Installationsskript ```bash curl -fsSL https://git.dsit.me/sandrodach/MindSift/raw/branch/dev/install.sh | bash ``` Das Skript legt ein Verzeichnis an, lĂ€dt `docker-compose.yml` und `.env.example`, erzeugt ein `JWT_SECRET` und startet den Container. ### Option 2: Docker Compose ```bash mkdir -p mindsift && cd mindsift curl -fsSL https://git.dsit.me/sandrodach/MindSift/raw/branch/dev/docker-compose.yml -o docker-compose.yml curl -fsSL https://git.dsit.me/sandrodach/MindSift/raw/branch/dev/.env.example -o .env # In .env: JWT_SECRET durch einen langen Zufallswert ersetzen! docker compose up -d ``` Alle Einstellungen stehen mit ErklĂ€rung in `.env`. Optional kommt eine eigene Spracherkennung dazu: Block `whisper` in `docker-compose.yml` einkommentieren und `STT_URL=http://whisper:8000` setzen (Anleitung in der Datei). Minimal: ```yaml services: mindsift: image: git.dsit.me/sandrodach/mindsift:latest # :latest = Stand von main (jede Version), :dev = Entwicklungsstand restart: unless-stopped ports: ["8080:8080"] volumes: ["./data:/data"] environment: - JWT_SECRET=hier-ein-langer-zufaelliger-wert - BASE_URL=https://mindsift.example.com ``` ### Ersteinrichtung Rufe `http://localhost:8080` auf. Beim ersten Start fĂŒhrt ein Assistent durch das Anlegen des Administrator-Kontos. > ⚠ **`JWT_SECRET`:** Ohne Angabe (oder mit einem der Platzhalter aus den Beispielen) erzeugt der Server beim ersten Start einen Zufallswert und speichert ihn als `jwt.secret` im Datenverzeichnis. FĂŒr Produktion lieber selbst einen langen Zufallswert setzen. Rufe die Instanz außerdem direkt nach dem Start auf, damit kein Fremder das erste Konto anlegt. --- ## ⚙ Betrieb & Konfiguration | Variable | Standard | Zweck | |---|---|---| | `PORT` | `8080` | HTTP-Port | | `DATA_DIR` | `/data` (Container) | Ablage der Datenbank `mindsift.db` | | `JWT_SECRET` | zufĂ€llig erzeugt (`/data/jwt.secret`) | SignaturschlĂŒssel der Anmelde-Tokens; Platzhalter werden ignoriert | | `BASE_URL` | `http://localhost:8080` | Öffentliche URL. Nur wenn gesetzt (und SMTP eingerichtet ist), gibt es „Passwort vergessen?“ – die Links in den Mails werden ausschließlich daraus gebaut | | `TRUSTED_PROXIES` | `private` | Wessen `X-Forwarded-For`/`X-Real-IP` geglaubt wird: `private` (Proxy im Docker-/Heimnetz), `all` (immer, frĂŒheres Verhalten), `none` oder eigene CIDR-Bereiche ([Doku/reverse-proxy.md](Doku/reverse-proxy.md#client-ip-und-trusted_proxies)) | | `LOGIN_PROTECTION` | `true` | Sperre nach Fehlversuchen: 3 pro Konto und Adresse, 20 pro Konto, 30 pro Adresse, jeweils 15 Minuten. `false` schaltet sie ab | | `TZ` | `Europe/Berlin` | Zeitzone fĂŒr FĂ€lligkeiten und Alarme (ganztĂ€gige Aufgaben melden sich um 9:00) | | `REGISTRATION_MODE` | leer (Admin-UI entscheidet) | Registrierung ohne Einladung: `closed`, `approval` (Admin gibt frei), `domain` (nur erlaubte E-Mail-Endungen), `domain+approval` (Endungen sofort, andere nach Freigabe), `open`. Gesetzt ist es im Admin-UI gesperrt | | `REGISTRATION_DOMAINS` | leer | Erlaubte E-Mail-Endungen fĂŒr die `domain`-Modi, z. B. `firma.de, *.firma.de`; gesetzt im Admin-UI gesperrt | | `REGISTRATION_VERIFY_EMAIL` | leer (Admin-UI entscheidet) | `true`: Wer sich ohne Einladung registriert, bestĂ€tigt zuerst seine E-Mail-Adresse per Link (braucht SMTP und `BASE_URL`); unbestĂ€tigte Konten werden nach 48 Stunden gelöscht | | `ALLOW_REGISTRATION` | `false` | `true` = wie `REGISTRATION_MODE=open` (gesperrt); `false` lĂ€sst die Wahl dem Admin-UI | | `LOG_LEVEL` / `DEBUG` | `info` / `false` | Logging | | `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `SMTP_FROM`, `SMTP_TLS` | leer | E-Mail-Alarme (auch im Admin-UI) | | `SMTP_FROM_NAME` | `MindSift` | Anzeigename des Absenders bei E-Mails | | `SMTP_SKIP_VERIFY` | `false` | ZertifikatsprĂŒfung fĂŒr interne Mailserver abschalten | | `NOTIFY_DIGEST_MINUTES` | `5` | BĂŒndelungsintervall fĂŒr Benachrichtigungen in Minuten | | `VAPID_PUBLIC_KEY`, `VAPID_PRIVATE_KEY`, `VAPID_SUBJECT` | automatisch | SchlĂŒssel fĂŒr Push-Benachrichtigungen; ohne Angabe einmal erzeugt und in der Datenbank gespeichert. `VAPID_SUBJECT` (Kontakt fĂŒr die Push-Dienste, `mailto:` oder `https://`) sonst aus `BASE_URL` | | `MEDIA_*` | diverse | Grenzen fĂŒr Bilder und Audio in Notizen (`MEDIA_MAX_IMAGE_MB=15`, `MEDIA_MAX_AUDIO_MB=50`, `MEDIA_QUOTA_MB=0`) | | `STT_*` | diverse | Optionale eigene Spracherkennung per Whisper (`STT_URL`, `STT_MODEL`, `STT_LANGUAGE`, `STT_ALLOW_BROWSER` 
; siehe [Doku/architecture.md](Doku/architecture.md#spracherkennung)) | | `RETENTION_ALLOW_NEVER` | leer (Admin-UI entscheidet) | `false`: Bei den Aufbewahrungsfristen gibt es „nie“ nicht (Erledigtes und Gelöschtes wird immer irgendwann aufgerĂ€umt); `true` erlaubt es fest | | `LEGAL_IMPRINT_URL`, `LEGAL_PRIVACY_URL` | leer | Impressum/Datenschutz als externer Link (nur `http(s)`) | | `LEGAL_IMPRINT_CONTENT`, `LEGAL_PRIVACY_CONTENT` (oder `
_CONTENT_FILE` mit Dateipfad) | leer | Impressum/Datenschutz als Markdown, angezeigt in einem Lesefenster. Ohne URL und Text bleibt der Link unsichtbar. | | `LEGAL_CUSTOM_LINK_LABEL`, `LEGAL_CUSTOM_LINK_URL` | leer | ZusĂ€tzlicher Link im Footer (z. B. Statusseite), nur `https` | | `MINDA_DEMO` | `false` | Legt Demo-Konten `admin/admin` (mit Beispieldaten) und `user/user` an; eine Notiz und zwei Listen sind zwischen beiden geteilt, um das gemeinsame Bearbeiten auszuprobieren. **Nie auf öffentlichen Servern!** | | `DEMO_RESET_MINUTES` | `20` | Nur im Demo-Modus: setzt die Datenbank in diesem Abstand auf die Beispieldaten zurĂŒck (`0` = nie). Angemeldete bleiben angemeldet, die App zeigt einen Countdown und lĂ€dt danach neu. | * **Reverse-Proxy:** Am besten WebSocket-Upgrade und ungepufferte SSE-Streams durchreichen. Blockiert ein Proxy beides, funktioniert MindSift trotzdem ĂŒber Long-Polling bzw. regelmĂ€ĂŸige Abfragen, nur etwas trĂ€ger. Beispiele fĂŒr Nginx, Traefik, Caddy und Cloudflare: [Doku/reverse-proxy.md](Doku/reverse-proxy.md). * **Datensicherung:** In den Admin-Einstellungen lassen sich automatische tĂ€gliche Backups einschalten (ganze Datenbank plus ein Backup je Benutzer unter `data/backups/`, Standard 3 Tage aufbewahrt). Benutzer laden ihre Server-Backups herunter oder spielen sie ganz oder fĂŒr einzelne Bereiche wieder ein. Der Ordner liegt neben der Datenbank: zusĂ€tzlich woanders sichern. Manuell geht weiterhin `sqlite3 mindsift.db ".backup 'backup.db'"`. * **Updates:** Neues Image ziehen und Container neu starten (`docker compose pull && docker compose up -d`). Das Schema wird beim Start automatisch angepasst. Die laufende Version steht im Kopf der App unter dem Namen; offene Apps bieten danach selbst das Neuladen an. * **Image-Tags:** `:dev` = Stand des Branches `dev`, `:latest` = Stand von `main` (jede neue Version landet dort). Ein Git-Tag wie `v1.2.0` erzeugt zusĂ€tzlich `:v1.2.0` und `:stable`; Vorabversionen wie `v1.0.0-rc.1` verschieben `:stable` nicht. * **Versionen & Änderungen:** [Semantic Versioning](https://semver.org/spec/v2.0.0.html), was sich geĂ€ndert hat, steht in der [CHANGELOG.md](CHANGELOG.md). --- ## 🛠 Entwicklung Voraussetzungen: Go 1.23, Node 22. ```bash # Backend: Vet und Tests go vet ./... && go test ./... # Frontend cd frontend npm ci npm run dev # Vite-Entwicklungsserver npx tsc --noEmit # TypprĂŒfung npm run test:run # Komponententests (Vitest, jsdom) npm run build # Produktions-Build cd .. e2e/run.sh # Browser-Tests (Playwright, zwei Benutzer) gegen ein frisch gebautes Image e2e/screenshots.sh # Screenshots dieser README neu erzeugen (Demo-Daten, hell/dunkel diagonal) ``` FĂŒr das Binary wird das gebaute Frontend nach `cmd/server/dist` kopiert (`go:embed`); das mehrstufige `Dockerfile` erledigt das und fĂŒhrt TypprĂŒfung, Frontend-Tests, Go-Vet und Go-Tests beim Image-Build aus. **Stack:** Go (chi, gorilla/websocket, JWT, modernc SQLite, webpush-go) · React 18, TypeScript, Vite, Tailwind. --- ## 📚 Dokumentation Die technische Doku liegt unter [Doku/](Doku/README.md): Architektur, Datenbank, REST- und Echtzeit-API, Module (inkl. gemeinsamem Bearbeiten), Freigaben und Berechtigungen, Reverse-Proxy, Themes. Bekannte Schwachstellen und offene Punkte stehen in [Doku/flaws.md](Doku/flaws.md). --- ## 🔒 Deine Daten gehören dir * Selbst gehostet, keine Telemetrie, keine Fremddienste, Schrift und Icons werden mitgeliefert. Ausgehende Verbindungen baut nur der Server auf, und nur fĂŒr das, was du nutzt: Benachrichtigungen (SMTP, Discord, eigener Webhook, die Push-Dienste der Browser), Link-Vorschauen (die verlinkte Seite wird einmal abgerufen, pro GerĂ€t abschaltbar) und optional dein eigener Whisper-Server. * Alle Inhalte liegen in einer einzigen SQLite-Datei; Bilder und Sprachnotizen liegen daneben in `data/media/`. Der ganze Workspace lĂ€sst sich als Obsidian-kompatibles Markdown-Archiv (ZIP, mit `attachments/`) exportieren, alle Daten eines Benutzers als Backup-ZIP (JSON plus Mediendateien). --- ## 📄 Lizenz MindSift ist freie Software unter der [GNU Affero General Public License v3.0](LICENSE) (AGPLv3): Du darfst den Code nutzen, Ă€ndern und weitergeben, auch kommerziell. Wer eine geĂ€nderte Fassung weitergibt oder als Dienst im Netz anbietet, muss deren Quellcode unter derselben Lizenz zugĂ€nglich machen. Es gibt keine GewĂ€hrleistung. Versionen bis einschließlich 0.48.0 bleiben unter The Unlicense (gemeinfrei).
Gebaut fĂŒr Klarheit, Geschwindigkeit und digitale SouverĂ€nitĂ€t.