Files
kanban/defaults.json
Robin Choice 4f5e16a286 feat: replace localStorage with Bun/Hono API backend
- server.ts: Hono server with basic auth, GET/PUT/DELETE /api/* endpoints
- defaults.json: extracted board defaults from index.html
- Dockerfile: containerized for Coolify deployment
- index.html: all state-layer rewritten from localStorage to fetch API

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 19:13:13 +02:00

1520 lines
41 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"boards": {
"ringsystem": {
"name": "Ringsystem",
"goal": "Tool-agnostische Architektur — AGENTS.md kanonisch, CLAUDE.md/Codex/OpenCode als Symlinks. ARCHITECTURE.md definiert Ring 03.",
"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"
]
}