Spec v0.3: Cloud-Sync via gitea, Mobile (Android), PWA-Editor, Minimax-KI via API, Konfig.md

- Cloud-Sync erlaubt ueber gitea (kein externes Cloud-Drive)
- Mobile nur Android + Windows-Browser, kein iOS
- Externe KI ueber Minimax HTTP-API (API-Key in Environment-Variable, Name in Konfig.md)
- Editor = eigene PWA, Obsidian-Like, kostenlos, self-hosted
- Tiptap als Markdown-Editor, Cytoscape.js fuer Force-directed Graph
- 4 Phasen: MVP, Wiki+Ingest, Visuell, PWA-Editor
- Konfig.md als zentrale Settings-Datei (Schwelle, Token-Budget, KI, Sync)
- Deutsche Frontmatter-Keys (aktualisiert, quellen)
- Token-Budget aus Konfig, kein Hardcap
- 3 boolsche Konflikt-Felder (alle explizit gesetzt)
- 5 Wiki-Status deutsch (neu/aktuell/konflikt/entwurf/archiv)
- 3 Mockup-Stile sequenziell (Graph, Karte, Radial)
- Cluster dynamisch, Auto-Modus mit manueller Korrektur
- 17 Sektionen, 31 Klaerungen, 15 offene Punkte
This commit is contained in:
Jannik committed 2026-09-05 10:14:33 +02:00
1 parent a6ab6d03ee
commit 15bb77d7a8
1 file changed
+221 -86
+221 -86
View File
@@ -1,43 +1,57 @@
# Mind-o-Mat — Spezifikation v0.2
# Mind-o-Mat — Spezifikation v0.3
> Stand: 2026-09-05 — Konzept-Phase abgeschlossen, vor Implementierung.
> Vorherige Version: v0.1 vom 2026-08-28. Alle 5 ⚠️-Fragen gelöst.
> Diese Spec ist verbindlich für die Implementierung. Änderungen werden in der Klärungen-Sektion (§ 15) dokumentiert.
> Stand: 2026-09-05 — Konzept-Phase erweitert (Cloud, Mobile, PWA, Minimax).
> Vorherige Version: v0.2 vom 2026-09-05. Mobile- und KI-Integration ergänzt.
> Diese Spec ist verbindlich für die Implementierung. Änderungen werden in der Klärungen-Sektion (§ 16) dokumentiert.
## 1. Zweck
Lokales Second-Brain-System für einen Obsidian-kompatiblen Markdown-Vault. Es nimmt drei Dinge ab:
Lokales Second-Brain-System für einen Obsidian-kompatiblen Markdown-Vault mit Cloud-Sync und Mobile-Zugriff. Es nimmt drei Dinge ab:
- **Wissen wiederfinden**, auch wenn das exakte Wort nicht mehr einfällt (Bedeutungssuche).
- **Dem Wissen vertrauen können**, weil Widersprüche, Duplikate und veraltete Stände sichtbar markiert werden.
- **Überblick behalten** über ein wachsendes Wissensgebilde über eine Graph-Ansicht mit Clustern und Verbindungen.
- **Von überall arbeiten** — Desktop, Mobile, geteiltes Wissen.
## 2. Fähigkeiten (was das System können muss)
| # | Fähigkeit | Was es konkret tut |
|---|---|---|
| 1 | **Finden** | Hybridsuche aus Stichwort + Bedeutung. Tolerant gegen ungenaue Erinnerung. |
| 1 | **Finden** | Hybridsuche aus Stichwort + Bedeutung. Tolerant gegen ungenaue Erinnerung. Funktioniert auf Desktop und Mobile. |
| 2 | **Lesen** | Gefundene Notiz direkt im Vault öffnen, ohne App-Wechsel. |
| 3 | **Sauber bleiben** | Automatische Markierung von Widersprüchen, Duplikaten und veralteten Ständen. |
| 4 | **Überblick** | Graph-Ansicht der Wissenslandschaft mit erkennbaren Clustern und Verbindungen. |
| 3 | **Schreiben** | Notizen anlegen, bearbeiten, strukturieren — in einer eigenen PWA, Obsidian-kompatibel. |
| 4 | **Sauber bleiben** | Automatische Markierung von Widersprüchen, Duplikaten und veralteten Ständen. |
| 5 | **Überblick** | Graph-Ansicht der Wissenslandschaft mit erkennbaren Clustern und Verbindungen. |
| 6 | **Synchron** | Vault über gitea zwischen Geräten synchron, ohne externen Cloud-Dienst. |
## 3. Was es NICHT tut
## 3. Was es NICHT tut / was es tut
- Kein Cloud-Sync. Vault bleibt strikt lokal.
- Kein Mobile-Client, keine Web-Notizerfassung. Nur Desktop-Vault + lokale CLI/Webapp.
- Keine externen KI-APIs für die **Suche** (QMD läuft komplett lokal mit GGUF-Modellen, ~2 GB).
- Für die **Wiki-Pflege** darf Ingest ausgewählte Ausschnitte an Claude (extern) übertragen. Das ist die einzige Ausnahme und folgt dem Original-Konzept des Video-Architekten. Alternative (lokal) ist offen — siehe Klärungen.
- Kein automatisches Generieren von Notizen. Du schreibst selbst, das System organisiert.
### Was es tut
- **Cloud-Sync** über gitea (`git.orfel.de/Jannik/Mind-o-Mat`). Vault liegt auf dem Desktop, in gitea als Remote, auf Mobile über die PWA.
- **Mobile-Client** auf **Android** (PWA, installierbar). Windows-Browser funktioniert genauso. **Kein iOS.**
- **Externe KI** über den **Minimax TokenPlan** für Wiki-Pflege und Ingest-Operationen.
- **Eigene PWA** statt Obsidian direkt — Obsidian-ähnlich (Markdown + Frontmatter + Wikilinks + Graph), aber selbstgebaut, kostenlos, self-hosted.
### Was es NICHT tut
- **Kein iOS-Client** (kein PWA-Wrapper für iOS, kein Swift).
- **Kein Sync über externe Cloud-Dienste** (kein Dropbox, iCloud, OneDrive, Google Drive).
- **Keine Suche über externe KI-APIs.** QMD läuft komplett lokal mit GGUF-Modellen (~2 GB).
- **Kein automatisches Generieren von Notizen.** Du schreibst selbst, das System organisiert.
- **Kein Obsidian als Editor.** Stattdessen die eigene PWA (sonst Lizenz- und UX-Inkonsistenz).
## 4. Architektur (5 Bausteine)
| # | Baustein | Zweck | KI drin? |
|---|---|---|---|
| 1 | **Vault** | Markdown-Dateien als Single Source of Truth. | nein |
| 1 | **Vault** | Markdown-Dateien als Single Source of Truth. Git-Repository mit gitea als Remote. | nein |
| 2 | **Indexer** | Deterministisch: `readdir` → Frontmatter parsen → Wikilinks extrahieren → `landkarte.json` + beide `Index.md`. | nein |
| 3 | **QMD** | Lokale Hybridsuche (BM25 + Vektor + LLM-Re-Ranking) über `@tobilu/qmd`-npm-Paket. CLI + optional MCP-Server. | nein (lokale GGUF-Modelle) |
| 4 | **Wiki** (Karpathy-Pattern) | Ingest pflegt Markdown-Seiten nach festen Regeln aus `10_Wiki/_Schema.md`. | ja (Claude) |
| 5 | **Webapp** | Liest `landkarte.json` + QMD-Such-API, rendert Graph-Ansicht. | nein |
| 3 | **QMD** | Lokale Hybridsuche (BM25 + Vektor + LLM-Re-Ranking) über `@tobilu/qmd`. CLI + optional MCP-Server. | nein (lokale GGUF-Modelle) |
| 4 | **Wiki** (Karpathy-Pattern) | Ingest pflegt Markdown-Seiten nach festen Regeln aus `10_Wiki/_Schema.md`. Ruft **Minimax** für Verstehens-Aufgaben auf. | ja (Minimax) |
| 5 | **Webapp / PWA** | Liest `landkarte.json` + QMD-Such-API, rendert Graph **und ist gleichzeitig der Editor**. Installierbar als PWA auf Android. | nein |
**Sync-Mechanik:** Vault ist ein Git-Repo, `origin` zeigt auf gitea. PWA auf Mobile und Webapp auf Desktop pushen/pullen via `99_System/Skripte/sync.mjs`. Trigger manuell oder per Cron.
## 5. Datenstruktur
@@ -47,38 +61,56 @@ C:\GitHub\Mind-o-Mat\
│ ├── Verarbeitet\ # nach Ingest, chronologisch
│ │ └── YYYY-MM-DD\
│ └── Problemfaelle\ # Ingest-Probleme, mit Log
├── 01_Daily\ # Tagesnotizen (YYYY-MM-DD.md oder YYYY-MM-DD_Fokus.md)
├── 01_Daily\ # Tagesnotizen
├── 10_Wiki\ # von Ingest gepflegt
│ ├── Index.md # Wiki-Inhaltsverzeichnis
│ ├── _Schema.md # Wiki-Regeln
│ ├── Index.md
│ ├── _Schema.md
│ ├── SPEC.md # diese Datei
│ └── Seiten\ # Wiki-Themenseiten
│ └── Seiten\
├── 20_Projekte\ # aktive Initiativen
├── 90_Templates\ # Notiz-Vorlagen
├── 99_System\
│ ├── Skripte\ # indexer.mjs, ingest.mjs
│ ├── Logs\ # Ingest-Protokolle
│ ├── Skripte\ # indexer.mjs, ingest.mjs, sync.mjs
│ ├── Logs\ # Ingest- und Sync-Protokolle
│ ├── Cache\ # QMD-Embeddings, Zwischen-Caches
│ └── Index.md # Katalog, von Suchleiter zuerst gelesen
│ ├── Index.md # Katalog, von Suchleiter zuerst gelesen
│ └── Konfig.md # zentrale Konfiguration (Settings)
├── CLAUDE.md # Brain-First-Suchleiter
├── package.json
├── .gitignore
└── README.md
```
**Naming:** Numerische Präfixe + Pascal_Snake_Case (mehrteilig) bzw. PascalCase (einteilig). Details in § 8.
**Konfig.md** ist die zentrale Konfigurationsdatei im Vault. Beispiel:
```yaml
---
veraltet_schwellwert_monate: 12
token_budget_default: 4000
token_budget_hardcap: false
qmd_cache_pfad: 99_System/Cache
sync_remote: https://git.orfel.de/Jannik/Mind-o-Mat.git
ki_provider: minimax
ki_modell: MiniMax-M3
ki_api_url: https://api.minimaxi.chat/v1
ki_api_key_env: MINIMAX_API_KEY # Name der Env-Variable, NICHT der Key selbst
---
```
Diese Datei wird vom Indexer und Ingest gelesen, nicht von der PWA direkt (PWA hat eigene Settings-UI).
## 6. Schlüssel-Flows
### Flow A: Note rein → Wissen drin
1. Notiz in `00_Inbox\` ablegen (manuell oder Drag&Drop aus Obsidian).
1. Notiz in `00_Inbox\` ablegen (manuell oder Drag&Drop aus PWA/Editor).
2. `npm run ingest --apply` ruft Ingest-Skript auf.
3. Skript ermittelt betroffene Wiki-Seiten (Tags + Embedding-Ähnlichkeit).
4. Ingest liest Schema, Katalog, Wiki-Index, betroffene Seiten, neue Notiz.
5. Ingest erstellt Diff-Plan und schreibt nur die geänderten Stellen.
6. Verarbeitete Notiz wird nach `00_Inbox/Verarbeitet/YYYY-MM-DD/` verschoben.
7. `npm run index` aktualisiert `landkarte.json` und beide `Index.md`.
4. Ingest liest `10_Wiki/_Schema.md`, `99_System/Index.md`, `10_Wiki/Index.md`, betroffene Seiten, neue Notiz.
5. Ingest ruft **Minimax** auf für die Verstehens-Aufgabe (Wikiseite aktualisieren, Konflikte erkennen).
6. Ingest erstellt Diff-Plan und schreibt nur die geänderten Stellen.
7. Verarbeitete Notiz wird nach `00_Inbox/Verarbeitet/YYYY-MM-DD/` verschoben.
8. `npm run index` aktualisiert `landkarte.json` und beide `Index.md`.
### Flow B: Suche (Brain-First)
@@ -88,20 +120,38 @@ C:\GitHub\Mind-o-Mat\
4. Wenn Wiki reicht → antworten mit Wiki-Quellen.
5. Wenn Wiki nicht reicht → QMD-Suche (`qmd query "X"`).
6. Aus QMD-Ergebnissen die Top-3 nach Relevanz öffnen.
7. Antwort als nummerierte Bullet-Liste, max. ~3.000 Tokens.
7. Antwort als nummerierte Bullet-Liste, ~`token_budget_default` Tokens (weiche Grenze, **kein Hardcap**).
### Flow C: Überblick
1. `npm run dev` startet lokale Webapp (Vite + React + Cytoscape.js).
2. Webapp lädt `landkarte.json`, zeigt Force-directed Graph.
1. PWA öffnet (Desktop-Browser oder Android-Homescreen).
2. Lädt `landkarte.json`, zeigt Force-directed Graph.
3. Knoten = Notizen, Kanten = Wikilinks, Farbe = Cluster.
4. Hover über Knoten → Vorschau, Klick → volle Notiz.
4. Hover → Vorschau, Klick → volle Notiz im Editor.
### Flow D: Schreiben (Phase 4, PWA-Editor)
1. User öffnet PWA, klickt „Neue Notiz" oder bestehende Notiz.
2. Editor rendert Markdown + Frontmatter + Wikilinks live.
3. Speichern → PWA schreibt in Vault, triggert Indexer-Lauf.
4. Wenn online: `sync.mjs` läuft asynchron, pusht nach gitea.
5. Andere Geräte sehen die Änderung nach nächstem Pull.
### Flow E: Sync
1. `npm run sync` oder Cron-Trigger.
2. `git pull --rebase` (um Konflikte zu vermeiden).
3. `git add . && git commit -m "vault: $(datum)"` (nur wenn Änderungen).
4. `git push origin main`.
5. Log-Eintrag in `99_System/Logs/Sync_<Datum>.md`.
## 7. Erfolgskriterium
**Phase 1 fertig** = du öffnest die Webapp, der Graph zeigt deine Wissenslandschaft. Ab dann arbeitest du drin statt dran.
Phase 2 und 3 bauen darauf auf (Details in § 14).
**Phase 4 fertig** = du kannst von Android und Desktop gleichberechtigt schreiben und lesen. Der Sync via gitea läuft automatisch.
Phase 2, 3 und 4 bauen darauf auf (Details in § 15).
## 8. Notiz-Konventionen
@@ -135,7 +185,7 @@ Mehrteilige Subfolder: Pascal_Snake_Case. Einteilige Subfolder: PascalCase (`Sei
---
title: <Anzeigename>
created: YYYY-MM-DD
updated: YYYY-MM-DD # automatisch durch Ingest/Indexer
aktualisiert: YYYY-MM-DD # automatisch durch Ingest/Indexer
tags: [<Pascal_Snake_Case>] # optional
---
```
@@ -146,9 +196,11 @@ tags: [<Pascal_Snake_Case>] # optional
|---|---|---|
| **Inbox** | `title`, `created` | `tags` |
| **Daily** | `title`, `date` (gleich Dateiname), `created` | `tags` |
| **Wiki** | `title`, `created`, `updated`, `type: wiki`, `status: <wert>`, `cluster: <Name>`, `konflikt_hart: bool`, `konflikt_wert: bool`, `konflikt_logisch: bool` | `aliases`, `sources` |
| **Wiki** | `title`, `created`, `aktualisiert`, `type: wiki`, `status: <wert>`, `cluster: <Name>`, `konflikt_hart: bool`, `konflikt_wert: bool`, `konflikt_logisch: bool` | `aliases`, `quellen` |
| **Projekt** | `title`, `created`, `status: <wert>` (active/paused/done) | `goals`, `tags`, `next_action` |
**Hinweis:** Deutsche Keys (`aktualisiert`, `quellen`) sind eine bewusste Entscheidung gegen YAML-Standard-Konvention. Vorteil: konsistente deutsche Sprache. Nachteil: Inkompatibilität mit Standard-Tools (Dataview, pandoc-Templates), falls solche später hinzukommen. Wir akzeptieren das, weil die PWA der einzige Konsument ist.
### 8.4 Wiki-Status (5 deutsch)
| Status | Bedeutung | Wer setzt |
@@ -163,7 +215,7 @@ tags: [<Pascal_Snake_Case>] # optional
- Format: Obsidian-Standard `[[Dateiname]]` und `[[Dateiname|Anzeigetext]]`
- Tote Links erlaubt, Indexer listet sie in `99_System/Index.md` als „verwaist"
- Auto-Verlinkung: nur Wiki-zu-Wiki + `sources`-Liste, sonst manuell
- Auto-Verlinkung: nur Wiki-zu-Wiki + `quellen`-Liste, sonst manuell
### 8.6 Tags
@@ -173,8 +225,8 @@ tags: [<Pascal_Snake_Case>] # optional
### 8.7 Auto-gepflegte Felder
- `updated` — bei jedem Schreibvorgang neu gesetzt
- `sources` — Liste der Notizen, die eine Wiki-Seite stützen, in YAML-Form
- `aktualisiert` — bei jedem Schreibvorgang neu gesetzt
- `quellen` — Liste der Notizen, die eine Wiki-Seite stützen, in YAML-Form
## 9. Widerspruchs- / Duplikat- / Veraltet-Logik
@@ -182,9 +234,9 @@ tags: [<Pascal_Snake_Case>] # optional
| Stufe | Beispiel | Wer erkennt | Wiki-Status |
|---|---|---|---|
| **Hart** | Wiki: „Kaffee jeden Morgen" + Notiz: „kein Kaffee mehr" | Ingest (LLM) | `konflikt` |
| **Hart** | Wiki: „Kaffee jeden Morgen" + Notiz: „kein Kaffee mehr" | Ingest (LLM via Minimax) | `konflikt` |
| **Wert** | Wiki: „läuft seit 2025" + Notiz: „läuft seit 2026" | deterministisch (Heuristik) | nur Hinweis |
| **Logisch** | Wiki: „Ich bin Single" + Notiz: „Mein Partner X" | Ingest (LLM) | nur Hinweis |
| **Logisch** | Wiki: „Ich bin Single" + Notiz: „Mein Partner X" | Ingest (LLM via Minimax) | nur Hinweis |
**Nur Stufe 1 (Hart) setzt Wiki-Status auf `konflikt`.** Stufe 2 und 3 sind Hinweise, die Ingest im Wiki markiert, aber keinen Status-Wechsel auslösen.
@@ -203,7 +255,7 @@ konflikt_logisch: true|false
| Stufe | Beispiel | Wer erkennt |
|---|---|---|
| **Identisch** | gleicher Wortlaut in zwei Notizen | Hash-Vergleich (deterministisch) |
| **Inhaltlich ähnlich** | gleiche Aussage, andere Worte | Ingest (LLM) oder Embedding-Ähnlichkeit |
| **Inhaltlich ähnlich** | gleiche Aussage, andere Worte | Ingest (LLM via Minimax) oder Embedding-Ähnlichkeit |
**Anzeige in `99_System/Index.md`** unter „Mögliche Duplikate":
@@ -219,12 +271,12 @@ Keine automatische Zusammenführung — du entscheidest.
### 9.3 Veraltet
- Schwelle: **12 Monate** hardcoded. Später per Indexer-Config (`ALT_SCHWELLE_MONATE`) einstellbar.
- Schwelle: **`veraltet_schwellwert_monate`** aus `99_System/Konfig.md`. Default: 12 Monate. **Nicht hardcoded.**
- Alle Notiztypen (auch Inbox, Daily, Projekt) — nur Wiki ist ausgenommen, weil Wiki aktiv gepflegt wird.
- Erkennung:
- Deterministisch: Notiz älter als Schwelle, `updated` nie gesetzt
- Deterministisch: Notiz älter als Schwelle, `aktualisiert` nie gesetzt
- Heuristik: Schlüsselwörter wie „früher", „nicht mehr"
- Ingest (LLM): supersediert durch neue Notiz
- Ingest (LLM via Minimax): supersediert durch neue Notiz
- **KEIN Wiki-Status** für Veraltet. Wiki bleibt bei den 5 Status, Quellen-Notizen bekommen Veraltet-Markierung.
- Anzeige:
- ⚠️-Symbol vor der Notiz in `99_System/Index.md`
@@ -237,11 +289,12 @@ Keine automatische Zusammenführung — du entscheidest.
```
1. 10_Wiki/_Schema.md ← Wiki-Regeln
2. 99_System/Index.md ← Katalog aller Notizen
3. 10_Wiki/Index.md ← Wiki-Struktur
4. Betroffene Wiki-Seiten ← vom Skript vorab bestimmt (Tags + Embedding)
5. Neue Notiz ← zu verarbeitende Original-Quelle
6. Diff-Plan erstellen ← nur planen
7. Schreiben (--apply)
3. 10_System/Konfig.md ← Settings (Schwelle, Token-Budget, KI-Modell)
4. 10_Wiki/Index.md ← Wiki-Struktur
5. Betroffene Wiki-Seiten ← vom Skript vorab bestimmt (Tags + Embedding)
6. Neue Notiz ← zu verarbeitende Original-Quelle
7. Diff-Plan erstellen ← nur planen
8. Schreiben (--apply)
```
### 10.2 Schreib-Permissions
@@ -249,9 +302,10 @@ Keine automatische Zusammenführung — du entscheidest.
| Darf schreiben | Darf nicht schreiben |
|---|---|
| Wiki-Seiten-Inhalt | Inbox-Notizen (Original bleibt unverändert) |
| Wiki-Frontmatter (`status`, `updated`, `sources`, Konflikt-Booleans) | Andere Wiki-Seiten, die nicht betroffen sind |
| Wiki-Frontmatter (`status`, `aktualisiert`, `quellen`, Konflikt-Booleans) | Andere Wiki-Seiten, die nicht betroffen sind |
| `10_Wiki/Index.md` | `99_System/Index.md` (deterministisch durch Indexer) |
| `99_System/Logs/Ingest_<Datum>.md` | Daily, Projekt, Templates |
| `99_System/Logs/Ingest_<Datum>.md` | `99_System/Konfig.md` (außer du manuell) |
| | Daily, Projekt, Templates |
### 10.3 Idempotenz
@@ -299,9 +353,10 @@ Quellen mit `status: konflikt` oder ⚠️-Veraltet bekommen automatisch eine Wa
### 11.4 Token-Budget
- Weicher Hinweis: ~3.000 Tokens pro Antwort
- Kein harter Cutoff
- Bei mehr Inhalt: Stichpunkte + Verweise auf Quellen
- Default aus `99_System/Konfig.md`: `token_budget_default` (Vorschlag: 4000).
- **Kein Hardcap** (`token_budget_hardcap: false`).
- Realistische Einschätzung: eine Antwort umfasst 3 Quellen + Erläuterung; 3000–5000 Tokens sind realistisch.
- Bei mehr Inhalt: Stichpunkte + Verweise auf Quellen, nicht abschneiden.
## 12. QMD-Integration
@@ -326,9 +381,9 @@ Quellen mit `status: konflikt` oder ⚠️-Veraltet bekommen automatisch eine Wa
### 12.3 Integrations-Optionen
- **CLI** für Skripte (Ingest, Indexer-Refresh)
- **MCP-Server** optional für direkte Claude-Code-Integration
- Cache-Pfad: `99_System/Cache/` für Embeddings
- **CLI** für Skripte (Ingest, Indexer-Refresh, PWA-Backend)
- **MCP-Server** optional für direkte Integration
- Cache-Pfad: `99_System/Cache/` (aus `Konfig.md`)
### 12.4 QMD-Collections (Vorschlag)
@@ -342,14 +397,15 @@ qmd embed
(Endgültige Konfiguration beim Bauen.)
## 13. Webapp
## 13. Webapp / PWA
### 13.1 Stack
- **Vite** als Build-Tool (Standard, schneller Dev-Server, keine Config)
- **Vite** als Build-Tool
- **React** als UI-Framework (maximale Verbreitung, beste Doku, beste Kompatibilität)
- **TypeScript** für Typsicherheit (insbesondere für `landkarte.json` und QMD-Antworten)
- **Cytoscape.js** für Force-directed Graph (de-facto-Standard im Web)
- **TypeScript** für Typsicherheit
- **Cytoscape.js** für Force-directed Graph
- **Tiptap** als Markdown-Editor (Phase 4) — gute Markdown-Integration, mobile-tauglich, block-basiert
### 13.2 Mockup-Stile (3 sequenziell)
@@ -357,44 +413,110 @@ qmd embed
2. **Tab 2: Cluster-Karte** — Kontinente = Cluster, Städte = Notizen (Phase 3)
3. **Tab 3: Radialer Baum** — Mitte = Anker, Ringe = Themen (Phase 3)
### 13.3 Verhalten
### 13.3 PWA-Features (Phase 4)
- **Manifest.json** (App-Name, Icon, Theme-Color) — Pflicht für Installierbarkeit
- **Service Worker** — Offline-Fähigkeit, schnelleres Laden
- **Responsive Design** — Mobile-First
- **Installierbar auf Android** über Chrome „Zum Startbildschirm hinzufügen"
- **Spätere TWA-Verpackung** für Play-Store-Veröffentlichung (Phase 5, optional)
### 13.4 Editor-Funktionen (Phase 4)
- Markdown-Editor mit Live-Preview
- Frontmatter-Bearbeitung mit YAML-Validierung
- Wikilink-Autocomplete (zeigt existierende Notizen)
- Tag-Autocomplete
- Tag-Cluster-Anzeige (dynamisch, aus `99_System/Index.md`)
- Speichern triggert Indexer-Lauf asynchron
### 13.5 Verhalten
- Hover über Knoten → Vorschau (Titel + erste 200 Zeichen)
- Klick auf Knoten → volle Notiz öffnen
- Klick auf Knoten → volle Notiz im Editor
- Cluster-Legende rechts oben
- Filter nach Cluster, Status, Tags
## 14. Bau-Reihenfolge (3 Phasen)
## 14. Minimax-Integration (KI-Backend)
### Phase 1: MVP (Erfolgskriterium)
### 14.1 Provider
- **Provider:** Minimax (Cloud-KI, **kein lokales Modell**, kein lokales Skill — wird **über HTTP-API** angesprochen)
- **Authentifizierung:** API-Key liegt als **Environment-Variable** (nicht im Vault, nicht im Code). Der Name der Variable kommt aus `99_System/Konfig.md` (`ki_api_key_env`, z. B. `MINIMAX_API_KEY`).
- **API-URL:** aus `99_System/Konfig.md` (`ki_api_url`, z. B. `https://api.minimaxi.chat/v1`)
- **Modell:** aus `99_System/Konfig.md` (`ki_modell`, z. B. `MiniMax-M3`)
- **Abrechnung:** TokenPlan — Verbrauch wird über das Minimax-TokenPlan-Modell abgerechnet
- **Transport:** HTTPS, JSON-Body, Standard-Chat-Completion-Format (Details in Phase 2 verifizieren)
### 14.2 Wofür Minimax aufgerufen wird
- Wiki-Pflege (Verstehens-Aufgabe beim Ingest)
- Konflikt-Erkennung (Stufe 1 und 3 aus § 9.1)
- Duplikat-Erkennung Stufe 2 (inhaltlich ähnlich)
- Veraltet-Erkennung (kontextbasiert)
### 14.3 Wofür KEIN Minimax-Aufruf
- Indexer (deterministisch, kein LLM)
- QMD-Suche (lokale GGUF-Modelle)
- Wikilink-Auflösung (deterministisch)
- Tag-Operationen (deterministisch)
- Frontmatter-Parsing (deterministisch)
### 14.4 Datenschutz
- Notizinhalte werden **per HTTP-API an Minimax übertragen**, wenn Ingest eine Verstehens-Aufgabe hat (HTTPS, in Request-Body, kein Persistieren serverseitig laut Standard-API-Vertrag — verifizieren in Phase 2)
- QMD bleibt 100 % lokal (kein Notizinhalt verlässt den Rechner)
- API-Key liegt **nicht** im Vault, **nicht** im Code — nur als Environment-Variable, deren Name in `Konfig.md` referenziert ist
- Konfig-Datei hat `ki_provider: minimax` — falls auf lokal gewechselt wird, ändert sich nur dieser Eintrag
- `ki_api_key_env` ist **konfigurierbar**, damit du den Variablennamen an deine Umgebung anpassen kannst (z. B. `MINIMAX_API_KEY`, `MINIMAX_TOKEN`, etc.)
## 15. Bau-Reihenfolge (4 Phasen)
### Phase 1: MVP (Erfolgskriterium: Graph sichtbar)
- Vault-Struktur anlegen (Ordner, .gitignore-Erweiterung)
- `package.json` mit Scripts (`index`, `ingest`, `dev`)
- `package.json` mit Scripts (`index`, `ingest`, `dev`, `sync`)
- QMD installieren + Collections anlegen
- Indexer (Node.js, deterministisch) → `landkarte.json` + beide `Index.md`
- Webapp v0.1: Force-directed Graph, liest `landkarte.json`
- gitea als Git-Remote, `sync.mjs` als Skript
**Fertig wenn:** Webapp öffnet, zeigt deine Notizen als verbundenen Graph.
**Fertig wenn:** Webapp öffnet, zeigt deine Notizen als verbundenen Graph. Sync zu gitea funktioniert.
### Phase 2: Wiki + Ingest
- `10_Wiki/_Schema.md` schreiben
- `CLAUDE.md` schreiben
- Ingest-Skript (CLI + Claude-API) → Wiki-Pflege
- Ingest-Skript (CLI + Minimax) → Wiki-Pflege
- Konflikt-/Duplikat-/Veraltet-Logik
- Brain-First-Suchleiter aktiv
**Fertig wenn:** Inbox-Notiz reinlegen → `npm run ingest` → Wiki aktualisiert, Konflikte markiert.
### Phase 3: Visuell + Integration
### Phase 3: Visuell
- Webapp-Tab 2: Cluster-Karte
- Webapp-Tab 3: Radialer Baum
- QMD-MCP-Server für direkte Claude-Integration
**Fertig wenn:** Alle drei Stile verfügbar, Webapp vollständig.
**Fertig wenn:** Alle drei Stile verfügbar.
## 15. Klärungen (Audit-Trail)
### Phase 4: PWA-Editor + Mobile
- Tiptap-Markdown-Editor in Webapp integrieren
- PWA-Manifest + Service Worker
- Responsive Design (Mobile-First)
- Installierbar auf Android
- Sync-Trigger in PWA integriert
**Fertig wenn:** Du kannst von Android und Desktop gleichberechtigt schreiben und lesen.
### Phase 5 (optional, später): Native App
- TWA-Verpackung für Play-Store-Veröffentlichung
- Push-Notifications, App-Icon-Optimierung
## 16. Klärungen (Audit-Trail)
| Datum | Wer | Frage / Stichwort | Antwort / Begründung |
|---|---|---|---|
@@ -403,14 +525,14 @@ qmd embed
| 2026-09-05 | User | Folder-Sprache | DE |
| 2026-09-05 | User | Konflikt-Booleans | 3 bool'sche Felder (Variante A), alle explizit gesetzt |
| 2026-09-05 | User | Wiki-Status-anzahl | 5 Werte, eindeutig deutsch |
| 2026-09-05 | User | Auto-Verlinkung | Wiki→Wiki + sources automatisch, sonst manuell |
| 2026-09-05 | User | Auto-Verlinkung | Wiki→Wiki + quellen automatisch, sonst manuell |
| 2026-09-05 | User | Cluster-Modell | Dynamisch, emergent, Auto-Modus mit manueller Korrektur |
| 2026-09-05 | User | Mockup-Stile | 3 sequenziell: Graph → Karte → Radial |
| 2026-09-05 | User | QMD-Integration | CLI + MCP beides |
| 2026-09-05 | User | Bau-Reihenfolge | 3 Phasen |
| 2026-09-05 | User | Webapp-Stack | Vite + React + TypeScript + Cytoscape.js |
| 2026-09-05 | User | Bau-Reihenfolge | 4 Phasen (1: MVP, 2: Wiki, 3: Visuell, 4: PWA) |
| 2026-09-05 | User | Webapp-Stack | Vite + React + TypeScript + Cytoscape.js + Tiptap |
| 2026-09-05 | User | Ingest-Default | `--apply` direkt |
| 2026-09-05 | User | Veraltet | 1 Jahr, alle Notizen, kein Wiki-Status |
| 2026-09-05 | User | Veraltet | Schwelle aus `Konfig.md`, nicht hardcoded |
| 2026-09-05 | User | Konflikt-Anzeige | Obsidian-Callout OK |
| 2026-09-05 | User | Duplikat-Stufen | Identisch + inhaltlich ähnlich |
| 2026-09-05 | User | Daily-Format | Obsidian-Standard-YAML + Daily-Felder |
@@ -422,8 +544,16 @@ qmd embed
| 2026-09-05 | User | Suchleiter-Antwort | Nummerierte Liste, max. 3 Quellen, Top-3 nach Relevanz |
| 2026-09-05 | User | Wiki > QMD | Wiki-Quellen werden priorisiert |
| 2026-09-05 | Agent | QMD-Realität | verifiziert: real, npm `@tobilu/qmd`, MIT, ~2 GB GGUF-Modelle |
| 2026-09-05 | User | Cloud Sync | erlaubt, über gitea |
| 2026-09-05 | User | Mobile-Client | erlaubt, nur Android + Windows-Browser (kein iOS) |
| 2026-09-05 | User | KI-Provider | Minimax (Cloud-KI via HTTP-API, kein lokales Skill) |
| 2026-09-05 | User | KI-Authentifizierung | API-Key in Environment-Variable, Name aus `Konfig.md` (`ki_api_key_env`) |
| 2026-09-05 | User | Editor | eigene PWA (Obsidian-Like, kostenlos, self-hosted) |
| 2026-09-05 | User | Frontmatter-Keys | deutsch (`aktualisiert`, `quellen`) |
| 2026-09-05 | User | Token-Budget | aus Konfig, kein Hardcap, realistisch (~4000) |
| 2026-09-05 | User | Native App später | TWA möglich, Phase 5 (optional) |
## 16. Offene Punkte (TBD beim Bauen)
## 17. Offene Punkte (TBD beim Bauen)
| # | Punkt | Wann zu klären |
|---|---|---|
@@ -432,12 +562,17 @@ qmd embed
| 3 | `10_Wiki/_Schema.md`-Inhalt | Phase 2, vor Ingest-Bau |
| 4 | Beispiel-Notizen für erste Ingest-Iteration | Phase 1, zur Demonstration |
| 5 | Ingest-Log-Format | Phase 2 |
| 6 | Config-Datei-Form (`Konfig.md` / `package.json` / `.env`) | Phase 1 oder 2 |
| 7 | Watcher-Mode für Ingest (`--watch`) | Phase 2, Bonus |
| 8 | Lockfile-Mechanik (parallel-Läufe) | Phase 2, falls nötig |
| 9 | Performance bei großen Vaults (>5000 Notizen) | später, nach erstem Wachstum |
| 10 | Wiki-Pflege lokal vs. extern (Claude) | Phase 2, vor Ingest-Bau |
| 6 | Watcher-Mode für Ingest (`--watch`) | Phase 2, Bonus |
| 7 | Lockfile-Mechanik (parallel-Läufe) | Phase 2, falls nötig |
| 8 | Performance bei großen Vaults (>5000 Notizen) | später, nach erstem Wachstum |
| 9 | TWA-Verpackung für Play Store | Phase 5 (optional) |
| 10 | Sync-Trigger (manuell, automatisch, Cron) | Phase 1, mit `sync.mjs` |
| 11 | Konflikt-Auflösung-UI in PWA | Phase 4 |
| 12 | Offline-Modus für Editor (PWA) | Phase 4 |
| 13 | Minimax-API: exakte Endpoints, Request/Response-Format, Rate-Limits, Token-Kosten pro Operation | Phase 2, vor Ingest-Bau |
| 14 | API-Key-Setup für Dev-Umgebung (`.env`-Datei, `direnv`, oder Windows-Env-Vars) | Phase 1, mit `sync.mjs` |
| 15 | Verifizierung: persistiert Minimax Notizinhalte? Datenschutz-Klausel prüfen | Phase 2, vor Ingest-Bau |
---
*Erstellt als v0.2 (Konzept-Phase abgeschlossen). Vorherige Version v0.1 vom 2026-08-28. Implementierung beginnt mit Phase 1 nach Freigabe dieser Spec.*
*Erstellt als v0.3 (Konzept-Phase erweitert). Vorherige Version v0.2 vom 2026-09-05. Implementierung beginnt mit Phase 1 nach Freigabe dieser Spec.*