diff --git a/.planning/.continue-here.md b/.planning/.continue-here.md
new file mode 100644
index 0000000..804656d
--- /dev/null
+++ b/.planning/.continue-here.md
@@ -0,0 +1,48 @@
+---
+context: default
+phase: quick-auftraege-1.5.x (keine GSD-Phase)
+task: 4
+total_tasks: 4
+status: in_progress
+last_updated: 2026-09-28T21:22:36.713Z
+---
+
+# BLOCKING CONSTRAINTS — Read Before Anything Else
+
+- [ ] CONSTRAINT: "Eigene Module" NICHT pushen — User hat ausdruecklich "pushe aber noch nicht" gesagt. Nur lokal committen.
+- [ ] CONSTRAINT: Browser-Pruefungen im Dunkelmodus (Theme-Knopf der Kopfzeile, nicht classList).
+
+**Do not proceed until all boxes are checked.**
+
+## Critical Anti-Patterns
+
+| Pattern | Description | Severity | Prevention Mechanism |
+|---------|-------------|----------|---------------------|
+| Alpha ohne Neuerstellung | `pull` allein startet die Container nicht neu; alpha nutzt `docker-compose.prod.yml` | advisory | User den Befehl mit `-f docker-compose.prod.yml ... up -d --force-recreate web api` geben; Version per `ssh root@192.168.13.12 curl localhost:3001/health/version` pruefen |
+| Playwright-Klick direkt nach Laden | erster Klick auf den Stift in der Kopfzeile griff nicht (Hydration) | advisory | nach dem Laden kurz warten bzw. Klick wiederholen und per Zustand pruefen |
+
+
+Drei Freigaben heute: v1.5.0 (Design Mosaik + Hintergrund in DB), v1.5.1 (Dashboard-Aktionen in der App-Leiste), v1.5.2 (Widget-Titel ausblendbar, Seitenleiste gegliedert). main = live = 12eea33, Arbeitsbaum sauber. Beim Pausieren liefen CI 434-439 (1.5.1 + 1.5.2), noch nicht bestaetigt. Naechster Auftrag "Eigene Module" noch nicht begonnen (Planner vor dem Schreiben gestoppt).
+
+
+
+- 260928-ujj: Design Mosaik gemergt (9fa0a3f), User.dashboardBackground + PATCH /users/me/dashboard-background, CHANGELOG/Doku, v1.5.0 (03026d6), CI 431-433 gruen, Live bestaetigt v1.5.0
+- v1.5.1 (bdaa3c8): HEADER_ACTIONS_SLOT_ID, Dashboard-Aktionen per Portal in die Kopfzeile, .btn-appbar
+- v1.5.2 (12eea33): hideTitle je Widget (Schalter neben Griff, setWidgetConfig im Store, CSS data-hide-title), Seitenleiste Kategorien text-sm/h-8, Module 13px/h-8; web 955 Tests gruen
+
+
+
+- CI 434-439 pruefen, User melden -> alpha/live ziehen
+- Eigene Module (quick 260928-wg3, nicht pushen): Admin-Verwaltung (Name, https-URL, Kategorie), Prisma-Modell CustomModule + Migration mit RLS (Muster DashboardImage/ProxmoxServer, RLS-Inventartest + docs/mandantentrennung-zugriffsklassifikation.md), GET fuer alle, POST/PATCH/DELETE Admin, Seitenleisten-Eintrag unter Kategorie, Seite /modules/custom/[id] mit Vollbild-iframe wie XFrame + "In neuem Tab oeffnen", de/en-Texte, CHANGELOG "Unveröffentlicht" -> Neu, Tests, Dunkelmodus-Browserpruefung
+- Offene Frage an User: Klon ~/projects/tessera-design und Stack Port 3100 aufraeumen?
+
+
+
+- Eigene Module sichtbar fuer alle; Gruppenbeschraenkung nur bei geringem Aufwand
+- hideTitle nur in der Ansicht wirksam
+- Seitenleisten-Aenderung ungefragt in 1.5.2 mitgenommen (klein)
+
+
+
+CI-Status holen (Gitea-API localhost:3002, Token aus pushurl, nie ausgeben), dann /gsd-quick "Eigene Module ..." starten.
+
diff --git a/.planning/HANDOFF.json b/.planning/HANDOFF.json
new file mode 100644
index 0000000..ebf9846
--- /dev/null
+++ b/.planning/HANDOFF.json
@@ -0,0 +1,34 @@
+{
+ "version": "1.0",
+ "timestamp": "2026-09-28T21:22:36.713Z",
+ "phase": null,
+ "phase_name": "Quick-Auftraege nach Freigabe 1.5.x (keine GSD-Phase)",
+ "phase_dir": null,
+ "plan": null,
+ "task": 4,
+ "total_tasks": 4,
+ "status": "paused",
+ "completed_tasks": [
+ {"id": 1, "name": "Design Mosaik nach main + Hintergrund pro Benutzer in DB (quick 260928-ujj), Freigabe v1.5.0", "status": "done", "commit": "9fa0a3f..03026d6"},
+ {"id": 2, "name": "Dashboard-Aktionen (Bearbeiten-Stift, Hintergrund, Widget hinzufuegen, Fertig) per Portal in die App-Leiste, Freigabe v1.5.1", "status": "done", "commit": "bdaa3c8"},
+ {"id": 3, "name": "Widget-Titel je Widget ausblenden (hideTitle) + Seitenleiste Kategorien groesser/Module kleiner, Freigabe v1.5.2", "status": "done", "commit": "12eea33"}
+ ],
+ "remaining_tasks": [
+ {"id": 4, "name": "Eigene Module (quick 260928-wg3): Seitenleisten-Eintrag, der eine externe Seite per iframe einbindet; NICHT pushen", "status": "not_started"}
+ ],
+ "blockers": [],
+ "async_jobs": [],
+ "human_actions_pending": [
+ {"action": "CI-Laeufe 434-439 (1.5.1 und 1.5.2) auf gruen pruefen; danach User Bescheid geben, dass alpha und live gezogen werden koennen", "context": "Beim Pausieren liefen 434 (main 1.5.1), 435-439 in der Warteschlange; Runner arbeitet einen Auftrag nach dem anderen", "blocking": false},
+ {"action": "User zieht alpha und live neu. Alpha nutzt docker-compose.prod.yml: 'docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d --force-recreate web api'", "context": "Beim ersten Versuch lief alpha weiter auf 3fc33e3, weil Container nicht neu erstellt wurden", "blocking": false}
+ ],
+ "decisions": [
+ {"decision": "Eigene Module: Admin legt an (Name, https-Adresse, Kategorie), sichtbar fuer alle Benutzer; Gruppen-Beschraenkung nur, wenn ModuleGrant/Gruppen das mit wenig Aufwand hergeben", "rationale": "User ist kein Programmierer; einfachster sinnvoller Weg", "phase": "quick"},
+ {"decision": "Eigene Module: iframe wie XFrame (sandbox ohne allow-top-navigation, no-referrer, nur https) plus immer 'In neuem Tab oeffnen'", "rationale": "viele Seiten verweigern das Einbetten", "phase": "quick"},
+ {"decision": "hideTitle gilt nur in der Ansicht; im Bearbeitungsmodus bleibt der Titel sichtbar", "rationale": "Titel bleibt editierbar, Schalter verstaendlich", "phase": "quick"},
+ {"decision": "Browser-Pruefungen im Dunkelmodus", "rationale": "Wunsch des Users 28.09.", "phase": "quick"}
+ ],
+ "uncommitted_files": [],
+ "next_action": "CI 434-439 pruefen und User melden; dann /gsd-quick fuer 'Eigene Module' neu starten (quick_id 260928-wg3 war vergeben, Planner wurde vor dem Schreiben gestoppt) — Planner-Auftrag siehe .continue-here.md",
+ "context_notes": "main = live = origin = 12eea33 (v1.5.2). Lokaler Stack :3000/:3001 laeuft mit 1.5.2-Stand; lokaler Admin hat Hintergrund Duenen und ausgeblendete Titel an Kalender/Notiz (Testreste). Klon ~/projects/tessera-design + Stack :3100/:3101 noch vorhanden, Aufraeumen nur auf Rueckfrage (Frage an User offen). Biome-Altbefunde in page.tsx/header.tsx/sidebar.tsx/dashboard-store.ts existierten vorher, keine neuen."
+}