diff --git a/.gitignore b/.gitignore index 86da10b..3463503 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ node_modules/ .DS_Store *.log backup-*.html +bun.lock +extract-defaults.mjs +transform.mjs +index.html.bak +data/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fce0063 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM oven/bun:1 +WORKDIR /app +COPY package.json ./ +RUN bun install --production +COPY server.ts bootstrap.ts defaults.json index.html ./ +COPY assets/ ./assets/ +EXPOSE 3000 +CMD ["bun", "run", "server.ts"] diff --git a/defaults.json b/defaults.json new file mode 100644 index 0000000..282e067 --- /dev/null +++ b/defaults.json @@ -0,0 +1,1520 @@ +{ + "boards": { + "ringsystem": { + "name": "Ringsystem", + "goal": "Tool-agnostische Architektur — AGENTS.md kanonisch, CLAUDE.md/Codex/OpenCode als Symlinks. ARCHITECTURE.md definiert Ring 0–3.", + "wipLimit": 2, + "throughput": 1, + "sle": { + "days": 30, + "p": 85 + }, + "overview": { + "tagline": "Privacy-Schichten von innen (alles privat) nach außen (öffentlich).", + "description": "Ring 0 (personal-vault) sieht alles und routet. Ring 1 trennt privat (robin-private) von beruflich (robin-work). Ring 2 = Sub-Projekte in Ring 1. Ring 3 = öffentliche Repos (doener-app, musichub, pleasance, …). Sichtbarkeit von innen nach außen — Referenzen NUR von außen nach innen.", + "summary": "Tool-Agnostik durchgesetzt: AGENTS.md ist die kanonische Datei, jedes andere Tool greift via Symlink darauf zu (CLAUDE.md → AGENTS.md, gleiche Konvention für Codex, OpenCode). Skill-Files werden über ~/.skills/{name}.md zentral geteilt. Aktuell: globale ~/.claude/CLAUDE.md auf Symlink-Modell migriert.", + "type": "meta", + "launches": [ + { + "label": "ARCHITECTURE.md", + "sub": "Ring-Topologie + Dispatch-Konvention", + "url": "http://localhost:8765/dev/personal-vault/ARCHITECTURE.md", + "icon": "🔄" + }, + { + "label": "Global AGENTS.md", + "sub": "~/.claude/AGENTS.md (= CLAUDE.md)", + "url": "http://localhost:8765/.claude/AGENTS.md", + "icon": "⚙" + }, + { + "label": "Ring 0 AGENTS.md", + "sub": "personal-vault", + "url": "http://localhost:8765/dev/personal-vault/AGENTS.md", + "icon": "⊙" + }, + { + "label": "Ring 1w AGENTS.md", + "sub": "robin-work", + "url": "http://localhost:8765/dev/robin-work/AGENTS.md", + "icon": "●" + }, + { + "label": "Ring 1p AGENTS.md", + "sub": "robin-private", + "url": "http://localhost:8765/dev/robin-private/AGENTS.md", + "icon": "○" + }, + { + "label": "Skills-Verzeichnis", + "sub": "~/.claude/skills/ (alle Skills)", + "url": "http://localhost:8765/.claude/skills/", + "icon": "🛠" + }, + { + "label": "Rules-Verzeichnis", + "sub": "~/.claude/rules/ (Verhalten)", + "url": "http://localhost:8765/.claude/rules/", + "icon": "📐" + }, + { + "label": "Kanban SPEC.md", + "sub": "~/dev/kanban/SPEC.md", + "url": "http://localhost:8765/dev/kanban/SPEC.md", + "icon": "📖" + } + ], + "stack": [ + "AGENTS.md (kanonisch)", + "CLAUDE.md (Symlink)", + "Codex/OpenCode (Symlink)", + "Skills via ~/.skills/", + "Dispatch via ~/.agent-signals/", + "Ring-Architektur" + ], + "info": [ + { + "label": "Naming-Konvention", + "value": "AGENTS.md ist Quelle; Tool-spezifische Files sind Symlinks darauf" + }, + { + "label": "Ring 0", + "value": "~/dev/personal-vault/ — Vault, sieht alles, niemand sieht hier rein" + }, + { + "label": "Ring 1 privat", + "value": "~/dev/robin-private/ — Privat-Workspace + Ring-2-Projekte" + }, + { + "label": "Ring 1 beruflich", + "value": "~/dev/robin-work/ — Business-Workspace + Ring-2-Projekte" + }, + { + "label": "Ring 2", + "value": "Sub-Projekte in Ring 1 — z.B. ~/dev/robin-work/projects/{name}/" + }, + { + "label": "Ring 3", + "value": "Öffentliche Repos in ~/dev/ direkt — doener-app, musichub, pleasance, mdim, openclaw, docpilot, ai-engineering" + }, + { + "label": "Skills", + "value": "~/.claude/skills/{name}/SKILL.md → Symlink auf ~/.skills/{name}.md (tool-agnostisch teilbar)" + }, + { + "label": "Dispatch zwischen Ringen", + "value": "~/.agent-signals/dispatch/{workspace}.dispatch.md" + }, + { + "label": "Sichtbarkeitsregel", + "value": "innen → außen: Ring 0 sieht alles, Ring 1 sieht Ring 2+3, Ring 2 sieht Ring 3" + }, + { + "label": "Referenz-Regel", + "value": "außen → innen: nur wissen DASS innere Ringe existieren, NIEMALS Inhalte lesen oder leaken" + } + ], + "commands": [ + { + "label": "Globale AGENTS lesen", + "cmd": "cat ~/.claude/AGENTS.md" + }, + { + "label": "ARCHITECTURE lesen", + "cmd": "cat ~/dev/personal-vault/ARCHITECTURE.md" + }, + { + "label": "Alle Skills auflisten", + "cmd": "ls ~/.claude/skills/" + }, + { + "label": "Symlink-Check", + "cmd": "find ~/dev/robin-work ~/dev/robin-private ~/dev/personal-vault -maxdepth 2 -name \"CLAUDE.md\" -type l" + } + ] + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "AGENTS.md ## Aktueller Stand in allen Code-Repos auf 2-Bullet-Snapshot schrumpfen" + }, + { + "t": "Codex/OpenCode Symlink-Setup verifizieren oder anlegen" + }, + { + "t": "~/.skills/ als kanonischen Skill-Store dokumentieren" + }, + { + "t": "Ring-Mapping-Tabelle in ARCHITECTURE.md aktuell halten (cmux-toolkit, khala etc.)" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "~/.claude/CLAUDE.md → AGENTS.md migriert (Symlink-Konvention)", + "doneAt": 1779580800000 + }, + { + "t": "Ringsystem-Meta-Board angelegt mit Overview aller relevanten MD-Files", + "doneAt": 1779580800000 + } + ] + } + ] + }, + "kanban": { + "name": "Kanban (dieses Board)", + "goal": "Self-contained HTML-Kanban — ~/dev/kanban/index.html. Visualisierung des Ringsystems, Single Source of Truth für laufende Projekte.", + "wipLimit": 2, + "throughput": 3, + "sle": { + "days": 7, + "p": 85 + }, + "overview": { + "tagline": "Autopoiesis — das System, das sich selbst beobachtet und steuert.", + "description": "Single Source of Truth für alle laufenden Projekte. Visualisiert das Ringsystem (Ring 0 → Ring 3) als 5-Dimensionen-Layer: Gruppe (Domäne) × Ring (Privacy) × Board (Projekt) × Spalte (Flow-Status) × Karten-Class-of-Service. Self-contained HTML/CSS/JS, keine Build-Pipeline, kein Backend. State in localStorage. Anlehnung an Luhmanns Systemtheorie: das Kanban beobachtet sich selbst (dieses Meta-Board) und alle anderen Projekte gleichzeitig.", + "summary": "Reifegrad: produktionsreif für tägliche Nutzung. Aktuell in Iteration: Overview-Pages pro Projekt mit Hero-Icons, Quick-Launch, Secrets, Quick-Commands. Pilot war Döner-App. Ausstehend: Overview-Daten für die restlichen Boards.", + "type": "meta", + "launches": [ + { + "label": "Kanban öffnen", + "sub": "~/dev/kanban/index.html", + "url": "http://localhost:8765/dev/kanban/index.html", + "icon": "📋" + }, + { + "label": "Spec lesen", + "sub": "SPEC.md (Architektur + Test-Checkliste)", + "url": "http://localhost:8765/dev/kanban/SPEC.md", + "icon": "📖" + }, + { + "label": "ARCHITECTURE.md", + "sub": "Ring-System kanonisch", + "url": "http://localhost:8765/dev/personal-vault/ARCHITECTURE.md", + "icon": "🔄" + }, + { + "label": "CLAUDE.md global", + "sub": "Skill-Routing + Globals", + "url": "http://localhost:8765/.claude/CLAUDE.md", + "icon": "🤖" + } + ], + "stack": [ + "HTML5", + "CSS3 (Custom Properties)", + "Vanilla JS", + "HTML5 Drag & Drop API", + "localStorage", + "Monte-Carlo-Simulation", + "Little's Law", + "Luhmann-Autopoiesis" + ], + "info": [ + { + "label": "Datei", + "value": "/Users/robinchoice/dev/kanban/index.html" + }, + { + "label": "Spec", + "value": "/Users/robinchoice/dev/kanban/SPEC.md" + }, + { + "label": "Assets", + "value": "/Users/robinchoice/dev/kanban/assets/ (App-Icons)" + }, + { + "label": "localStorage", + "value": "kanban_v2 · kanban_groups · kanban_board_order · kanban_ideas · kanban_ideas_seeded" + }, + { + "label": "Tabs", + "value": "Overview (default) · Board · Analytics" + }, + { + "label": "Gruppen", + "value": "Meta · Code · Beruflich · Web · Privat" + }, + { + "label": "Ringe", + "value": "R0 (Meta) · R1p (privat) · R1w (beruflich) · R2 (Sub-Projekt) · R3 (öffentlich)" + }, + { + "label": "Seed-Version", + "value": "v3 — 16 neue Ideen aus _archive (Songideen, Bitcoin Bank, Cypherpunk, …)" + } + ], + "commands": [ + { + "label": "Kanban öffnen", + "cmd": "open ~/dev/kanban/index.html" + }, + { + "label": "Spec ansehen", + "cmd": "cat ~/dev/kanban/SPEC.md" + }, + { + "label": "localStorage komplett resetten", + "cmd": "echo 'localStorage.clear()' // im Browser-Devtools-Console ausführen" + }, + { + "label": "Backup-Dump", + "cmd": "cp ~/dev/kanban/index.html ~/dev/kanban/backup-$(date +%Y%m%d).html" + } + ] + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "CFD (Cumulative Flow Diagram) via tägliche Snapshots" + }, + { + "t": "Definition of Ready / Done pro Spalte editierbar" + }, + { + "t": "Class-of-Service-Mix-Chart in Analytics" + }, + { + "t": "PWA-Manifest für iPad Home-Screen (Stufe 1)" + }, + { + "t": "Sync-Layer (Cloudflare Worker + KV) für Multi-Device (Stufe 3)" + }, + { + "t": "AGENTS.md ## Aktueller Stand in allen Code-Repos auf 2-Bullet-Snapshot schrumpfen" + }, + { + "t": "Filesystem-Sync (optional): Node-Backend Boards ↔ Ordner" + }, + { + "t": "Card-Edit (Titel/Note direkt in der Karte)" + }, + { + "t": "Sortierung INNERHALB einer Spalte per Drag" + }, + { + "t": "Export / Backup als JSON-Dump" + }, + { + "t": "Overview-Daten für alle restlichen Boards (musichub, openclaw, docpilot, k4, pleasance, mdim, …)" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [ + { + "t": "Robin testet das Board auf Herz & Nieren" + } + ] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "WIP-Limit pro Board editierbar (Header-Pill)", + "doneAt": 1779580800000 + }, + { + "t": "Launch-Cards komplett klickbar (nicht nur ↗)", + "doneAt": 1779577200000 + }, + { + "t": "Overview komplett editierbar (alle Felder, Add/Remove Rows)", + "doneAt": 1779573600000 + }, + { + "t": "Auto-Aging — movedAt-Timestamp + Glow für überfällige Karten", + "doneAt": 1779570000000 + }, + { + "t": "Throughput-History — doneAt-Timestamp + reale 14-Tage-Berechnung", + "doneAt": 1779566400000 + }, + { + "t": "Flow Efficiency Berechnung korrigiert (WIP/(WIP+Ready))", + "doneAt": 1779562800000 + }, + { + "t": "Board-Name + Goal per Klick editierbar", + "doneAt": 1779559200000 + }, + { + "t": "kanban-mcp aus MCP-Config entfernt", + "doneAt": 1779555600000 + }, + { + "t": "_archive READMEs als DEPRECATED-Marker angelegt", + "doneAt": 1779552000000 + }, + { + "t": "Overview-Hero mit App-Icon + Tagline + Description", + "doneAt": 1779494400000 + }, + { + "t": "Tab-Reihenfolge: Overview · Board · Analytics", + "doneAt": 1779494400000 + }, + { + "t": "Overview-Pilot Döner-App (Quick-Launch, Hosting, Secrets, Commands)", + "doneAt": 1779408000000 + }, + { + "t": "Ring-Badge an Boards + Klick zum Wechseln", + "note": "R0/R1p/R1w/R2/R3 — Sidebar-Pill", + "doneAt": 1779321600000 + }, + { + "t": "Gruppen-Reihenfolge per Drag ändern", + "doneAt": 1779321600000 + }, + { + "t": "Task → Idee per Drag (Tag-Drop-Zone)", + "doneAt": 1779321600000 + }, + { + "t": "Meta-Gruppe + dieses Kanban-Board angelegt", + "doneAt": 1779235200000 + }, + { + "t": "SPEC.md komplett neu (Test-Checkliste für Tester-Agent)", + "doneAt": 1779235200000 + }, + { + "t": "Promote-Card-zu-Board (↗ Button)", + "doneAt": 1779148800000 + }, + { + "t": "Tiefenscan _archive → 16 neue Seed-Ideen v3", + "doneAt": 1779148800000 + }, + { + "t": "Card-Delete + Promote-Modal-Bug + Group-Create-Bug gefixt", + "doneAt": 1779062400000 + }, + { + "t": "Idee-DnD → Spalte + Board-Drag zwischen Gruppen + Board-Reorder", + "doneAt": 1779062400000 + }, + { + "t": "3-Spalten-Vereinfachung + Blocker-Flag statt Tags", + "doneAt": 1778976000000 + }, + { + "t": "Expedite-Swimlane (3 Zonen aligned zu Spalten)", + "doneAt": 1778976000000 + }, + { + "t": "Add-Card-Input + Add-Board-Modal + Add-Group", + "doneAt": 1778889600000 + }, + { + "t": "Ideen-Pinnwand rechts + 35 Seed-Ideen aus Ring-System", + "doneAt": 1778889600000 + }, + { + "t": "Monte-Carlo-Forecast + Kanban-KPIs (Cycle Time, Flow Efficiency, SLE)", + "doneAt": 1778803200000 + }, + { + "t": "localStorage-Persistierung + 5→3-Spalten-Migration", + "doneAt": 1778803200000 + }, + { + "t": "Initial-Setup: 14 Boards aus Robins Ring-System ingested", + "doneAt": 1778716800000 + } + ] + } + ] + }, + "doener": { + "name": "Döner-App", + "goal": "iOS-App in Swift 6 + SwiftUI + MapKit. Ziel: tester-ready, dann App Store Launch.", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "overview": { + "icon": "assets/doener.png", + "tagline": "Find. Bewerte. Sammle. — eine Stempelkarte für Dönerläden.", + "description": "iOS-App zum Finden, Bewerten und Sammeln von Dönerläden. Offline-First mit Community-Layer: Check-Ins, Sauce/Fleisch/Brot-Ratings, persönliche Döner-Geschichte und Live-Status von Freunden. Karte nutzt OpenStreetMap via Overpass-API mit SwiftData-Caching (24h-Refresh). Gamification-Mechaniken angelehnt an Pokémon Go und Spotify Wrapped.", + "summary": "Sprint 3 — Launch-Readiness. Backend läuft auf Coolify (Hetzner). iOS-App vor dem Switch von LAN auf Prod-Backend. Sprints 1+2 fertig (Tester-Readiness + Backend-Sync + Freunde-Feed live). Aktuell: S3.2 Produktiv-Hosting in WIP, S3.8 Apple JWKS-Validierung als Security-Blocker.", + "type": "ios-app", + "launches": [ + { + "label": "GitHub Repo", + "sub": "robinchoice/DoenerApp", + "url": "https://github.com/robinchoice/DoenerApp", + "icon": "⌥" + }, + { + "label": "Coolify Dashboard", + "sub": "App jdna5c4…", + "url": "https://coolify.diespaetzles.lol", + "icon": "🚀" + }, + { + "label": "App Store Connect", + "sub": "Beta noch nicht released", + "url": "https://appstoreconnect.apple.com", + "icon": "📱" + }, + { + "label": "Apple Developer", + "sub": "Approval ausstehend", + "url": "https://developer.apple.com/account", + "icon": "⚙" + } + ], + "stack": [ + "Swift 6", + "SwiftUI", + "MapKit", + "SwiftData", + "Vapor", + "PostgreSQL + PostGIS", + "Docker", + "Coolify", + "Hetzner", + "Overpass API" + ], + "info": [ + { + "label": "Repo-Pfad", + "value": "~/dev/doener-app" + }, + { + "label": "Backend-Stack", + "value": "Vapor (Swift) + PostgreSQL + PostGIS" + }, + { + "label": "Coolify App-UUID", + "value": "jdna5c4aqx6bf6u10bs5j48n" + }, + { + "label": "Coolify DB-UUID", + "value": "mzu4msj785xpe5nl6ypntb4d" + }, + { + "label": "Coolify-Instanz", + "value": "coolify.diespaetzles.lol" + }, + { + "label": "iOS APIConfig", + "value": "iOS/DoenerApp/.../APIConfig.swift (Switch LAN→Prod ausstehend)" + }, + { + "label": "Hosting", + "value": "Hetzner VPS + Coolify, deployed via git.diespaetzles.lol" + }, + { + "label": "Apple JWKS", + "value": "S3.8 — Signaturprüfung implementieren (SECURITY-BLOCKER)" + } + ], + "secrets": [ + { + "label": "COOLIFY_SPAETZLES_TOKEN", + "value": "(bitte aus ~/.secrets eintragen oder env-ref lassen)", + "masked": true + }, + { + "label": "GitHub Secret — COOLIFY_TOKEN", + "value": "(bitte eintragen)", + "masked": true + }, + { + "label": "GitHub Secret — COOLIFY_APP_UUID", + "value": "jdna5c4aqx6bf6u10bs5j48n" + }, + { + "label": "Apple Bundle ID", + "value": "(bitte eintragen — z.B. com.robinchoice.DoenerApp)" + }, + { + "label": "Apple Team ID", + "value": "(bitte eintragen)" + } + ], + "commands": [ + { + "label": "Deploy triggern", + "cmd": "curl -X POST -H \"Authorization: Bearer $COOLIFY_SPAETZLES_TOKEN\" https://coolify.diespaetzles.lol/api/v1/applications/jdna5c4aqx6bf6u10bs5j48n/start" + }, + { + "label": "Repo öffnen", + "cmd": "cd ~/dev/doener-app && code ." + }, + { + "label": "Logs anschauen", + "cmd": "curl -H \"Authorization: Bearer $COOLIFY_SPAETZLES_TOKEN\" https://coolify.diespaetzles.lol/api/v1/applications/jdna5c4aqx6bf6u10bs5j48n/logs" + } + ] + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "App-Store-Launch als Sprint Goal definieren" + }, + { + "t": "S4.A Pokémon-Go Sammelmechanik" + }, + { + "t": "S4.B Snapchat-Heatmap" + }, + { + "t": "S4.C Döner-Symbole statt Sterne" + }, + { + "t": "S4.D Community-Summary mit KI" + }, + { + "t": "S4.E In-App Feedback für Tester" + }, + { + "t": "S3.5 Push Notifications" + }, + { + "t": "S3.6 Freunde per Kontakte finden" + }, + { + "t": "S3.7 Leaderboards" + }, + { + "t": "S3.8 Apple JWT Signaturprüfung", + "blocked": true, + "cos": "fixed" + }, + { + "t": "S3.3 Google Maps Places API", + "blocked": true, + "cos": "expedite" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [ + { + "t": "S3.2 Produktiv-Hosting", + "blocked": true, + "cos": "expedite", + "age": 30 + } + ] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "Sprint 1: Tester-Readiness", + "note": "Sprint 1 komplett ✅" + }, + { + "t": "Sprint 2: Backend-Sync", + "note": "Sprint 2 komplett ✅" + }, + { + "t": "S3.4 Freunde-Feed + Live-Status", + "note": "Backend + iOS fertig, Build grün" + } + ] + } + ] + }, + "musichub": { + "name": "Music Hub", + "goal": "Label-Kollaborations-Webapp: SvelteKit + Hono + Postgres. Phase 3: Background Sync.", + "wipLimit": 3, + "throughput": 3, + "sle": { + "days": 21, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Status quo klären + neues Sprint Goal definieren" + }, + { + "t": "Phase 3: Background Sync (IDB-Queue, SW sync-Handler)" + }, + { + "t": "Onboarding-Role für Backend-Personalisierung nutzen" + }, + { + "t": "DB is_public nach STEM-Tests auf privat setzen" + }, + { + "t": "RESEND_API_KEY setzen für E-Mail-Versand", + "blocked": true + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "PWA Phase 2: Push Notifications (VAPID)", + "note": "VAPID, push_subscriptions, SW-Handler" + }, + { + "t": "Listen Analytics + Reject with Feedback", + "note": "IP-Hashing, sendBeacon" + }, + { + "t": "SSE Real-time (EventSource, Pub/Sub)", + "note": "version:new / comment:new" + }, + { + "t": "Onboarding Flow + Bottom Navigation Mobile", + "note": "3-Step Overlay, safe-area-aware" + } + ] + } + ] + }, + "openclaw": { + "name": "OpenClaw / Rob", + "goal": "Eigener 24/7-KI-Assistent auf Dell OptiPlex. Gemma 4, Telegram-Bridge, MCP-Tools.", + "wipLimit": 2, + "throughput": 1, + "sle": { + "days": 30, + "p": 80 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Whisper Voice-Messages Container stabilisieren" + }, + { + "t": "TELEGRAM_CHAT_ID setzen" + }, + { + "t": "Modellwechsel + openclaw-upgrade", + "blocked": true, + "cos": "expedite" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "docpilot": { + "name": "docpilot", + "goal": "Git-getriggerte Doku-Updates via Claude API. v1: README-Modus → PR.", + "wipLimit": 2, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Spec schreiben: v1 README-Modus" + }, + { + "t": "Repo anlegen + CLAUDE.md einrichten" + }, + { + "t": "GitHub Action: Diff → Claude → PR" + }, + { + "t": "Erster Live-Test: Perpetual Traveler Repo" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "k4": { + "name": "K4 Digital — Ronal Edge Rollout", + "goal": "Freelance PM: OT-Security-Rollout für Ronal Group. 7 Werke, 326 EdgeFire + 20 EdgeIPS (TXOne Networks).", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 7, + "p": 90 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Ticketsystem: Passwort ändern nach erstem Login" + }, + { + "t": "Eskalationsprozess definieren (Mail + Ticketsystem) → Timo/Günter" + }, + { + "t": "Contact List für EdgeOne-Zugang → Luis" + }, + { + "t": "Syslog-Problem: Detail-Call mit Luis + Ronny" + }, + { + "t": "Remote Access freigeben (Benjamin Veit)" + }, + { + "t": "Spain-Site: Baseline-Dokumentation erstellen (neue Template-Site)" + }, + { + "t": "Solcomp on-site Mexico — 2026-05-21", + "cos": "fixed" + }, + { + "t": "Solcomp on-site Mexico — 2026-05-28", + "cos": "fixed" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "NDA unterzeichnet" + }, + { + "t": "Global Rollout Kick-off Call moderiert", + "note": "2026-05-18 — Ronal, TXOne, Solcomp, K4" + } + ] + } + ] + }, + "branding": { + "name": "Branding & Außendarstellung", + "goal": "Logo, Farbschema, Typo, Fotos, Angebots-/Rechnungstemplate.", + "wipLimit": 2, + "throughput": 1, + "sle": { + "days": 30, + "p": 80 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Logo + Farbschema + Typo festlegen" + }, + { + "t": "Professionelle Fotos — Termin vereinbaren" + }, + { + "t": "Angebots-/Rechnungstemplate mit Pandoc+Typst" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "psk": { + "name": "PSK I Zertifizierung", + "goal": "PSK I bestanden ✅. Jetzt: Kurs bei K4 als Trainer durchführen.", + "wipLimit": 1, + "throughput": 1, + "sle": { + "days": 7, + "p": 95 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Control Chart ↔ Agent Chart gegenüberstellen" + }, + { + "t": "Gyra aufhübschen — neues Beispiel (SLA + Definition of Workflow)" + }, + { + "t": "Stammbaum: Lean → Agil → Kanban → Scrum" + }, + { + "t": "Lead Time & Flow Efficiency — kurzer Abriss" + }, + { + "t": "Frage 185: 3 vs. 5 Feedback Loops in Scrum klären" + }, + { + "t": "SLE-Formel zugänglich erklären" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "Lernplan durcharbeiten", + "note": "Zertifizierungsphase abgeschlossen" + }, + { + "t": "Mock-Prüfung / Self-Assessment", + "note": "PSK I bestanden ✅" + } + ] + } + ] + }, + "pleasance": { + "name": "Pleasance", + "goal": "Atelier-Hub-Site: Kontaktformular gebaut. RESEND_API_KEY + DNS + weitere Seiten ausstehend.", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "RESEND_API_KEY in Coolify setzen", + "blocked": true + }, + { + "t": "DNS A-Record api.pleasance.org → VPS-IP" + }, + { + "t": "Resend + Kontaktformular-E-Mail testen" + }, + { + "t": "Hetzner VPS bestellen + Coolify installieren" + }, + { + "t": "pleasance.org von Vercel → Coolify migrieren" + }, + { + "t": "Inhalte aus pleasance-thoughts integrieren" + }, + { + "t": "studio.html + buehne.html + projekte.html" + }, + { + "t": "img/robin.jpg besorgen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "kontakt.html: Drei Doors → Formular" + }, + { + "t": "coaching.html: alle Links → kontakt.html" + }, + { + "t": "api/: Bun/Hono POST /contact mit Resend" + }, + { + "t": "lernplatform-fork gelöscht", + "note": "Durch analyze-sources abgedeckt" + } + ] + } + ] + }, + "mdim": { + "name": "mydrugismusic Website", + "goal": "Website-Relaunch: Astro 5 + Directus CMS, deployed via Coolify.", + "wipLimit": 2, + "throughput": 2, + "sle": { + "days": 21, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Aktuellen Stand prüfen + offene Tasks erfassen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "eu": { + "name": "Einzelunternehmen", + "goal": "Buchhaltung, Banking und operative Verwaltung des Einzelunternehmens.", + "wipLimit": 2, + "throughput": 1, + "sle": { + "days": 30, + "p": 80 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Lexoffice anschauen + M26 sortieren" + }, + { + "t": "Zweites Businesskonto eröffnen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "privat": { + "name": "Haushalt & Leben", + "goal": "Persönliche Projekte, Haushalt, Anschaffungen.", + "wipLimit": 2, + "throughput": 2, + "sle": { + "days": 14, + "p": 80 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Roborock starten" + }, + { + "t": "Wäsche anschmeißen" + }, + { + "t": "Fahrradkette reparieren" + }, + { + "t": "Analogkameras an die Wand bringen" + }, + { + "t": "Bilder aufhängen" + }, + { + "t": "Haken im Schlafzimmer aufhängen" + }, + { + "t": "Korkpinwand fürs Büro kaufen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "degoogle": { + "name": "De-Google / FOSS Migration", + "goal": "Migration zu self-hosted + FOSS. Nextcloud und Immich laufen bereits.", + "wipLimit": 2, + "throughput": 1, + "sle": { + "days": 30, + "p": 80 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Google Fotos → Immich Migration" + }, + { + "t": "Matrix/Conduwuit self-hosted + Bridges" + }, + { + "t": "Google Meet → Jitsi Meet self-hosted" + }, + { + "t": "Apple Podcasts → AntennaPod / Podverse" + }, + { + "t": "Apple Bücher → KOReader + Calibre-Web" + }, + { + "t": "VPN: Mulvad einrichten" + }, + { + "t": "Mail-Server evaluieren: Stalwart Mail" + }, + { + "t": "GrapheneOS Migration (iPhone → Pixel)" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [ + { + "t": "Navigation: Organic Maps installieren", + "age": 7 + } + ] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "Proton Passwortmanager → Bitwarden", + "note": "256 Items nach Vaultwarden migriert" + }, + { + "t": "Google Authenticator → Aegis / Raivo", + "note": "Alle 2FA-Codes nach Raivo OTP ✅" + } + ] + } + ] + }, + "bibliothek": { + "name": "Bibliothek-Pipeline", + "goal": "475 PDFs aus Nextcloud via /analyze-sources zu destillierten Markdown-Artikeln.", + "wipLimit": 2, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Pilot: E-Book mit analyze-sources verarbeiten" + }, + { + "t": "Marker auf x86_64 Mac klären" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "aikb": { + "name": "AI Engineering KB", + "goal": "Wissens-Repo für AI Engineering nach LLM-Wiki-Pattern (Karpathy).", + "wipLimit": 2, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [ + { + "t": "Schema-Diff: source_type, author, year, isbn", + "note": "Frontmatter-Schema + Template dokumentiert" + } + ] + } + ] + }, + "tiefgang": { + "name": "Tiefgang", + "goal": "", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "4 Songs mit KI-Tools mastern" + }, + { + "t": "4 Songs in die Cloud hochladen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "mdimmusic": { + "name": "MDIM", + "goal": "mydrugismusic — Label & Artist-Kollektiv.", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "droii": { + "name": "DROII", + "goal": "", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "einzelunternehmer": { + "name": "Einzelunternehmer", + "goal": "Finanzen, Buchhaltung, Steuern, Verwaltung als Freelancer.", + "wipLimit": 3, + "throughput": 1, + "sle": { + "days": 30, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [ + { + "t": "Lexoffice: Stand prüfen" + } + ] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + }, + "soloprojekt": { + "name": "Soloprojekt", + "goal": "", + "wipLimit": 3, + "throughput": 2, + "sle": { + "days": 14, + "p": 85 + }, + "cols": [ + { + "id": "ready", + "label": "Ready", + "tasks": [] + }, + { + "id": "wip", + "label": "In Progress", + "tasks": [] + }, + { + "id": "done", + "label": "Done", + "tasks": [] + } + ] + } + }, + "boardMeta": { + "ringsystem": { + "group": "Meta", + "color": "#7c6af7", + "ring": "0" + }, + "kanban": { + "group": "Meta", + "color": "#c084fc", + "ring": "3" + }, + "doener": { + "group": "Code", + "color": "#f87171", + "ring": "3" + }, + "musichub": { + "group": "Code", + "color": "#c084fc", + "ring": "1w" + }, + "openclaw": { + "group": "Code", + "color": "#60a5fa", + "ring": "1w" + }, + "docpilot": { + "group": "Code", + "color": "#7c6af7", + "ring": "1w" + }, + "k4": { + "group": "Beruflich", + "color": "#fbbf24", + "ring": "1w" + }, + "branding": { + "group": "Beruflich", + "color": "#4ade80", + "ring": "1w" + }, + "psk": { + "group": "Beruflich", + "color": "#4ade80", + "ring": "1w" + }, + "eu": { + "group": "Beruflich", + "color": "#fbbf24", + "ring": "1w" + }, + "pleasance": { + "group": "Web", + "color": "#f87171", + "ring": "3" + }, + "mdim": { + "group": "Web", + "color": "#c084fc", + "ring": "3" + }, + "privat": { + "group": "Privat", + "color": "#fb923c", + "ring": "1p" + }, + "degoogle": { + "group": "Privat", + "color": "#60a5fa", + "ring": "1p" + }, + "bibliothek": { + "group": "Privat", + "color": "#7c6af7", + "ring": "1p" + }, + "aikb": { + "group": "Privat", + "color": "#4ade80", + "ring": "1w" + }, + "tiefgang": { + "group": "Musik", + "color": "#2dd4bf", + "ring": "1p" + }, + "mdimmusic": { + "group": "Musik", + "color": "#c084fc", + "ring": "1p" + }, + "droii": { + "group": "Musik", + "color": "#f87171", + "ring": "1p" + }, + "soloprojekt": { + "group": "Musik", + "color": "#fbbf24", + "ring": "1p" + }, + "einzelunternehmer": { + "group": "Beruflich", + "color": "#4ade80", + "ring": "1p" + } + }, + "groups": [ + "Meta", + "Code", + "Beruflich", + "Web", + "Privat", + "Musik" + ] +} \ No newline at end of file diff --git a/index.html b/index.html index c909cd2..ab9dad1 100644 --- a/index.html +++ b/index.html @@ -400,12 +400,7 @@ body { background:var(--bg); color:var(--text); font-family:-apple-system,BlinkM