Löschen in der Bibliothek entfernte Zeile und Ergebnisdatei sofort. Ein Fehlklick, und ein Ergebnis war weg — samt dem, was es gekostet hat. Jetzt landet es im Papierkorb: - weg aus Bibliothek, Freigabelinks, ZIPs, Auslieferung, NAS-Spiegel, Druckquellen und Druckverlauf; beim Wiederherstellen unverändert zurück - „Rückgängig" im Hinweis, Papierkorb-Ansicht mit Resttagen, Wiederherstellen, endgültig löschen, leeren - die Wartung räumt nach settings.trash_days (Standard 30, Admin -> Speicher) endgültig ab; 0 schaltet den Papierkorb aus - ein Bild, das noch in der Warteschlange wartet, wird nicht mehr erzeugt (und nicht bezahlt) - endgültig gelöscht wird nur, was kein anderes Bild mehr nutzt — Alternativen teilen ihre Quelle mit dem Original, auch Kombinieren- Quellen in source_paths (jsonb) Beim Durchgehen jeder Abfrage auf items fiel auf: Nur die Datei-Route prüfte, wer ein Bild sehen darf. Umbenennen, Löschen, Wiederholen, Alternative, Weiterbearbeiten und die Auswahl-ZIP nahmen jede Kennung von jedem Konto. Jetzt gilt eine Regel (src/lib/itemaccess.ts): sehen, was einem gehört oder in der geteilten Bibliothek liegt, ändern nur Eigenes; Admins alles. Für Till ändert sich nichts. Lea kann fremde Bilder in der geteilten Bibliothek weiter sehen, aber nicht mehr löschen. Dazu Favicon und Homebildschirm-Symbol, Hilfe und Changelog-Seite. Geprüft gegen echtes Postgres mit zwei Konten und echten Dateien: 35 Ende-zu-Ende-Prüfungen bestanden, Oberfläche im Browser (Löschen, Rückgängig, Papierkorb, Wiederherstellen, 390 px ohne Querlauf). 128 Tests, Typprüfung 0 Fehler.
3.2 KiB
CLAUDE.md — Klarbild
Arbeitsanweisung für den bauenden Agenten. Führend: 01-anforderungen.md (Was),
06-technik-und-api.md (Wie), 03-datenmodell-api.md (Schema/Endpunkte),
07-repo-und-deployment.md (Struktur/Deploy). Diese Docs liegen im Handover-Ordner
Imagetool-Lea/ (00,01,03,06,07; 02/04/05 stehen noch aus).
Stack (fest)
Astro 7 (@astrojs/node 11, output: server) + React-Inseln · Postgres · S3 (MinIO) ·
pg-boss (Worker im selben Prozess, worker.ts) · sharp · grammY · argon2 · AES-256-GCM.
Kein Tailwind. OKLCH-Tokens in src/styles/tokens.css. Gitea → Coolify → Hetzner.
Konventionen
- Commits englisch,
feat:/fix:, ein Commit je Bauschritt (kein Riesen-Commit). - Migrationen als nummerierte SQL in
migrations/, beim Start automatisch (kein ORM-Push). - Niemals committen: OpenRouter-Key, Picdrop-Zugang, Telegram-Token, SESSION_SECRET.
Vor Push prüfen:
git log -p | grep -iE "sk-or-|password|token". - Bild-API:
POST https://openrouter.ai/api/v1/images(nicht chat/completions).aspect_ratiooderresolution, nie beides.background:"transparent"fürs Freistellen.usage.costje Position speichern → echter Kostendeckel. - Pipeline lokal mit sharp:
px = round(cm/2.54*dpi),fit:'cover', position:'attention',withMetadata({ density: dpi }). Sticker-Kontur aus Alpha (Dilatation), ohne Modell. - Fortschritt per Polling (2s) oder SSE, kein WebSocket.
Bau-Reihenfolge (je Schritt ein Commit)
- Fundament (fertig): Struktur,
001_init.sql, db/crypto/auth/storage/openrouter, Middleware,/api/health, Login, Seeds, Dockerfile, Tokens. - Bildkern:
pipeline.ts(sharp, Formatberechnung, Kontur),queue.ts+worker.ts(pg-boss), Verarbeitungskette je Position, Dateinamen-Vorschlag. - Studio-UI: Upload (Datei/DnD/Paste, HEIC, 100 Bilder), Rezept-Builder + Gültigkeitsregeln, Format + Beschnitt-Vorschau, Queue-Ansicht, Ergebnisse (Vorher/Nachher, Download/ZIP).
- Bibliothek/Ordner/Druck/Freigabelinks.
- Picdrop (
picdrop.tsFTPS/SFTP) + Sticker-Kontur. - Admin (Key/Picdrop/Modelle/Nutzer/Statistik/Kostendeckel/Voreinstellungen).
- Telegram (
telegram.tsgrammY-Webhook) — vollwertiger Website-Ersatz. - Tutorial/How-to (Seite + PDF), PWA.
- Deploy + 10 Nachweise (07 §6) + Reviews (design-taste-frontend, ui-ux-design-pro, code-review).
Infra (angelegt)
- Repo:
till/klarbild(privat, Gitea). - Coolify-Projekt klarbild
g7qykmucnh9kckoqvjnppgsq, Env productionv653gw0as7ty44p87m2aj7vz, Server CX33. - Postgres
nrddt6fyb86lok7nojjcb57v(DB/Userklarbild), interner Host = DB-UUID:5432. - MinIO: als Compose-Dienst (steht noch aus, S3_* in .env).
- Telegram-Token vorhanden (Prototyp @Klarbildbot läuft per Polling bis Umschaltung auf Webhook).
Nachweis „fertig" (07 §6) — erst danach „lauffähig" melden
docker build ok · /api/health grün · beide Logins, Lea ohne /admin · Poster 30×40 = exakt 3543×4724 @300dpi · Sticker mit Alpha + weißer Kontur · 20er-Stapel überlebt Browser-Neustart · Position einzeln wiederholbar · Picdrop-Test grün · 20 Bilder an Bot → ein Auftrag, eine Rückmeldung · Kostendeckel greift.