The critique found a functional bug I had shipped an hour earlier: the whole
e-mail configuration was never sent. `saveSettings` builds its body from a fixed
field list, and none of the smtp_* fields or share_default_days were in it, and
the password input had no state at all. Filling in the card and pressing save
lost everything while the toast said "Gespeichert." That card is the
precondition for password reset, job notifications and mailing share links, so
it would have looked like the whole feature was broken. Now sent, with the
password held separately like the other secrets, and a failed PATCH no longer
reports success.
The public page told recipients how to bypass "view only": the hint about
long-pressing to save was printed regardless of allow_download, two lines under
a caption saying "Nur ansehen". The backend takes that setting seriously enough
to withhold the original even for cutouts; the page undid it. Now the two cases
have separate copy, worded for Android as well as iOS, and the hint sits above
the grid where it is actually read rather than under twenty tiles.
The share dialog had two blue buttons in step two, the exact mistake DESIGN.md
records as having happened once before, and asked five questions before a link
existed when the common case ("one picture for grandma") needs none of them.
One blue button now, and the rarely-used settings collapse behind a summary
that states what currently applies.
/konto was unreachable on a phone: the only way in was the username in the top
bar, which is hidden below 480px. It is a tab bar entry now, with short labels
so eight items still fit at 390px (49x48px each).
Network failures rendered as content: a failed load showed "nothing shared yet"
alongside an invitation to share something, and /konto and /admin hung on
"loading" forever. All three have an error state with a retry now.
Also: the public page nested a second <main> inside the app shell and inherited
padding for a tab bar anonymous visitors never see; admin inputs were 14px, so
iOS zoomed on focus at tablet width; the admin had no media queries at all, so
"Postausgangsserver" got ~156px on a phone; "Jetzt umbenennen" was clickable
without the dry run PRODUCT.md requires; share_default_days did not reach the
dialog; partial mail success was coloured as failure by a regex on the message
text; the passphrase sheet ignored the home indicator; the privacy line claimed
"encrypted" for what is a salted hash.
Added PRODUCT.md and DESIGN.md, written from the code and the wiki rather than
invented, so future design work has something to be measured against.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNhLunz586g6DeYMa7Qsd1
3.8 KiB
Klarbild — Produktkontext
Zusammengetragen aus dem, was da ist:
README.md,src/styles/tokens.css, dem Wiki (Sammlung „Klarbild") und dem Verhalten der Anwendung. Keine Wunschbeschreibung.
register: product
Was es ist
Eine selbst gehostete Bildwerkstatt für einen Ein-Personen-Digitalbetrieb mit Familie. Zwei Hälften, die dieselbe Oberfläche teilen:
- Mit KI — Screenshots und Fundstücke bereinigen, freistellen, aufs Format bringen, kombinieren, neu erzeugen. Läuft über OpenRouter, kostet Geld, dauert.
- Ohne KI — Drucken: Bilder millimetergenau aufs physische Maß bringen und mehrere davon in 100-%-Größe mit Schnittmarken auf einen Bogen setzen. Reine Geometrie, kein Modell, keine Kosten, kein Warten.
Fertige Bilder gehen an Picdrop (Kundenauslieferung), aufs NAS (zweite Sicherung) und seit 08/2026 über Teilen-Links direkt an Menschen ohne Konto.
Wer es benutzt
- Till — Betreiber, Admin, baut es selbst. Arbeitet am Rechner und am Handy, oft zwischendurch. Erwartet, dass Maße stimmen und Dateien nicht verschwinden.
- Lea — nutzt es, ohne es warten zu wollen. Sagt Dinge wie „drucke das bitte in zwanzig mal dreißig". Für sie muss der Weg vom Bild zum Ergebnis kurz und selbsterklärend sein.
- Empfänger von Teilen-Links — Großeltern, Kunden. Bekommen einen Link per WhatsApp oder Mail, haben kein Konto, sind oft am Handy, und sollen ohne Erklärung verstehen, was zu tun ist. Können in Bezug auf Technik nichts vorausgesetzt bekommen.
Auf vielen Bildern sind Kinder. Das ist keine Randnotiz, sondern der Grund, warum Voreinstellungen zur Vorsicht neigen.
Ton
Deutsch, per Du, sachlich und knapp. Erklärt warum, nicht nur was. Keine Ausrufezeichen, keine Jubelsprache, keine Emoji in der Oberfläche (Telegram ausgenommen, dort tragen sie Funktion). Fehlermeldungen sagen, was zu tun ist, statt was kaputt ist.
Fachbegriffe werden benutzt, wo sie stimmen (Beschnittzugabe, Eckmarken, dpi) — und beim ersten Auftreten in einem Halbsatz erklärt. Das Werkzeug spricht mit jemandem, der etwas kann, aber nicht alles wissen muss.
Anti-Referenzen
- SaaS-Startseiten-Ästhetik. Keine Farbverläufe, keine schwebenden Karten mit Schatten, keine „Hero-Kennzahl" mit großer Zahl und kleinem Label, keine Kachelraster aus Icon + Überschrift + drei Zeilen Text.
- Adobe-Dichte. Keine Werkzeugpaletten, keine verschachtelten Reiter, keine Einstellung, die man nur mit Handbuch findet.
- Verspieltes. Keine abgerundeten Riesenradien, keine Illustrationen mit lachenden Menschen, keine Konfetti-Animation nach dem Speichern.
- Alles-ist-eine-Karte. Karten nur, wo sie wirklich etwas gruppieren. Nie verschachtelt.
Grundsätze
- Maße sind keine Meinung. Wo etwas physisch wird, wird gerechnet und nachgemessen, nicht geschätzt. Millimeter ist die führende Einheit; Pixel entstehen erst beim Rendern.
- Alle Wege können alles. Web, Telegram und MCP sind gleichberechtigt. Eine neue Funktion, die nur im Web geht, ist nicht fertig.
- Voreinstellungen neigen zur Vorsicht. Teilen-Links laufen ab. Private Sitzungen hinterlassen nichts. Beim Aufräumen fremder Dateien wird angehalten und gefragt.
- Sag, was passiert, bevor es passiert. „Überstehen (−3 mm)" statt „geht nicht". Probelauf vor der Umbenennung. Vorschau, die zeigt, was gedruckt wird.
- Fehler gehören ins Log, nicht ins Gesicht des Nutzers — aber sie gehören irgendwohin. Nichts still verschlucken.
- Es läuft auf einem Server. Ein Node-Prozess, begrenzter Speicher. Teure Rechnung braucht eine Obergrenze, bevor sie beginnt.
Register-Begründung
Die Oberfläche dient der Arbeit, sie ist nicht das Produkt. Ausnahme: /vorstellung
ist eine Marketingseite und läuft im Brand-Register.