# Fahrplan Acht Meilensteine. Jeder endet mit einer lauffähigen Version auf `main`, grünen Prüfungen, aktueller Dokumentation und einem Eintrag im DEVLOG. | Meilenstein | Ziel | Status | | --------------------------------------- | ---------------------------- | -------- | | [M1](#m1--fundament) | Fundament | erledigt | | [M2](#m2--aufgaben-und-projekte) | Aufgaben und Projekte | erledigt | | [M3](#m3--kalender-lesen) | Kalender lesen | erledigt | | [M4](#m4--wochenplanung-und-zeitblöcke) | Wochenplanung und Zeitblöcke | erledigt | | [M5](#m5--benachrichtigungen) | Benachrichtigungen | erledigt | | [M6](#m6--integrationen) | Integrationen | erledigt | | [M7](#m7--schnellerfassung-und-api) | Schnellerfassung und API | erledigt | | [M8](#m8--mcp) | MCP | geplant | --- ## M1 – Fundament **Erledigt am 10.09.2026 mit Version 0.1.0.** **Ziel:** Ein angemeldeter, betreibbarer Rumpf. Noch keine Aufgaben, kein Kalender — aber alles, worauf die späteren Meilensteine aufsetzen. - [x] Projektgerüst: Next 16, React 19, TypeScript strict, Tailwind 4 - [x] `npm run pruefen`: Prettier, ESLint, tsc, Vitest, ShellCheck - [x] Datenmodell für Anmeldung, Passkeys, Bereiche und Audit - [x] Anmeldung über OIDC, Passkey und wahlweise Passwort - [x] Rollen `BENUTZER` und `ADMIN`, serverseitig in Seite **und** Server Action - [x] Audit-Eintrag je schreibender Aktion, Details werden gesäubert - [x] Instanzsteuerung `INSTANZ=firma|daheim` mit 404 statt Hinweis - [x] Bereiche verwalten: Farbe, Arbeitsfenster, Tageskapazität - [x] Protokollseite für die Verwaltung - [x] `/api/health` mit Status, Version und Instanz - [x] Dockerfile, Compose-Stapel mit eigenem Migrationsdienst - [x] `backup.sh`, `update.sh`, `scripts/release.sh`, `scripts/zeit.sh` - [x] Unit-, Integrations-, Migrations- und E2E-Tests - [x] Screenshot-Kette mit eigener Wegwerf-Instanz - [x] README, Schnellstart, Handbuch, CHANGELOG, DEVLOG **Bewusst verschoben:** `Aufgabe` und `Zeitblock` kommen mit M2 und M4, `Kalenderkonto` mit M3 — jeweils mit den Feldern, die der Provider dann wirklich braucht, statt heute geraten. ## M2 – Aufgaben und Projekte **Erledigt am 10.09.2026 mit Version 0.2.0.** **Ziel:** Alles erfassen und wiederfinden, noch ohne Kalender. - [x] `Aufgabe` mit Typ, Status, Priorität, Aufwand, Fälligkeit, Quelle - [x] Eindeutigkeit `[quelle, quelleRef]`, Integrationen upserten - [x] Inbox: schnell erfassen, später einsortieren - [x] Ideen getrennt von Aufgaben - [x] Projekte mit Arbeitspaketen und Meilensteinen - [x] Listen mit Filtern nach Bereich, Status und Fälligkeit - [x] Handbuchseiten und Bilder **Bewusst offen gelassen:** Kein Wiederholungsrhythmus für Aufgaben und keine Verknüpfung von Aufgaben untereinander — beides steht unter „Ideen für später" und wartet darauf, ob es im Alltag wirklich fehlt. ## M3 – Kalender lesen **Erledigt am 10.09.2026 mit Version 0.3.0.** **Ziel:** Termine aus Microsoft 365 und Google sehen. - [x] `Kalenderkonto` mit Anbieter, Tokens und Delta-Verweis - [x] OAuth-Verbindung je Instanz: Graph immer, Google nur daheim - [x] Graph-Delta-Sync und Google-Sync über `fetch`, Antworten mit zod geprüft - [x] Ganztägige Termine zählen nicht zur Belegung - [x] Anonymisierte Beispielantworten in `test/fixtures/` - [x] Hintergrundjob mit node-cron ## M4 – Wochenplanung und Zeitblöcke **Erledigt am 11.09.2026 mit Version 0.4.0.** **Ziel:** Aufgaben per Ziehen und Ablegen in den Kalender schreiben — und Verschiebungen von dort zurückholen. - [x] `Zeitblock` an genau einer Aufgabe und einem Kalenderkonto - [x] Wochenansicht mit `@dnd-kit/core` - [x] Schreiben in den Kalender, Rückweg beim Verschieben - [x] Schleifenschutz über `hash = sha256(startISO|endeISO)` - [x] Konflikte: der Kalender gewinnt (HTTP 412 auf If-Match) - [x] Belegung gegen die Tageskapazität des Bereichs **Bewusst offen gelassen:** Die Dauer lässt sich nicht am Balken ziehen, und ein Zeitblock landet immer im ersten verbundenen Kalender. Beides steht unter "Ideen für später" — erst zeigt der Alltag, ob es wirklich fehlt. ## M5 – Benachrichtigungen **Erledigt am 11.09.2026 mit Version 0.5.0.** **Ziel:** Sagen, was ansteht — und dabei so selten stören, dass niemand auf die Idee kommt, alles abzuschalten. - [x] Web-Push mit `web-push`, Anmeldung je Browser - [x] Tagesüberblick per E-Mail über nodemailer - [x] Erinnerungen an Fälligkeiten und vor Zeitblöcken, Jobs über node-cron - [x] Je Benutzer einstellbar, mit Ruhezeiten über Mitternacht - [x] Wiederholungssperre je Anlass, Sache und Tag - [x] Abgleichfehler erst nach mehreren Versuchen hintereinander **Bewusst offen gelassen:** Keine Sammelmeldung mehrerer Anlässe in einer Nachricht und kein Nachholen dessen, was in die Ruhezeit fiel. Eine Erinnerung an einen Zeitblock, der längst begonnen hat, hilft niemandem. ## M6 – Integrationen **Erledigt am 12.09.2026 mit Version 0.6.0.** **Ziel:** Aufgaben dort abholen, wo sie entstehen — ohne dass die Planung darunter leidet, die hier passiert. - [x] Gemeinsame Aufnahmestelle: jede Integration liefert nur Funde - [x] Zammad (nur `firma`), lesend - [ ] **Wartungsplaner-API** — Schnittstelle steht noch nicht fest - [x] Telegram (nur `daheim`): erfassen, melden, abhaken - [x] Spiegel: `firma` sendet, `daheim` empfängt - [x] Jede Integration upsertet über `[quelle, quelleRef]` **Offen geblieben:** Der **Wartungsplaner** ist nicht angebunden. Die Aufnahmestelle steht bereit und die Seite „Integrationen" führt ihn als sichtbare Lücke; es fehlt allein das Abholen, und dafür muss erst feststehen, was das Produkt an Schnittstelle hergibt. **Bewusst offen gelassen:** Zammad wird nur gelesen. Ein Ticket schließt man im Ticketsystem — sonst weiß die Kollegin nicht, warum es plötzlich zu ist. ## M7 – Schnellerfassung und API **Erledigt am 12.09.2026 mit Version 0.7.0.** **Ziel:** Etwas festhalten können, wo man gerade steht — und andere Anwendungen hereinlassen, ohne ihnen die Schlüssel zum ganzen Haus zu geben. - [x] Erfassung vom Handy, auch offline - [x] Öffentliche API mit Token je Anwendung - [x] Rechte je Token, jede schreibende Nutzung im Protokoll - [x] Als App ablegbar (Manifest, eigenes Symbol) **Offen geblieben:** Die Bilder der Erfassungsseite im Handbuch zeigen noch eine falsche Inbox-Zahl; der Fehler selbst ist behoben, nur der Bildlauf kam danach nicht mehr durch. **Bewusst offen gelassen:** Die Schnittstelle kann keine Bereiche, Projekte oder Zeitblöcke anfassen und nichts löschen. Was von außen kommt, landet in der Inbox; die Einordnung bleibt bei dem, der plant. Auch eine Begrenzung der Aufrufzahl gibt es nicht — bei einer Handvoll eigener Tokens wäre sie mehr Zeremonie als Schutz. ## M8 – MCP - [ ] MCP-Server über `@modelcontextprotocol/sdk` - [ ] Lesen und Anlegen von Aufgaben und Zeitblöcken - [ ] Rechte wie bei der API, jede Nutzung im Protokoll --- ## Ideen für später - Auswertung: wie viel Zeit ging tatsächlich in welchen Bereich - Wiederkehrende Aufgaben mit eigenem Rhythmus - Vorlagen für wiederkehrende Projekte - Verknüpfung von Aufgaben untereinander (blockiert, gehört zu) - Export der eigenen Daten als JSON ## Bewusst nicht geplant - **Wiederkehrende Wartungsaufgaben mit Nachweispflicht.** Die bleiben im Wartungsplaner. Der Planer liest nur Fälligkeiten über dessen API. - **Mehrbenutzerbetrieb mit geteilten Aufgaben.** Der Planer ist für eine Person gedacht; Kollegen melden sich in der Firmeninstanz nur an ihren eigenen Daten an. - **Eigene Kalenderdarstellung als Ersatz für Outlook.** Der Planer schreibt in die vorhandenen Kalender, er ersetzt sie nicht. - **Zeiterfassung zur Abrechnung.** Dafür gibt es andere Werkzeuge.