Files
klarbild/CLAUDE.md
T
till 28a6049548 Papierkorb statt endgültigem Löschen, und Zugriffsregeln für jede Bild-Route
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.
2026-10-10 06:38:42 +00:00

3.2 KiB
Raw Blame History

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_ratio oder resolution, nie beides. background:"transparent" fürs Freistellen. usage.cost je 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)

  1. Fundament (fertig): Struktur, 001_init.sql, db/crypto/auth/storage/openrouter, Middleware, /api/health, Login, Seeds, Dockerfile, Tokens.
  2. Bildkern: pipeline.ts (sharp, Formatberechnung, Kontur), queue.ts + worker.ts (pg-boss), Verarbeitungskette je Position, Dateinamen-Vorschlag.
  3. Studio-UI: Upload (Datei/DnD/Paste, HEIC, 100 Bilder), Rezept-Builder + Gültigkeitsregeln, Format + Beschnitt-Vorschau, Queue-Ansicht, Ergebnisse (Vorher/Nachher, Download/ZIP).
  4. Bibliothek/Ordner/Druck/Freigabelinks.
  5. Picdrop (picdrop.ts FTPS/SFTP) + Sticker-Kontur.
  6. Admin (Key/Picdrop/Modelle/Nutzer/Statistik/Kostendeckel/Voreinstellungen).
  7. Telegram (telegram.ts grammY-Webhook) — vollwertiger Website-Ersatz.
  8. Tutorial/How-to (Seite + PDF), PWA.
  9. 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 production v653gw0as7ty44p87m2aj7vz, Server CX33.
  • Postgres nrddt6fyb86lok7nojjcb57v (DB/User klarbild), 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.