# 🧠 MindSift ### *Der Kopf frei in drei Sekunden.* [![Build & Docker](https://img.shields.io/badge/Gitea%20CI-Passing-22c55e?logo=gitea&logoColor=white)](https://gitea.io) [![Docker Image](https://img.shields.io/badge/Docker-Multi--Arch-2496ed?logo=docker&logoColor=white)](https://hub.docker.com) [![Backend](https://img.shields.io/badge/Backend-Go%201.24-00ADD8?logo=go&logoColor=white)](https://go.dev) [![Frontend](https://img.shields.io/badge/Frontend-React%2019%20%2F%20Vite-61DAFB?logo=react&logoColor=black)](https://react.dev) [![Database](https://img.shields.io/badge/Database-SQLite%20(WAL)%20%2F%20Postgres-003B57?logo=sqlite&logoColor=white)](https://sqlite.org) [![Styling](https://img.shields.io/badge/Theme-Deep%20Dark-1d8cf8)](#-designsystem--Γ€sthetik) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) **MindSift** verbindet den schnellsten Brain-Dump der Welt mit der Eleganz eines modernen Workspaces, spielerischer Tinder-Style-Triage und kollaborativen Echtzeit-Listen fΓΌr Familien und Teams β€” 100 % Self-Hosted & Open Source. [Manifest](#-das-manifest) β€’ [Features](#-features--workflow) β€’ [Architektur](#-technische-architektur--tech-stack) β€’ [Datenbankschema](#-datenbankschema) β€’ [API & Webhooks](#-api-spezifikation--webhooks) β€’ [CI/CD](#-gitea-cicd-pipeline) β€’ [Deployment](#-deployment--schnellstart) β€’ [Roadmap](#-schrittweiser-phasenplan) ---
## πŸ“œ Das Manifest Große Workspace-Tools wie Notion sind genial, wenn man am Schreibtisch sitzt und ein monatelanges Projekt plant. Aber sie scheitern im Alltag genau an einer Stelle: **im echten Moment**. Wenn dir an der Supermarktkasse eine Idee kommt, du im Auto ΓΌber einen Geistesblitz nachdenkst oder schnell eine Zutat aufschreiben willst, hast du keine Zeit, durch fΓΌnf verschachtelte Ordner und relationale Datenbanken zu navigieren. Du brauchst ein Tool, das in einer halben Sekunde bereitsteht, deinen Gedanken friert und dir spΓ€ter hilft, ihn spielerisch auszusortieren. **MindSift lΓΆst dieses Problem durch ein dreistufiges Prinzip:** 1. **Erfassen:** Sofortiger Brain-Dump ohne jede Reibung. 2. **Sichten (Sift):** Spielerische Triage im Tinder-Style (Inbox Zero fΓΌr dein Gehirn). 3. **Strukturieren & Teilen:** Workspace fΓΌr reifende Gedanken und geteilte Echtzeit-Listen fΓΌr den Alltag. --- ## ✨ Features & Workflow ``` [ πŸš€ Instant Capture ] Handy raus β€’ PWA β€’ Webhook β€’ Sprache β”‚ β–Ό [ πŸ“₯ Thought Inbox ] β”‚ β–Ό [ πŸƒ Tinder-Style Triage ] β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό [ πŸ‘ˆ Nach Links ] [ πŸ‘‰ Nach Rechts ] Verwerfen / Done Behalten / Vertiefen β”Œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό β–Ό Task Doc Shared List ``` * **⚑ Capture First (Instant Puffer):** Handy raus, App antippen, Cursor steht im Feld. Text tippen oder diktieren (Web Speech API), absenden, fertig. Kein Ordner wΓ€hlen, kein Tagging, kein Nachdenken. PWA-Shortcut fΓΌr direkten Homescreen-Capture (< 300 ms Latenz). * **πŸƒ Triage im Tinder-Style:** Abends oder am Wochenende gehst du deine unstrukturierten Gedanken durch wie ein Kartendeck: * **Wisch nach links:** Weg damit (Gedanke erledigt oder irrelevant). * **Wisch nach rechts:** Behalten, verfeinern, in eine To-Do mit FΓ€lligkeitsdatum verwandeln oder in ein Projekt einsortieren. * **πŸ“ Notion-Flair, aber ohne Ballast:** WΓ€chst ein Gedanke zum Projekt heran, wechselst du in den Workspace. Reiner, ablenkungsfreier Block-Editor mit Überschriften, Listen, CodeblΓΆcken und Task-Elementen – ohne relationale Datenbank-ÜberkomplexitΓ€t. * **πŸ›’ Geteilte Listen & Family Spaces (Echtzeit):** Einkaufslisten oder Urlaubsplaner per Link teilen. Hakst du an der Kasse die Hafermilch ab, verschwindet sie bei deinem Partner in Millisekunden dank WebSocket-Synchronisation. * **πŸ€– Webhooks & Ingestion API:** Smarthome-Alarme (z. B. Home Assistant, Zigbee2MQTT), Cronjobs oder Webhooks speisen dringende Aufgaben oder Messpunkte direkt in deine Inbox ein. * **πŸ›‘οΈ 100 % Self-Hosted & DatensouverΓ€nitΓ€t:** Keine fremde Cloud liest mit. Ein schlanker Docker-Container, SQLite mit Write-Ahead-Log (WAL) oder PostgreSQL. --- ## 🎨 Designsystem & Γ„sthetik MindSift setzt konsequent auf eine ultramoderne, dunkle Productivity-Suite-Γ„sthetik β€” fokussiert, augenschonend und schnell: * **Dark Mode First (Deep Charcoal Canvas):** * Hintergrund primΓ€r: `#16171a` * OberflΓ€chen/Karten: `#222428` mit feinen `1px` Konturen (`rgba(255, 255, 255, 0.08)`) * Elevated & Hover: `#282a2f` / `#2b2d33` * PrimΓ€r-Brand: Electric Blue (`#1d8cf8`) * Status-Akzente: Vivid Green (`#22c55e`), Coral Red (`#ef4444`), Vivid Orange (`#f97316`) * **Squircles & Solid Color Badges:** Quadratisch abgerundete Icons (`rounded-xl`) mit satten Einzelfarben ohne grelle AI-FarbverlΓ€ufe. * **Pill-Buttons & Active Highlighting:** Filter-Chips (`All`, `Favorite`) und Action-Buttons in Pillenform (`rounded-full`); aktive Aufgaben erhalten eine scharfe grΓΌne Kontur (`border border-[#22c55e]/70`). * **Floating Bottom Dock:** Zentrale Daumenleiste mit markantem blauem `+` Action-Button zum blitzschnellen Gedanken-Erfassen von ΓΌberall. * **Haptik & Touch-Optimierung:** Große Interaktionsradien (mind. 48px Touch-Targets), Vibrations-Feedback via Web Vibration API bei Karten-Swipes. --- ## πŸ—οΈ Technische Architektur & Tech-Stack Als Lead-Architektur wurde ein **Single-Binary / Single-Container** Paradigma gewΓ€hlt. Das Go-Backend kompiliert das React-Frontend direkt in ein einziges Executable ein (`embed.FS`). ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Client (Mobile PWA / Desktop) β”‚ β”‚ React 19 β€’ Vite β€’ Tailwind CSS v4 β€’ Framer Motion β€’ Tiptap Block-Editor β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ HTTP/2 / REST & WebSockets (WSS) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MindSift Single Container (Go 1.24) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Embedded Assets β”‚ β”‚ Chi HTTP Mux β”‚ β”‚ WebSocket Hub β”‚ β”‚ β”‚ β”‚ (React SPA Dist) β”‚ β”‚ REST / Webhook β”‚ β”‚ (Realtime Sync) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Business Service Layer β”‚ β”‚ β”‚ β”‚ (Capture, Triage, Docs, Lists) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Data Access Layer (sqlc / WAL) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ SQLite 3 (WAL Mode, zero-config) β”‚ β”‚ *Optional: PostgreSQL Driver β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Stack-Entscheidungen & Rationale | Schicht | Technologie | BegrΓΌndung & Architekturentscheidung | | :--- | :--- | :--- | | **Backend** | **Go 1.24+ (Chi Router)** | Extrem geringer Speicherverbrauch (~15–25 MB RAM idle), Kaltstart in < 5 ms, ΓΌberlegene Concurrency fΓΌr WebSockets, erzeugt ein statisches Binary. | | **Frontend** | **React 19 + TypeScript + Vite** | Bietet mit **Framer Motion** die beste Gesten- und Physik-Engine fΓΌr flΓΌssige Tinder-Swipes und mit **Tiptap** den industrieweit fΓΌhrenden blockbasierten Rich-Text-Editor. | | **Styling** | **Tailwind CSS v4** | HΓΆchste Performance, null CSS-Runtime-Overhead, perfekte Abbildung des Deep Dark Themes mit Design-Tokens. | | **Realtime** | **Go WebSockets (`nhooyr/websocket`)** | Schlanke, native WebSocket-Rooms fΓΌr kollaborative Einkaufslisten mit Sub-10ms-Latenz und automatischem Reconnect. | | **Datenbank** | **SQLite (WAL-Modus) / sqlc** | StandardmÀßig Zero-Config mit Write-Ahead-Logging, ACID-sicher und als einzelne Datei einfachst per Backup sicherbar. Optional umschaltbar auf PostgreSQL per `DATABASE_URL`. | | **PWA / Offline** | **Workbox / IndexedDB** | App startet auch im Funkloch sofort; Gedanken werden lokal vorgehalten und beim nΓ€chsten Verbindungsaufbau transparent synchronisiert. | | **Container** | **Distroless / Alpine Scratch** | Minimalistisches Multi-Stage Dockerfile. End-Image-Grâße < 35 MB. Keine Sicherheitsrisiken durch ΓΌberflΓΌssige System-Pakete. | --- ## πŸ—„οΈ Datenbankschema Das Schema ist relational strukturiert, normalisiert und auf Lese- sowie Schreibgeschwindigkeit im Sub-Millisekundenbereich optimiert. ```mermaid erDiagram USERS ||--o{ THOUGHTS : owns USERS ||--o{ DOCUMENTS : authors USERS ||--o{ SPACE_MEMBERS : participates USERS ||--o{ API_KEYS : possesses SPACES ||--o{ SPACE_MEMBERS : contains SPACES ||--o{ LISTS : hosts LISTS ||--o{ LIST_ITEMS : contains DOCUMENTS ||--o{ DOCUMENT_BLOCKS : contains USERS { uuid id PK string email UK string password_hash string display_name timestamp created_at } THOUGHTS { uuid id PK uuid user_id FK text content string voice_transcript string status "inbox | kept | discarded | converted" string converted_type "task | document | list_item" uuid converted_ref_id timestamp due_date timestamp created_at timestamp triaged_at } DOCUMENTS { uuid id PK uuid user_id FK uuid space_id FK string title string icon boolean is_archived timestamp created_at timestamp updated_at } DOCUMENT_BLOCKS { uuid id PK uuid document_id FK string block_type "paragraph | heading | task | code" jsonb content int sort_order timestamp updated_at } SPACES { uuid id PK string name string icon boolean is_personal timestamp created_at } SPACE_MEMBERS { uuid space_id PK,FK uuid user_id PK,FK string role "owner | editor | viewer" timestamp joined_at } LISTS { uuid id PK uuid space_id FK string title string list_type "shopping | checklist" timestamp updated_at } LIST_ITEMS { uuid id PK uuid list_id FK string content boolean is_completed uuid completed_by FK timestamp completed_at int sort_order } API_KEYS { uuid id PK uuid user_id FK string name string key_hash UK string scopes timestamp last_used_at } ``` ### SQL DDL Definitionen (Auszug SQLite / Postgres kompatibel) ```sql -- Aktivierung von WAL & Foreign Keys fΓΌr SQLite PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000; -- Gedanken & Instant Inbox Puffer CREATE TABLE IF NOT EXISTS thoughts ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, content TEXT NOT NULL, status TEXT CHECK(status IN ('inbox', 'kept', 'discarded', 'converted')) DEFAULT 'inbox', converted_type TEXT CHECK(converted_type IN ('task', 'document', 'list_item', NULL)), converted_ref_id TEXT, due_date DATETIME, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, triaged_at DATETIME, FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE INDEX idx_thoughts_user_status ON thoughts(user_id, status, created_at DESC); -- Kollaborative Listen (z.B. Familie & Einkaufen) CREATE TABLE IF NOT EXISTS list_items ( id TEXT PRIMARY KEY, list_id TEXT NOT NULL, content TEXT NOT NULL, is_completed BOOLEAN NOT NULL DEFAULT 0, completed_by TEXT, sort_order INTEGER NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME, FOREIGN KEY(list_id) REFERENCES lists(id) ON DELETE CASCADE ); CREATE INDEX idx_list_items_sync ON list_items(list_id, is_completed, sort_order ASC); ``` --- ## πŸ”Œ API-Spezifikation & Webhooks Alle Endpunkte antworten mit `application/json` und nutzen Standard-HTTP-Statuscodes. Die Authentifizierung erfolgt ΓΌber `Bearer ` oder dedizierte Ingestion-Keys. ### 1. Instant Capture & Ingestion (Sub-Second Entry) ```http POST /api/v1/inbox Authorization: Bearer Content-Type: application/json { "content": "ZΓΌndkerzen fΓΌr den RasenmΓ€her bestellen #garage", "due_date": "2026-10-25T18:00:00Z" // Optional } ``` **Response (201 Created - < 30ms):** ```json { "id": "th_9f8a3c21", "status": "inbox", "created_at": "2026-10-24T16:25:00Z" } ``` ### 2. Smarthome & Externe Webhook Ingestion FΓΌr Home Assistant, Node-RED, n8n oder Shell-Skripte: ```http POST /api/v1/webhooks/ingest?token=mindsift_sec_789xyz Content-Type: application/json { "title": "Kellerfeuchtigkeit ΓΌber 70%", "priority": "urgent", "tags": ["smarthome", "keller"] } ``` ### 3. Triage & Tinder-Style Swipe Deck * **Gedanken-Deck laden:** `GET /api/v1/triage/deck?limit=20` * **Gedanke wischen (Swipe Action):** ```http PATCH /api/v1/triage/th_9f8a3c21 Authorization: Bearer Content-Type: application/json { "action": "keep", // oder "discard" "convert_to": "task", // optional: "task" | "document" | "list_item" "target_list_id": "lst_shopping_123", // wenn convert_to = "list_item" "due_date": "2026-10-28T09:00:00Z" } ``` ### 4. Realtime WebSocket Protocol (Kollaborative Listen) Client verbindet sich zu `wss://mindsift.local/api/v1/ws/spaces/:space_id`. * **Event: Item hinzugefΓΌgt/aktualisiert** ```json { "event": "ITEM_UPDATED", "payload": { "list_id": "lst_shopping_123", "item_id": "itm_456", "content": "Hafermilch (Barista)", "is_completed": true, "user_name": "Sandro" } } ``` --- ## πŸš€ Gitea CI/CD Pipeline Das Projekt ist fΓΌr den Betrieb mit **Gitea Actions** optimiert. Bei jedem Push auf `main` oder einem Release-Tag baut die Pipeline automatisch ein Multi-Arch-Docker-Image (`linux/amd64`, `linux/arm64`) und schiebt es in die Gitea Container Registry. ### Workflow-Datei: `.gitea/workflows/build-and-publish.yaml` ```yaml name: MindSift Multi-Arch Docker Build on: push: branches: - main tags: - 'v*' pull_request: branches: - main jobs: test: name: Lint & Unit Tests runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.24' cache: true - name: Run Backend Tests run: | go vet ./... go test -v -race ./... - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Run Frontend Tests run: | cd frontend npm ci npm run lint npm run test:run build-docker: name: Build & Push Docker Image needs: test runs-on: ubuntu-latest if: github.event_name == 'push' steps: - name: Checkout Code uses: actions/checkout@v4 - name: Set up QEMU (Multi-Arch) uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Gitea Container Registry uses: docker/login-action@v3 with: registry: ${{ gitea.server_url }} username: ${{ gitea.actor }} password: ${{ secrets.GITEA_TOKEN }} - name: Extract Metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ gitea.server_url }}/${{ gitea.repository }} tags: | type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=semver,pattern={{version}} - name: Build and Push uses: docker/build-push-action@v6 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max ``` ### Multi-Stage Dockerfile (`Dockerfile`) ```dockerfile # Stage 1: Frontend Build FROM node:22-alpine AS frontend-builder WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # Stage 2: Go Backend Build FROM golang:1.24-alpine AS backend-builder WORKDIR /app RUN apk add --no-cache build-base git COPY go.mod go.sum ./ RUN go mod download COPY . . # Kopiere gebaute Frontend Assets in das embed.FS-Verzeichnis COPY --from=frontend-builder /app/frontend/dist ./server/dist RUN CGO_ENABLED=1 GOOS=linux go build -ldflags="-s -w -extldflags '-static'" -o mindsift ./cmd/server # Stage 3: Minimal Production Image FROM alpine:3.21 RUN apk add --no-cache ca-certificates tzdata WORKDIR /app COPY --from=backend-builder /app/mindsift /app/mindsift ENV PORT=8080 ENV DATA_DIR=/data VOLUME ["/data"] EXPOSE 8080 USER 1000:1000 ENTRYPOINT ["/app/mindsift"] ``` --- ## 🐳 Deployment & Schnellstart ### 1. Schnellstart mit Docker Compose (Empfohlen) Erstelle eine `docker-compose.yml`: ```yaml services: mindsift: image: gitea.your-domain.com/user/mindsift:latest container_name: mindsift restart: unless-stopped ports: - "8080:8080" volumes: - ./data:/data environment: - PORT=8080 - DATA_DIR=/data - JWT_SECRET=change_this_to_a_secure_random_key_min_32_chars - BASE_URL=https://mindsift.local - LOG_LEVEL=info ``` Starte den Service: ```bash docker compose up -d ``` Die WeboberflΓ€che steht sofort unter `http://localhost:8080` bereit. ### 2. Standalone Docker Run ```bash docker run -d \ --name mindsift \ --restart unless-stopped \ -p 8080:8080 \ -v $(pwd)/mindsift-data:/data \ -e JWT_SECRET="dein-super-sicheres-geheimnis" \ gitea.your-domain.com/user/mindsift:latest ``` ### Umgebungsvariablen | Variable | Standardwert | Beschreibung | | :--- | :--- | :--- | | `PORT` | `8080` | Interner HTTP/WebSocket Port | | `DATA_DIR` | `/data` | Verzeichnis fΓΌr SQLite DB, Uploads und Cache | | `DATABASE_URL` | `sqlite:///data/mindsift.db` | Optional: PostgreSQL DSN (`postgres://user:pass@host:5432/db`) | | `JWT_SECRET` | *Pflichtfeld* | Secret fΓΌr Authentifizierungs-Tokens (mind. 32 Zeichen) | | `BASE_URL` | `http://localhost:8080` | Externe URL fΓΌr Einladungslinks und Webhooks | | `ALLOW_REGISTRATION`| `true` | Erstregistrierung erlauben (`false` nach Admin-Erstellung) | --- ## πŸ—ΊοΈ Schrittweiser Phasenplan ``` Phase 1: Foundation ────► Phase 2: Triage Deck ────► Phase 3: Workspace (Go + PWA + DB) (Framer Physics) (Tiptap Blocks) β”‚ Phase 6: Hardening ◄──── Phase 5: Webhooks ◄──── Phase 4: Realtime (CI/CD + Release) (Smarthome Ingest) (Family Lists) ``` ### Phase 1: Core Foundation & Instant Capture (Sprint 1) - [x] Repository-Initialisierung & Architektur-Design - [x] Go Backend-GrundgerΓΌst (Chi Router, Konfigurations-Management, Healthcheck) - [x] SQLite Storage-Layer mit WAL-Modus und automatischer Migration - [x] JWT-Authentifizierung & User-Management - [x] Mobile-First PWA Setup (Vite, React, Tailwind CSS, Deep Dark Theme) - [x] **Instant-Capture-Interface:** Autofokus-Eingabemaske, Sprachaufnahme (Web Speech API), Latenz < 300 ms ### Phase 2: Tinder-Style Triage & Task Engine (Sprint 2) - [x] Interaktives Swipe-Deck mit **Framer Motion** (Gesten, Rotation, elastische RΓΌckfederung) - [x] Triage-Status-Engine (`inbox` -> `kept` / `discarded` / `converted`) - [x] Quick-Convert: Wisch nach rechts transformiert Gedanken direkt in Aufgaben mit Due-Date, Projekt-Notizen oder Listen-EintrΓ€ge - [x] Tastatur-Shortcuts fΓΌr Power-User am Desktop (`H`/`L` oder Pfeiltasten, `C`/`/` fΓΌr Capture) - [x] Haptisches Feedback auf MobilgerΓ€ten (Web Vibration API) ### Phase 3: Notion-Style Workspace (Sprint 3) - [x] Block-Editor (Headings, Task-Checkboxes, Code-BlΓΆcke, Callouts, Listen) - [x] Dokumenten-Verwaltung fΓΌr vertiefte Gedanken inkl. Pinning & Icon-Picker - [x] Tagging & Volltextsuche ΓΌber Gedanken und Dokumente - [x] Markdown Export (`.md`) ### Phase 4: Realtime Spaces & Family Sync (Sprint 4) - [x] Multi-User Space-Architektur (Familien- und Team-RΓ€ume mit Invite-Codes) - [x] Go WebSocket Hub mit Raum-Multiplexing - [x] Echtzeit-Einkaufslisten: Sofortige Synchronisation von Checked-States ΓΌber alle EndgerΓ€te - [x] Optimistische UI-Updates fΓΌr verzΓΆgerungsfreies Offline-/Online-Erlebnis ### Phase 5: Smarthome Webhooks & External Ecosystem (Sprint 5) - [x] Ingestion-API mit API-Token-Management (`mindsift_sec_...`) - [x] Webhook-Endpunkte fΓΌr Home Assistant, Zigbee2MQTT, n8n und Cronjobs - [x] Interaktiver Live-Webhook-Simulator in der UI - [x] Backup- und Export-Endpunkt (kompletter JSON-Export) ### Phase 6: Production Hardening, CI/CD & v1.0 (Sprint 6) - [x] Gitea Actions Multi-Arch Workflow (`amd64`, `arm64`) - [x] Single-Container Packaging (`embed.FS`) & Multi-Stage Dockerfile - [x] Automatisierte Backend-Unit-Tests (`internal/storage/sqlite_test.go`) - [ ] End-to-End Tests (Playwright) auf Ziel-Cluster - [x] Erstellung der offiziellen Dokumentation & v1.0 Release-Bereitschaft --- ## πŸ”’ Sicherheit & Datenschutz * **Zero Tracking:** Keine Analytics, keine externen CDNs, keine Telemetrie. * **Content Security Policy (CSP):** Strikte Header; alle Assets und Fonts werden lokal ausgeliefert. * **Sichere PasswΓΆrter:** Argon2id Passwort-Hashing nach OWASP-Empfehlung. * **Isolierte Container:** Der Container lΓ€uft standardmÀßig unter einer Non-Root-UID (`1000:1000`). --- ## πŸ“„ Lizenz Dieses Projekt ist lizenziert unter der **MIT-Lizenz** – siehe [LICENSE](LICENSE) fΓΌr Details. ---
Designed with ❀️ for clarity, speed and digital sovereignty.