---
context: default
phase: null
task: null
total_tasks: null
status: paused
last_updated: 2026-09-22T14:15:00.000Z
---
Kein laufender Meilenstein. Alle 18 Phasen sind abgeschlossen; seit der Freigabe
1.2.0 laeuft die Arbeit als Quick-Tasks. **Version 1.3.0 wurde am 22.09.2026
freigegeben** (Tag `v1.3.0` auf `d146234`, Abbilder `live` und `v1.3.0`,
Gitea-Release mit `Tessera-Setup-1.3.0.exe` und `Tessera-1.3.0.AppImage`).
`main == origin/main` auf `1315f37`, Arbeitsbaum sauber, CI gruen. Der lokale
Docker-Stack laeuft mit genau diesem Stand (web, api, db).
Unterbrochen wurde NICHT mitten in einer Aufgabe — alle acht Auftraege dieser
Sitzung sind fertig, nachgewiesen und gepusht. Der naechste Auftrag (Proxmox)
ist inhaltlich geklaert, wartet aber auf Zugangsdaten des Nutzers.
Diese Sitzung (21.09. abends bis 22.09. nachmittags):
- quick-260921-pi9 — Dashboard-Widget „Bilderrahmen" (Upload oder https-Adresse, Diashow, Grossansicht)
- quick-260921-qd3 — Dashboard-Widget „XFrame" (Webseite als Rahmen, Sandbox ohne Top-Navigation)
- quick-260922-frg — Tray-Update-Eintrag nennt den Grund einer fehlgeschlagenen Pruefung, Klick prueft erneut, Pruefung alle 4 h
- fast `747a4d4` — Download-Knoepfe im Desktop-Client oeffnen den System-Browser (waren ohne Funktion)
- quick-260922-ge2 — XFrame: Ausschnitt waehlen und einpassen, Zoom, „Nur anzeigen"
- **Freigabe 1.3.0** — CHANGELOG abgeschlossen, `live` vorgezogen, Tag gepusht, drei CI-Laeufe gruen
- quick-260922-hk4 — Bilderrahmen-Bilder in den Dateibereich `user-files` statt in die Datenbank, automatischer Umzug beim Start, Selbstheilung aus der alten Spalte
- quick-260922-m1h — Widget-Typen an EINER Stelle, Katalog aus der Registry + Modulfilter, Kachel kennt ihr Modul
Jeder Punkt wurde im Browser (Playwright-MCP) gegen den lokalen Stack geprueft;
die Pruefprotokolle stehen in den jeweiligen SUMMARY.md unter `.planning/quick/`.
1. **Proxmox-Modul** (PVE, PBS, PMG) — **nur beobachten**, keine Eingriffe.
Seite: Server anbinden, VMs/Container mit CPU, Arbeitsspeicher, Plattenplatz
und Erreichbarkeit; bei PBS Sicherungslaeufe und Pruefstatus, bei PMG die
Mail-Zahlen (zugestellt, gefiltert, blockiert, Quarantaene).
2. **Proxmox-Kachel** — kompakte Fassung ueber den neuen Weg (drei Stellen,
siehe unten). Vorschlag fuer den Inhalt steht in der Sitzung: Ampel je Server
+ drei Balken; PBS: Alter der letzten Sicherung, Pruefergebnis, freier Platz;
PMG: Tageszahlen in einer Zeile. Idee fuer spaeter: eine Sammelkachel
„Alles in Ordnung?" mit einer Zeile je Server.
- **Bilder auf die Festplatte, nicht in die Datenbank** — Grund ist die Sicherung
(`pg_dump` von Hand; 30 Bilder à 5 MiB je Benutzer waeren 150 MB pro Benutzer
im Abzug), nicht die Geschwindigkeit, und die Einheitlichkeit mit Avataren
(`user-files/avatars`) und DKV-Exporten.
- **Zweistufige Umstellung:** Spalte `data` bleibt vorerst stehen; `getBytes`
stellt eine fehlende Datei daraus wieder her. DROP erst, wenn alpha UND live
einmal mit dieser Version gelaufen sind — Todo liegt unter
`.planning/todos/pending/2026-09-22-dashboard-image-data-spalte-entfernen.md`.
- **Proxmox: nur beobachten**, Zugriff ueber die normale Modulfreigabe
(Nutzeransage 22.09.).
- **Kacheln gesperrter Module erscheinen gar nicht erst im Katalog**
(Nutzeransage 22.09.) — so umgesetzt in m1h.
- **Basic-Auth am Proxy vor alpha bleibt** (Nutzerentscheidung). Aus dem
Firmennetz greift eine Ausnahme; von aussen 401, und der Client sagt das seit
frg selbst. **Nicht erneut vorschlagen, das Thema ist entschieden.**
- Proxmox braucht Zugangsdaten und Serveradressen des Nutzers (API-Token, nur
lesend, z. B. Rolle `PVEAuditor`). Der Nutzer legt sie morgen an. Planung und
Modulskelett koennen vorher entstehen, die Anbindung nicht getestet werden.
## Required Reading (in order)
1. `.planning/quick/260922-m1h-dashboard-widgets-ein-modul-bringt-seine/260922-m1h-SUMMARY.md` — Abschnitt „So fuegt man kuenftig eine Modul-Kachel hinzu": drei Stellen statt sieben.
2. `docs/anleitung-entwicklung.md` — Modul-Walkthrough (Backend + Frontend) und der neue Abschnitt „Eine Kachel zum Modul".
3. `.planning/quick/260922-hk4-bilderrahmen-bilder-auf-die-festplatte/260922-hk4-SUMMARY.md` — Dateiablage, wenn das Proxmox-Modul jemals Dateien speichert.
4. `.planning/STATE.md` — Abschnitte „Current Position" und die letzten Zeilen der Quick-Tabelle.
## Critical Anti-Patterns (do NOT repeat these)
- [ANTI-PATTERN]: Planannahmen ueber den Bestand ungeprueft uebernehmen → m1h: der Plan
behauptete, `apps/web` importiere `@tessera/shared` bereits; es gab KEINE
Abhaengigkeit, und zwei Kommentare hielten das als Absicht fest. Der Executor
hat vor der ersten Zeile Code nachgemessen (Bau, Produktions-Abbild, natives
Type-Stripping unter `node:24-alpine`) statt der Annahme zu folgen.
**Mitigation:** jede Plan-Behauptung ueber vorhandene Abhaengigkeiten oder
Muster vor dem Umsetzen einmal am Code pruefen.
- [ANTI-PATTERN]: Vorschau und Darstellung mit unterschiedlichen Layoutmassen →
ge2: die Kachel nutzte eine andere Rahmenhoehe als die Vorschau, wodurch Seiten
mit fensterhoehen-abhaengigem Layout (`vh`) an anderer Stelle lagen als
ausgewaehlt. **Mitigation:** Auswahl und Darstellung immer gegen dieselben
Masse rechnen.
- [ANTI-PATTERN]: `position: fixed` in einer Dashboard-Kachel → pi9: die
Grossansicht blieb auf die Kachelflaeche beschraenkt, weil `react-grid-item`
eine CSS-`transform` traegt und damit zum Bezugsrahmen wird.
**Mitigation:** Overlays aus einer Kachel per `createPortal` in `document.body`
rendern (Muster: Kalender-Tooltip, jetzt auch `picture-frame-lightbox.tsx`).
- [ANTI-PATTERN]: Playwright klickt in einem per `transform` skalierten iframe
nicht → ge2. **Mitigation:** Klickpunkt umrechnen und per
`elementFromPoint` + `mouse.click` pruefen; ist eine Werkzeuggrenze, kein Produktfehler.
## Infrastructure State
- **Lokaler Stack:** `docker compose` mit web, api, db laeuft auf dem Stand
`1315f37` (`up -d --build` am 22.09. nachmittags). `up` allein baut NICHT neu.
DB ohne Host-Port — Prisma vom Host ueber die Container-IP
(`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' tessera-ctl-db-1`,
`tessera:tessera_dev`).
- **Testdaten lokal:** im Admin-Dashboard stehen ein Bilderrahmen (zwei Bilder)
und ein XFrame auf `example.com` mit Ausschnitt. Harmlos, darf bleiben.
- **alpha** (`alpha.tessera.ctl.de`) wurde am 22.09. auf `80a0d23` gezogen; die
spaeteren Commits (hk4, m1h) sind dort noch nicht drauf. Basic-Auth am Proxy
bleibt — von aussen 401, deshalb Messungen gegen alpha nur am Proxy vorbei
(auf dem Testserver `docker compose exec api` gegen `localhost:3001` oder
Host-Port 3000).
- **Live** (`tessera.ctl.de`) laeuft noch auf 1.2.0; der Pull auf 1.3.0 steht beim
Nutzer aus.
- **Desktop-Client:** neuester CI-Stempel `5aa577a` (Lauf 405). Der Nutzer muss
ihn einmal per Browser installieren, danach laeuft das Update ueber das Tray.
Die Sitzung war eine lange Kette kleiner, vollstaendig abgeschlossener Auftraege.
Der rote Faden am Ende: Der Nutzer will als naechstes ein Proxmox-Modul, das
zusaetzlich als Kachel auf dem Dashboard erscheint — und kuenftig sollen weitere
Module dasselbe tun. Deshalb wurde zuerst das Fundament geraeumt (m1h), damit
eine Modul-Kachel drei Handgriffe kostet statt sieben und Kacheln gesperrter
Module automatisch verschwinden. Das Geruest dafuer (`WIDGET_MODULE_SLUGS`,
serverseitiger Filter in `dashboard.service.ts`) ist vorhanden und noch leer;
Proxmox waere der erste Eintrag.
Fuer Proxmox selbst ist vorgemerkt: Serveradressen traegt nur ein Administrator
ein (damit ist die Adresse eine bewusste Freigabe statt beliebiger Eingabe), fuer
genau diese Adressen werden Zertifikatsfehler toleriert (Muster:
`favorites/icon-discovery.service.ts`, undici-Dispatcher — Nodes globales `fetch`
ignoriert ihn), Zugangsdaten verschluesselt per `CryptoService` (Muster
`ldap-config.service.ts`), Abfrage im Hintergrund je Mandant nach dem Muster
`dkv-scheduler.service.ts` (`onApplicationBootstrap`, nicht `onModuleInit`).
Start with: Proxmox-Modul planen (`/gsd-quick` mit eigenem Plan wie bei ge2/hk4) —
Datenmodell fuer Serverzugaenge (Adresse, Typ `pve|pbs|pmg`, verschluesselter
Token), Abfrage im Hintergrund je Mandant, Modulskelett nach
`docs/anleitung-entwicklung.md`, Seite mit Serverliste und Auslastung. Die
Kachel kommt danach als eigener kleiner Auftrag ueber den neuen Weg. Vorher beim
Nutzer abholen: Serveradressen und die lesenden API-Token.