docs: unique filenames in changelog, help page, README and llms.txt

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNhLunz586g6DeYMa7Qsd1
This commit is contained in:
tillandClaude Opus 5 committed 2026-09-01 02:17:17 +00:00
1 parent f695554e5d
commit f8d247fcce
5 files changed
+91 -1

No files matched your search

+36
View File
@@ -2,6 +2,42 @@
All notable changes to Klarbild are documented here. Newest first. All notable changes to Klarbild are documented here. Newest first.
## 2026-08-21 — Unique, chronologically sortable filenames
### Fixed
- **Pictures overwrote each other at Picdrop.** Two badges of the same person in the
same format on the same day both came out as `2026-07-23_lea_the-frame.png`, so the
second upload silently replaced the first. Reported from real use — Till lost images
this way. The name now carries the time down to the second plus a short tag derived
from the item id:
2026-08-20_143207_lea-badge_the-frame_a3f9.jpg
Two pictures can no longer collide: the tag comes from the item id, which is unique.
A belt-and-braces loop appends `-2`, `-3` … if a name is somehow still taken —
deliberately a code loop rather than a UNIQUE constraint, because a rejected write
would fail an already-paid AI job at the very last step.
### Added
- **Backfill for the existing library** (Admin → Dateinamen). Preview first — it reports
how many names are currently duplicated — then apply. It re-stamps from `created_at`
and the item id while keeping the motif and format already chosen, so it is idempotent:
a second run changes nothing. Stored files are untouched; they live under their id,
not their name.
- **Re-deliver everything** under the new name, for copies already sitting at Picdrop.
The old files stay where they are — deleting a customer's files automatically is the
wrong reflex; that stays a manual decision.
### Changed
- Timestamps use **Europe/Berlin** (override with `KLARBILD_TZ`) rather than UTC. A
picture taken at 00:30 should not be dated to the previous day.
- Naming moved into `src/lib/naming.ts` — dependency-free, like `printlayout.ts`, so the
rules are testable and identical in every path (jobs, Telegram, MCP, backfill).
The generator strips its own stamp when a result is fed back in as a source, so
re-processing cannot accumulate timestamps.
- 17 new tests (56 total), including the reported bug as an explicit regression test and
a check that lexicographic sorting equals chronological sorting across a DST boundary.
## 2026-08-20 — Oversize sheets, duplicate images, free labelling, new layout ## 2026-08-20 — Oversize sheets, duplicate images, free labelling, new layout
### Added ### Added
+6 -1
View File
@@ -52,7 +52,12 @@ Migrationen und Seeds laufen beim Serverstart automatisch. Erststart-Passwörter
(sharp + pdf-lib). Browser-Vorschau und Server-PDF benutzen denselben Rechenkern. (sharp + pdf-lib). Browser-Vorschau und Server-PDF benutzen denselben Rechenkern.
Auch per Telegram („🖨 Drucken") und MCP (`exact_size`, `print_sheet`). Auch per Telegram („🖨 Drucken") und MCP (`exact_size`, `print_sheet`).
Öffentliche Vorstellungsseite ohne Login: `/vorstellung`. Öffentliche Vorstellungsseite ohne Login: `/vorstellung`.
- **Admin:** Key/Picdrop/Modelle/Nutzer/Kostendeckel/Presets/Speicherverwaltung, Picdrop-Diagnose. - **Dateinamen (`src/lib/naming.ts`, abhängigkeitsfrei):** `JJJJ-MM-TT_HHMMSS_<motiv>_<format>_<kürzel>.<ext>`,
z. B. `2026-08-20_143207_lea-badge_the-frame_a3f9.jpg`. Zeitstempel vorn → jede Dateiliste sortiert
chronologisch; Kürzel aus der Item-ID → zwei Bilder können sich beim Ausliefern **nicht mehr überschreiben**.
Zeitzone `KLARBILD_TZ` (Standard `Europe/Berlin`). Nachbenennung der Bibliothek und erneute Auslieferung
im Admin unter „Dateinamen" (`src/lib/renames.ts`), idempotent.
- **Admin:** Key/Picdrop/Modelle/Nutzer/Kostendeckel/Presets/Speicherverwaltung, Dateinamen, Picdrop-Diagnose.
## Datenmodell / Migrationen ## Datenmodell / Migrationen
Nummerierte SQL in `migrations/`, beim Start automatisch (kein ORM-Push). Wichtige Spalten: Nummerierte SQL in `migrations/`, beim Start automatisch (kein ORM-Push). Wichtige Spalten:
+14
View File
@@ -56,6 +56,14 @@ import Base from '../layouts/Base.astro';
<li><b>Mehrere auf einmal</b>: Bilder markieren, dann als <b>ZIP laden</b> oder gesammelt <b>in einen Ordner</b> <li><b>Mehrere auf einmal</b>: Bilder markieren, dann als <b>ZIP laden</b> oder gesammelt <b>in einen Ordner</b>
verschieben.</li> verschieben.</li>
</ul> </ul>
<p class="hinweis"><b>Dateinamen sind eindeutig.</b> Jedes Ergebnis heißt
<code>JJJJ-MM-TT_HHMMSS_motiv_format_kürzel</code>, also z. B.
<code>2026-08-20_143207_lea-badge_the-frame_a3f9.jpg</code>. Weil Datum und Uhrzeit vorn stehen,
sortiert jede Dateiliste — Picdrop, NAS, Finder — von allein chronologisch. Das Kürzel am Ende stammt
aus der Kennung des Bildes: <b>zwei Bilder können sich beim Ausliefern nicht mehr überschreiben</b>,
auch wenn du am selben Tag zweimal dasselbe Motiv im selben Format erzeugst.
(Vor dem 21.08.2026 war das anders — dort ging in so einem Fall das erste Bild verloren.
Unter <b>Admin → Dateinamen</b> lässt sich die vorhandene Bibliothek nachträglich umbenennen.)</p>
</section> </section>
<section> <section>
@@ -155,6 +163,12 @@ import Base from '../layouts/Base.astro';
<p>Im Admin-Bereich lässt sich eine <b>zweite Sicherung aufs NAS</b> einrichten (SFTP/FTPS, auch über <p>Im Admin-Bereich lässt sich eine <b>zweite Sicherung aufs NAS</b> einrichten (SFTP/FTPS, auch über
Tailscale) — jedes fertige Bild wird dann zusätzlich gespiegelt und in der Bibliothek mit <b>„NAS ✓"</b> Tailscale) — jedes fertige Bild wird dann zusätzlich gespiegelt und in der Bibliothek mit <b>„NAS ✓"</b>
markiert. Mit <b>„Alle vorhandenen Bilder aufs NAS sichern"</b> lassen sich auch ältere Bilder nachsichern.</p> markiert. Mit <b>„Alle vorhandenen Bilder aufs NAS sichern"</b> lassen sich auch ältere Bilder nachsichern.</p>
<p>Unter <b>„Dateinamen"</b> lässt sich die vorhandene Bibliothek auf das eindeutige Namensschema bringen.
<b>„Bibliothek prüfen"</b> zeigt zuerst, was sich ändern würde und wie viele Namen aktuell doppelt vergeben
sind; <b>„Jetzt umbenennen"</b> setzt es um. Die Bilddateien selbst bleiben dabei unangetastet — sie liegen
im Speicher unter ihrer Kennung, nicht unter ihrem Namen. Ein zweiter Lauf ändert nichts mehr.
<b>„Erneut ausliefern"</b> lädt danach alle schon ausgelieferten Bilder unter dem neuen Namen erneut hoch;
die alten Dateien bleiben bei Picdrop liegen und räumst du dort selbst weg.</p>
<p>Zum Aufräumen gibt es <b>„Bibliothek &amp; Aufträge zurücksetzen"</b>: löscht alle Bilder, Aufträge und Ordner <p>Zum Aufräumen gibt es <b>„Bibliothek &amp; Aufträge zurücksetzen"</b>: löscht alle Bilder, Aufträge und Ordner
(Nutzer, Einstellungen, Modelle und Rezepte bleiben) — mit Sicherheitsabfrage. Am besten vorher einmal (Nutzer, Einstellungen, Modelle und Rezepte bleiben) — mit Sicherheitsabfrage. Am besten vorher einmal
aufs NAS sichern.</p> aufs NAS sichern.</p>
+22
View File
@@ -9,6 +9,28 @@ import Base from '../layouts/Base.astro';
</div> </div>
<p class="lead">Was in Klarbild neu ist. Neueste Änderungen oben.</p> <p class="lead">Was in Klarbild neu ist. Neueste Änderungen oben.</p>
<section>
<div class="ver"><span class="tag">21.08.2026</span><h2>Eindeutige Dateinamen — Bilder überschreiben sich nicht mehr</h2></div>
<ul>
<li><b>Behoben: Bilder haben sich bei Picdrop gegenseitig überschrieben.</b> Wer am selben Tag zweimal
dasselbe Motiv im selben Format erzeugt hat — etwa zwei Badges —, bekam zweimal denselben Dateinamen
(<code>2026-07-23_lea_the-frame.png</code>). Beim Ausliefern ersetzte das zweite Bild dann stillschweigend
das erste. Das kann jetzt nicht mehr passieren.</li>
<li><b>Der neue Name:</b> <code>2026-08-20_143207_lea-badge_the-frame_a3f9.jpg</code> — also Datum, Uhrzeit
auf die Sekunde, Motiv, Format und ein kurzes Kürzel. Weil der Zeitstempel vorn steht, sortiert
<b>jede Dateiliste von allein chronologisch</b> — bei Picdrop, im Finder, auf dem NAS. Das Kürzel stammt
aus der Bild-Kennung und ist damit garantiert eindeutig.</li>
<li><b>Uhrzeit in deutscher Zeit</b>, nicht in UTC. Ein Bild von 0:30 Uhr trägt jetzt das richtige Datum
und nicht mehr das des Vortags.</li>
<li><b>Rückwirkend für die ganze Bibliothek:</b> Unter <b>Admin → Dateinamen</b> zeigt „Bibliothek prüfen"
erst an, was sich ändern würde (samt der Zahl der aktuell doppelt vergebenen Namen); „Jetzt umbenennen"
setzt es um. Die Bilddateien selbst bleiben dabei unangetastet. Ein zweiter Lauf ändert nichts mehr.</li>
<li><b>„Erneut ausliefern"</b> lädt alle schon ausgelieferten Bilder unter dem neuen Namen erneut hoch.
Die alten Dateien bleiben am Ziel liegen — die räumst du bei Picdrop selbst weg, damit nichts
versehentlich beim Kunden verschwindet.</li>
</ul>
</section>
<section> <section>
<div class="ver"><span class="tag">20.08.2026</span><h2>Übergroße Bilder, Bild duplizieren, freie Beschriftung &amp; neuer Aufbau</h2></div> <div class="ver"><span class="tag">20.08.2026</span><h2>Übergroße Bilder, Bild duplizieren, freie Beschriftung &amp; neuer Aufbau</h2></div>
<ul> <ul>
+13
View File
@@ -120,6 +120,19 @@ Werkzeug \`klarbild\` (mcp/klarbild-mcp.mjs), nutzt denselben API-Token:
- exact_size — OHNE KI: ein Bild exakt auf ein Maß bringen, Datei lokal speichern. - exact_size — OHNE KI: ein Bild exakt auf ein Maß bringen, Datei lokal speichern.
- print_sheet — OHNE KI: Druckbogen (mehrere Bilder × Stückzahl, Schnittmarken) als PDF lokal speichern. - print_sheet — OHNE KI: Druckbogen (mehrere Bilder × Stückzahl, Schnittmarken) als PDF lokal speichern.
## Dateinamen der Ergebnisse
Schema: \`JJJJ-MM-TT_HHMMSS_<motiv>_<format>_<kürzel>.<ext>\` — z. B. \`2026-08-20_143207_lea-badge_the-frame_a3f9.jpg\`.
- Der Zeitstempel steht vorn, deshalb sortiert jede Dateiliste (Picdrop, NAS, Finder) von allein chronologisch.
- Das vierstellige Kürzel stammt aus der Item-ID. Dadurch sind zwei Bilder **nie** namensgleich —
auch nicht bei gleichem Motiv, gleichem Format und gleichem Tag. (Vor dem 21.08.2026 fehlten Uhrzeit
und Kürzel; gleichartige Bilder desselben Tages überschrieben sich beim Ausliefern.)
- Zeitzone: \`KLARBILD_TZ\`, Standard \`Europe/Berlin\`.
- Motiv wird aus dem Ursprungsnamen geschält (Datum, UUIDs und der eigene Stempel fallen weg);
generische Namen wie \`IMG\`, \`foto\`, \`telegram\` werden zu \`klarbild\`.
- Nachbenennung der ganzen Bibliothek: Admin → „Dateinamen" bzw.
\`POST /api/admin/storage { action: 'rename_preview' | 'rename_apply' | 'redeliver_all' }\` (nur per Login-Session,
nicht per API-Token). Idempotent — Stempel aus \`created_at\`, Kürzel aus der Item-ID.
## Auslieferung ## Auslieferung
- Picdrop = SFTP/FTPS-Ziel; Galerie = Unterordner unter dem Basispfad. Voller Pfad = Basisordner + Galerie - Picdrop = SFTP/FTPS-Ziel; Galerie = Unterordner unter dem Basispfad. Voller Pfad = Basisordner + Galerie
(wird erst beim Ausliefern zusammengesetzt). Standard-Galerie „POSTER LEA"; „The Frame" → „TheFrame-Backgrounds". (wird erst beim Ausliefern zusammengesetzt). Standard-Galerie „POSTER LEA"; „The Frame" → „TheFrame-Backgrounds".