Ein intelligentes Kanban-Board mit KI-Unterstützung und Nostr-Integration, gebaut mit Svelte 5 und TypeScript.
🎉 PHASE 4 INFRASTRUCTURE ANALYSIS COMPLETE - MAJOR BREAKTHROUGH!
| Phase | Status | Completion | Code-Lines | Tests | Docs |
|---|---|---|---|---|---|
| Phase 1 | ✅ 95% | Author, Publishing, Comments, Merge, Export | 500+ | 150+ | ✅ |
| Phase 3 | ✅ 90% | ChatStore, AIPanel, Agents (3 Actions fehlen!) | 2000+ | 600+ | ✅ |
| Phase 2 | 🟡 15% | Settings+Dark Mode ✅, Mobile+A11y offen | 1000+ | 50+ | ✅ |
| Phase 4 | ✅ 85% | Infrastructure READY! Nur UI fehlt | 1200+ | 20+ | ✅ |
READ FIRST:
- 🗺️ ROADMAP.md ⭐ v3.3 PHASE 4 INFRASTRUCTURE ANALYSIS - Phase 4 ~85% fertig!
- 📋 DEVELOPER-TASKS.md ⭐ NEW - Nur noch fehlende Tasks (12-17 Tage)
- 📚 Dokumentations-Index - Navigation nach Rolle & Thema (52/52 Dateien)
- ✅ Offline-First: Arbeiten Sie ohne Internetverbindung, automatische Synchronisation bei Reconnect
- 🤖 KI-Agent-System (Phase 3.0 ✅): Intelligente Intent-Erkennung, 2-Phase Response Processing, Learning Manager mit Confidence Scoring
- 🧠 Intelligente Karten-Aufteilung: Automatische Card-Struktur und Aufgaben-Management via LLM
- 🌐 Nostr-basiert: Dezentrale Speicherung über Nostr-Relays (NIP-30301/30302)
- 💬 Kommentar-System: Lokal persistent mit lokalisierter UI (in Phase D: Nostr Publishing)
- 📱 Reaktiv: Svelte 5 Runes für optimale Performance
- 🔒 Typsicher: Vollständig in TypeScript implementiert
- 💬 Kommentare: Nostr-basierte Kommentare mit Reactions & Zaps
KRITISCH: Code ohne Docs-Update → PR wird REJECTED!
- 📚 DOCUMENTATION-RULES-v3.md - 🔴 v3.0 MANDATORY - DoD Checklist (11 Punkte), Enforcement-Rules
- 📚 Dokumentations-Index - Navigation nach Rolle & Thema (52/52 Dateien verlinkt!)
- 📚 Phase 3.0 KI-Developer Path - 11 neue KI-Integration Ressourcen
Bei jeder Code-Änderung:
- ✅ ROADMAP.md aktualisieren (wenn Feature betroffen)
- ✅ TESTSUITE/STATUS.md aktualisieren (wenn Tests betroffen)
- ✅ CHANGELOG.md aktualisieren (wenn User-sichtbar)
- ✅ Feature-Dokumentation aktualisieren (wenn API ändert)
- ✅ ARCHITECTURE/ Docs aktualisieren (wenn Pattern ändert)
- ✅ _INDEX.md aktualisieren (wenn neue Datei)
- ✅ Alte Docs archivieren (mit Migration-Notice)
Siehe: docs/DOCUMENTATION-RULES-v3.md für vollständige Regeln
Migration: docs/archive/DOCUMENTATION-RULES-v2.md (v2.0 deprecated)
- KONZEPT.md - Produkt-Vision & Use Cases (für Stakeholder)
- ROADMAP.md - 🗺️ Priorisierte Entwicklungs-Roadmap v3.0 (Phase 1-5, Phase 3.0 Complete!)
- AGENTS.md - Vollständige technische Spezifikation
- STORES.md - Svelte 5 Store-Architektur & Export/Import API
- AUTHOR-FIELD-ATTRIBUTION.md - Serialisierung & Persistierung Pattern
- AUTHSTORE-INTEGRATION-GUIDE.md - AuthStore API Reference
- NDK.md - NDK Integration & Nostr-Event Publishing
- Kanban-NIP.md - Nostr Event Schema (NIP-30301/30302)
- NOSTR-USER.md - Benutzerauthentifizierung (NIP-07)
- UX-RULES.md - shadcn-svelte UI Guidelines
- CHANGELOG.md - Änderungshistorie (✅ Version 4.0 - Phase 3.0 AI Agent Infrastructure Complete!)
Start hier:
- Neu im Projekt? → KONZEPT.md (15 min Überblick)
- Development starten? → 📚 Dokumentations-Index (Wähle deine Rolle!)
- Code-Beispiele? → AGENTS.md + UX-RULES.md
Nach Rolle:
| Rolle | Start | Nächste | Referenz |
|---|---|---|---|
| Product Manager | KONZEPT.md | ROADMAP.md | — |
| Frontend Dev | 📚 Index (Frontend Path) | UX-RULES.md | AUTHOR-FIELD-ATTRIBUTION.md |
| Nostr Dev | 📚 Index (Nostr Path) | NDK.md | AUTHSTORE-INTEGRATION-GUIDE.md |
| Backend/Auth | AUTHSTORE-INTEGRATION-GUIDE.md | NOSTR-USER.md | Session-Management |
| KI-Integration | AGENTS.md (Chat-Klasse) | ROADMAP.md (Phase 3) | — |
Dependency Graph:
┌─ Start: KONZEPT.md (Stakeholder-freundlich)
│
├─ Navigation: 📚 Dokumentations-Index
│ └→ Wähle deine Rolle → Learning Path
│
├─ Core Technical: AGENTS.md
│ ├→ BoardModel.ts (Klassen)
│ ├→ STORES.md (State Management)
│ │ ├→ NDK.md (Event Publishing)
│ │ ├→ AUTHSTORE-INTEGRATION-GUIDE.md (Auth API)
│ │ ├→ AUTHOR-FIELD-ATTRIBUTION.md (Serialisierung!)
│ │ └→ ROADMAP.md (Milestones)
│ └→ UX-RULES.md (Komponenten)
│
├─ Nostr Specifics: NDK.md
│ ├→ Kanban-NIP.md (Event Schema)
│ └→ NOSTR-USER.md (Signing)
│
└─ Implementation: ROADMAP.md (Phase 1-5)
└→ CHANGELOG.md (Progress tracking)
Meilenstein-Links:
- Phase 1.0 ✅ (Author Field Attribution) — siehe AUTHOR-FIELD-ATTRIBUTION.md + AUTHSTORE-INTEGRATION-GUIDE.md
- Phase 1.1 (Nostr Publishing) — siehe AGENTS.md + STORES.md
- Phase 1.2 (Offline-First) — siehe STORES.md (SyncManager)
- Phase 1.5 (Export/Import) — siehe STORES.md Section III ⭐
- Phase 2.1 (UI Components) — siehe UX-RULES.md + AGENTS.md
- Phase 3.1 (KI-Integration) — siehe AGENTS.md (Chat-Klasse) + ROADMAP.md
UI Components (Svelte 5)
↓
BoardStore ($state + $derived)
↓ ↓
BoardModel Classes SyncManager (Dexie)
↓ ↓
Nostr Events Event Queue (IndexedDB)
↓ ↓
Nostr Events Retry-Logik (2^n Backoff)
↓
NDK → Nostr Relays
# Dependencies installieren (mit Dexie & jsoncrush für Offline/Export)
pnpm install dexie jsoncrush @types/dexie
pnpm install# Development Server starten
pnpm run dev
# Mit Browser öffnen
pnpm run dev -- --open
# Tests ausführen
pnpm run test:unit
docker compose up # füge -d dazu, um das Terminal freizuhaben- Ändere
./static/config.jsonso
"nostr": {
"relaysPublic": [
"ws://localhost:7000"
],
"relaysPrivate": []pnpm dev- Um zu testen, ob es funktioniert, gib ins Terminal rein:
$ websocat ws://localhost:7000
Die Test-Suite kann direkt im Browser ausgeführt werden:
import { runTestSuite } from '$lib/utils/testSuite';
// In Browser-Konsole
runTestSuite();| Package | Version | Zweck | Phase |
|---|---|---|---|
| svelte | 5 | UI Framework mit Runes ($state, $derived) |
1.1 |
| typescript | ^5.0 | Strikte Typisierung für alle Klassen | 1.1 |
| @nostr-dev-kit/ndk | ^0.9+ | Nostr Protocol Client, Event Publishing | 1.1 |
| dexie | ^4.0+ | IndexedDB Wrapper für Event-Queue (Offline) | 1.2 |
| jsoncrush | ^1.5+ | Kompression für Share-Links (71% Reduktion) | 1.5 |
| shadcn-svelte | Latest | UI Komponenten (Card, Dialog, Button, etc.) | 1.1 |
| svelte-persisted-store | ^1.0+ | Persistierung von Session & Settings | 1.4 |
| lucide-svelte | ^0.300+ | Icon Library (@lucide/svelte/icons/...) | 1.1 |
| tailwind-css | 4 | CSS Utility Framework | 1.1 |
// Problem: Browser localStorage hat nur 5MB Limit
// Lösung: Dexie (IndexedDB Wrapper) mit unbegrenzter Größe
// Dexie Vorteile:
✅ Query API: .where('type').equals('card').toArray()
✅ Transactions: db.transaction() für atomare Operationen
✅ Indexes: O(log n) Performance vs O(n) Array-Filter
✅ Analytics: .where('retries').above(0).toArray()
✅ Dead-Letter Pattern: Automatisches Entfernen nach max 3 Retries
// Dexie wird NICHT verwendet für:
❌ Session Data (Auth Token) — bleibt in svelte-persisted-store
❌ UI State ($state direkt in Components) — bleibt im Svelte Store// Problem: Board JSON zu groß für URLs
// Lösung: jsoncrush Kompression + Base64-URL Encoding
// Komprimierung-Beispiel:
Original: {"id":"board-123","name":"Projekt Phoenix",...} — 3.2 KB
btoa(): eyJpZCI6ImJvYXJkLTEyMyIsIm5hbWUiOiJQcm9qZWt0IFBoI... — 4.3 KB
jsoncrush: eyJiIjoiYm9hcmQtMTIzIiwibCI6IlByb2plY3QgUGhvZW... — 0.9 KB ✅
// Größenersparnis: 71% kleiner als btoa!
// Sicher geteilt via: https://your-app.com/import?token=<crush-token>// Keine vorkonfigurierten Komponenten — stattdessen:
// Exportiert TypeScript + Svelte Code zum Copy-Paste
// Alle Komponenten mit korrekter Struktur:
<Card.Root>
<Card.Header>
<Card.Title>Titel</Card.Title>
</Card.Header>
<Card.Content>Inhalt</Card.Content>
<Card.Footer>Footer</Card.Footer>
</Card.Root>
// Befindet sich in: src/lib/components/ui/// Abstraktion über Nostr Relay-Komplexität hinweg
// NDK Funktionen:
✅ Event Publishing: event.publish() auf Relays
✅ Event Subscriptions: ndk.subscribe({kinds: [1]})
✅ Relay Management: Automatisches Failover
✅ Caching: Optional mit IndexedDB Adapter
// Im Projekt:
• boardStore nutzt NDK für Publish
• SyncManager nutzt NDK für Queue-Verarbeitung
• Chat nutzt NDK für Nostr Eventssrc/
├── lib/
│ ├── classes/
│ │ └── BoardModel.ts # ✅ Card, Column, Board, Chat Klassen
│ ├── stores/
│ │ ├── kanbanStore.svelte.ts # ✅ Hauptstore mit Svelte 5 Runes
│ │ ├── authStore.svelte.ts # ✅ User Authentication (COMPLETE!)
│ │ └── syncManager.svelte.ts # ✅ Offline-Sync Manager mit Dexie (COMPLETE!)
│ ├── utils/
│ │ ├── softLockManager.svelte.ts # ✅ Phase 4 Soft Locks (160 Zeilen - COMPLETE!)
│ │ ├── mergeEngine.ts # ✅ Phase 4 3-Way Merge (COMPLETE!)
│ │ ├── cardEditingFlow.ts # ✅ Phase 4 Conflict Detection (COMPLETE!)
│ ├── utils/
│ │ ├── idGenerator.ts # ✅ D-Tag Generierung
│ │ ├── nostrEvents.ts # 🟡 Event Serialization (Phase 1.1)
│ │ └── testSuite.ts # ✅ Test-Suite
│ ├── components/
│ │ ├── Board.svelte # 🟡 Refactor zu BoardModel (Phase 2.1)
│ │ ├── Column.svelte # 🟡 Refactor zu BoardModel (Phase 2.1)
│ │ ├── Card.svelte # 🟡 Refactor zu BoardModel (Phase 2.1)
│ │ ├── Chatbot.svelte # ⚪ KI-Interface (Phase 3.1)
│ │ └── ui/ # shadcn-svelte components
│ └── hooks/
└── routes/
├── +layout.svelte # ✅ NDK + Dexie Initialisierung
├── +page.svelte # ✅ Hauptseite
└── cardsboard/ # 🟡 Zu migrieren (Phase 2.1)
├── +page.svelte
├── Board.svelte
├── Column.svelte
├── Card.svelte
├── CardDialog.svelte
├── types.ts # Zu ersetzten durch BoardModel.ts
└── data.ts # Zu entfernen (Mock-Daten)
Legende: ✅ Fertig | 🟡 In Arbeit | ⚪ Geplant
- Frontend: Svelte 5 (Runes), TypeScript
- Nostr: NDK, @nostr-dev-kit/svelte
- UI: Shadcn-Svelte, Tailwind CSS 4
- State: Svelte Runes ($state, $derived)
- Persistenz: IndexedDB (via svelte-persisted-store)
- Testing: Vitest, Playwright
{
kind: 30301,
tags: [
["d", "board-id"],
["title", "Board Name"],
["col", "col-id", "Column Name", "0"]
]
}{
kind: 30302,
tags: [
["d", "card-id"],
["title", "Card Title"],
["s", "Column Name"],
["a", "30301:pubkey:board-id"]
]
}Siehe Kanban-NIP.md für Details.
Das Board funktioniert vollständig offline:
- Alle Änderungen werden lokal im
BoardStoregespeichert - Nicht-synchronisierte Events landen in einer Queue (IndexedDB via Dexie)
- Bei Reconnect werden Events automatisch mit exponentieller Retry-Logik publiziert
- Live-Subscriptions für Echtzeit-Updates
Die offline-first Funktionalität basiert auf zwei Komponenten:
- Verwaltet die Event-Queue (Dexie IndexedDB)
- Detektiert Online/Offline Status
- Implementiert exponentielles Backoff für Retry-Logik
- Dead-Letter Pattern: Events werden nach 3 Versuchen gelöscht
- Stop-on-First-Error: Sync stoppt beim ersten Fehler (verhindert Überlastung)
interface QueuedEventRow {
id?: number; // Auto-increment PK
event: string; // Serialisiertes NDKEvent
timestamp: number; // Erstellungszeit
retries: number; // Versuchszähler (0-3)
type: 'board' | 'card' | 'comment'; // Event-Typ für Analysen
}
// Indexes für Performance
- PRIMARY KEY: id (Auto-increment)
- INDEX: type (für Filterung nach Event-Typ)
- INDEX: retries (für Dead-Letter Analyse)
- INDEX: createdAt (für chronologische Ordnung)| Versuch | Wartezeit | Beispiel |
|---|---|---|
| 1. Versuch | Sofort | Beim Speichern |
| 2. Versuch | 2 Sekunden | Nach Reconnect: 2s Wartezeit |
| 3. Versuch | 4 Sekunden | Fallback: 4s Wartezeit |
| 4. Versuch | 8 Sekunden | Final: 8s Wartezeit |
| Dead-Letter | ❌ Gelöscht | Nach 3 Versuchen entfernen |
// Retry-Berechnung (2^retries * 1000 ms)
const waitTime = Math.pow(2, event.retries) * 1000;// Offline-Status prüfen
const status = boardStore.syncStatus;
console.log({
isOnline: status.isOnline, // Boolean: true/false
isSyncing: status.isSyncing, // Boolean: Sync in progress?
queuedEvents: status.queuedEvents // Anzahl der ausstehenden Events
});
// Live-Updates bei Status-Änderung
boardStore.subscribe(state => {
console.log(`📡 Queue: ${state.syncStatus.queuedEvents} Events pending`);
});// Benutzer arbeitet offline
1. User erstellt neue Karte → BoardStore speichert lokal ($state)
2. SyncManager erkennt: isOnline = false
3. Event wird in Dexie Queue eingefügt (retries = 0)
4. UI zeigt: "📡 Warte auf Verbindung..."
// Benutzer kommt online
5. SyncManager erkennt: isOnline = true
6. Alle Events aus Queue werden nacheinander publiziert
7. Jeder Event nutzt Retry-Logik (2^retries)
8. Bei Erfolg: Event aus Queue entfernt
9. Bei Fehler nach 3 Versuchen: Dead-Letter (gelöscht)
10. UI zeigt: "✅ Synchronisiert (3 Events)"// Queue-Inhalte abrufen (nach Event-Typ)
const cardEvents = await syncManager.getQueuedEvents('card');
const boardEvents = await syncManager.getQueuedEvents('board');
// Dead-Letter Events (fehlerhafte Events)
const deadLetters = await syncManager.getDeadLetterEvents();
// Retry-Statistiken
const retryStats = await syncManager.getRetryStats();
// → { total: 5, retrying: 2, failed: 1, pending: 2 }💡 Wichtig: Dexie wurde statt svelte-persisted-store gewählt wegen:
- ✅ Query API (
where(),orderBy(),filter()) - ✅ Transaktionen & Indexes (O(log n) statt O(n))
- ✅ Unbegrenzte Größe (vs. 5MB localStorage-Limit)
- ✅ Dead-Letter Pattern Support
- ✅ Bessere Analysen & Monitoring möglich
Kommentare werden als separate Nostr Events (Kind 1) gespeichert:
// Kommentar hinzufügen
await boardStore.addComment(cardId, "Mein Kommentar");
// Kommentare laden
await boardStore.loadComments(cardId);
// Kommentar löschen
await boardStore.deleteComment(cardId, commentId);Boards können als komprimierte Share-Links exportiert und importiert werden — komplett client-seitig ohne Backend:
// Board als JSON serialisieren und komprimieren
const shareToken = await boardStore.generateShareLink();
// → Ergebnis: "eyJi..." (Base64-URL-encoded, komprimiert mit jsoncrush)
// Link in Zwischenablage kopieren
const shareUrl = `https://your-app.com/import?token=${shareToken}`;
// Größenvergleich:
// • Original JSON: ~3.2 KB
// • Base64 (btoa): ~4.3 KB (+34%)
// • jsoncrush: ~0.9 KB (-71% ✅ SUPER KOMPRIMIERT!)// Share-Link dekomprimieren und importieren
const result = await boardStore.importFromShareLink(shareToken, 'merge');
// → { success: true, board: Board, mergeReport: {...} }
// Import-Modi:
// • 'replace': Existierendes Board ersetzen
// • 'merge': Mit bestehendem Board zusammenführen (Standard)
// • 'new': Neues Board erstellen
// Merge-Report prüfen
if (result.mergeReport) {
console.log(`Merged: ${result.mergeReport.cardsAdded} neue Karten`);
console.log(`Conflicts: ${result.mergeReport.conflictsResolved} aufgelöst`);
}<script>
import ExportImportDialog from '$lib/components/ExportImportDialog.svelte';
let showDialog = $state(false);
</script>
<button onclick={() => showDialog = true}>
📤 Board teilen
</button>
<ExportImportDialog bind:open={showDialog} />jsoncrush Komprimierung:
- ✅ String-Deduplizierung (wiederholte Keys werden gepoolt)
- ✅ Array-Indizes werden durch Zahlen ersetzt
- ✅ Whitespace wird entfernt
- ✅ Kombiniert mit Base64-URL Encoding (URL-sicher)
Beispiel: Vor/Nach Komprimierung
// Original JSON (~3.2 KB)
{
"id": "board-123",
"name": "Projekt Phoenix",
"columns": [
{ "id": "col-1", "name": "To Do", "cards": [...] },
{ "id": "col-2", "name": "In Progress", "cards": [...] }
]
}
// jsoncrush komprimiert (~0.9 KB) — Base64-URL-encoded:
"eyJiIjoiYm9hcmQtMTIzIiwibCI6IlByb2plY3QgUGhvZW5peCIsImMiOlt7ImkiOiJjb2wtMSIsIm4iOiJUbyBEbyIsImNhIjpbXX0s..."Share-Link Sicherheit:
⚠️ NICHT verschlüsselt — Token enthält komplettes Board als komprimiertes JSON- ✅ Keine Server-Abhängigkeit — Token ist in sich selbst vollständig
- ✅ DSGVO-konform — Kein Storage auf Server, nur Client-seitige Kompression
- 💡 Empfehlung: Sensitive Boards nicht über öffentliche Share-Links teilen
Bei Import im merge-Modus wird Last-Write-Wins angewendet:
// Konfliktauflösung:
// 1. Nach Timestamp (created_at) prüfen
// 2. Neuere Version gewinnt
// 3. Ältere Version wird ignoriert
// 4. Bericht: { conflictsResolved: N }# Unit Tests
pnpm run test:unit
# E2E Tests
pnpm run test:e2e
# Custom Test Suite (im Browser)
import { runTestSuite } from '$lib/utils/testSuite';
runTestSuite();Förderhinweis: Die Projektförderung erwartet die Umsetzung bis einschließlich Phase 4; Phase 5 ist optional (Nice-to-have).
Status: 🔴 IN PROGRESS
- Svelte 5 Runes + TypeScript Klassenstruktur
- 1.1: Nostr Event Publishing (boardToNostrEvent, cardToNostrEvent)
- 1.2: Offline-First Sync Manager mit Event Queue
- 1.3: Kommentar-System (Kind 1 Events)
- 1.4: Benutzerauthentifizierung (NIP-07)
Status: 🟡 PLANNED
- 2.1: UI-Komponenten Migration (Refactor cardsboard/)
- 2.2: UX Polish & Accessibility (WCAG 2.1 AA)
- 2.3: Performance & Optimization (Lighthouse > 90)
Status: ⚪ PLANNED
- 3.1: KI-Context Serialisierung & Chat-UI
- 3.2: OER-Content Discovery im Nostr-Netzwerk
- 3.3: KI-Aktionen (split-card, add-card, move-card)
Status: ✅ ~85% INFRASTRUCTURE READY - Nur UI + NIP-51 + Tests fehlen!
✅ BEREITS IMPLEMENTIERT (Backend Infrastructure - 85%):
- SoftLockManager (160 Zeilen) - Soft Locks mit Kind 20001
- MergeEngine - 3-Way Merge Algorithm
- CardEditingFlow - Session Management + Conflict Detection
- SyncManager - IndexedDB Queue + Retry Logic
- Nostr Events - createSoftLockEvent(), Maintainers Support
- Last-Write-Wins - Timestamp-basierte Conflict Resolution
- Maintainers - Multi-User Event Publishing
❌ NOCH ZU IMPLEMENTIEREN (UI + Integration - 15%):
- 4.1: Share Dialog UI (3-5 Tage)
- 4.1: NIP-51 Integration (2-3 Tage)
- 4.1: BoardRole Permission System (1 Tag)
- 4.2: Presence-Indicator UI (2-3 Tage)
- 4.2: Live-Notifications (1-2 Tage)
- 4.2: Soft-Lock UI Integration (1-2 Tage)
- 4.2: E2E Tests Multi-User (3-4 Tage)
Verbleibender Aufwand: ~12-17 Tage (nicht 30!)
Status: ⚪ PLANNED
- Materialverwaltung & Depot
- Gemeinschaften & Communities
- Analyse & Insights
- Mobile App (React Native/Flutter)
- Tool-Integrationen (LMS, Calendar, etc.)
Siehe ROADMAP.md für die vollständige priorisierte Roadmap mit Akzeptanz-Kriterien.
Siehe CONTRIBUTING.md für Richtlinien.
- Fork das Repository
- Feature Branch erstellen (
git checkout -b feature/amazing-feature) - Changes committen (
git commit -m 'Add amazing feature') - Branch pushen (
git push origin feature/amazing-feature) - Pull Request erstellen
Bitte beachten: PRs sollten gegen Meilensteine in ROADMAP.md ausgerichtet sein.
MIT License - siehe LICENSE für Details.
- Nostr: Nostr Protocol
- NDK: @nostr-dev-kit/ndk
- Kanban-NIP: vivganes/kanbanstr
- Svelte: Svelte 5
- Issues: GitHub Issues
- Dokumentation: Siehe
docs/Ordner - Diskussionen: GitHub Discussions
Projekt-Status: ✅ Phase 1: 95% | ✅ Phase 3: 90% | ✅ Phase 4 Infrastructure: 85%
Letzte Aktualisierung: 13. November 2025 (Phase 4 Infrastruktur-Analyse)
Repository: edufeed-org/nostr-cli
Kritischer Pfad: 32 Tage (nicht 43) - Deadline: 15.12.2025 möglich!
Für den aktuellen Entwicklungsstand siehe ROADMAP.md.