feat(tags): QR-Aufkleber, Geraeteseite, Etikettendruck und Scanner #28

Merged
florian.wilde merged 1 commits from feat/14-qr-tags-geraeteseite into main 2026-09-25 19:30:51 +00:00
Owner

Der Meilenstein M9: der Einstieg über den Aufkleber.

Was drin ist

  • /t/<tagCode> als Weiche — registriertes Gerät → Geräteseite, vorgedruckter Tag → Registrierformular, unbekannter Code → Hinweis mit Weg zur Suche. Groß/klein wird gefaltet (ein Handy schreibt klein), verwechselbare Zeichen nicht.
  • Geräteseite mit Kopf, „Zugewiesen“, Schnellstart aus den Gerätetyp-Vorgaben, „Vorlage zuweisen“ und Historie — am Handy bedienbar, weil sie dort benutzt wird.
  • QR und Etiketten: Stapel vorgedruckter Tags, Einzeletikett 62 × 29 mm und A4-Bogen 3 × 8. Im QR steht ausschließlich {APP_URL}/t/{tagCode}.
  • Scanner mit der BarcodeDetector-API des Browsers, wo es sie gibt, sonst WebAssembly aus dem eigenen Haus — und immer einem Feld für den abgetippten Code.

Gemessen, nicht behauptet

Die Seitengröße stammt aus einem echten PDF (62 × 29 mm bzw. A4), und ein bei 300 dpi gerastertes Etikett wird mit demselben Decoder zurückgelesen, den auch der Scanner benutzt. Ein anderer Leser hätte etwas anderes bewiesen als „unsere Kamera erkennt das“.

Drei Defekte, die erst der gebaute Stand zeigte

Alle drei an den Nähten zwischen den parallel gebauten Teilen: „Starten“ setzte IN_ARBEIT und sprang nicht in den Lauf; „Vorlage zuweisen“ bot Vorlagen an, die der Dienst danach ablehnte; die Geräteliste verlinkte nichts.

Der unabhängige Review: drei Blocker

  1. Der Scanner benutzte nie die native API — die Ponyfill-Fassung gibt immer ihre eigene Klasse zurück, jedes Gerät holte 1,1 MB WebAssembly.
  2. Ein ausgefallener Decoder blieb unsichtbar — dreimal je Sekunde ein Fehler, auf dem Bildschirm unverändert „Halte den Aufkleber ins Bild“.
  3. Die Dokumentation war nur zur Hälfte mitgezogen.

Dazu elf Befunde, darunter: ein Unterpfad in APP_URL fiel aus dem gedruckten QR heraus (auf Papier nicht mehr zu berichtigen), ohne APP_URL druckte jedes Etikett stillschweigend localhost, und der Stapeldruck war die offene Hintertür zu einer Seite mit Schloss. Alle abgearbeitet.

Prüfstand

pnpm lint, typecheck, format:pruefen, pruefe:doku grün · 930 Tests (vorher 879) · 54 Ende-zu-Ende-Tests gegen den gebauten Stand · Screenshots in docs/screenshots/m9/.

Closes #14

🤖 Generated with Claude Code

Der Meilenstein M9: der Einstieg über den Aufkleber. ## Was drin ist - **`/t/<tagCode>`** als Weiche — registriertes Gerät → Geräteseite, vorgedruckter Tag → Registrierformular, unbekannter Code → Hinweis mit Weg zur Suche. Groß/klein wird gefaltet (ein Handy schreibt klein), verwechselbare Zeichen nicht. - **Geräteseite** mit Kopf, „Zugewiesen“, Schnellstart aus den Gerätetyp-Vorgaben, „Vorlage zuweisen“ und Historie — am Handy bedienbar, weil sie dort benutzt wird. - **QR und Etiketten**: Stapel vorgedruckter Tags, Einzeletikett 62 × 29 mm und A4-Bogen 3 × 8. Im QR steht ausschließlich `{APP_URL}/t/{tagCode}`. - **Scanner** mit der BarcodeDetector-API des Browsers, wo es sie gibt, sonst WebAssembly aus dem eigenen Haus — und immer einem Feld für den abgetippten Code. ## Gemessen, nicht behauptet Die Seitengröße stammt aus einem echten PDF (62 × 29 mm bzw. A4), und ein bei 300 dpi gerastertes Etikett wird mit **demselben** Decoder zurückgelesen, den auch der Scanner benutzt. Ein anderer Leser hätte etwas anderes bewiesen als „unsere Kamera erkennt das“. ## Drei Defekte, die erst der gebaute Stand zeigte Alle drei an den Nähten zwischen den parallel gebauten Teilen: „Starten“ setzte `IN_ARBEIT` und sprang nicht in den Lauf; „Vorlage zuweisen“ bot Vorlagen an, die der Dienst danach ablehnte; die Geräteliste verlinkte nichts. ## Der unabhängige Review: drei Blocker 1. **Der Scanner benutzte nie die native API** — die Ponyfill-Fassung gibt immer ihre eigene Klasse zurück, jedes Gerät holte 1,1 MB WebAssembly. 2. **Ein ausgefallener Decoder blieb unsichtbar** — dreimal je Sekunde ein Fehler, auf dem Bildschirm unverändert „Halte den Aufkleber ins Bild“. 3. **Die Dokumentation war nur zur Hälfte mitgezogen.** Dazu elf Befunde, darunter: ein Unterpfad in `APP_URL` fiel aus dem gedruckten QR heraus (auf Papier nicht mehr zu berichtigen), ohne `APP_URL` druckte jedes Etikett stillschweigend `localhost`, und der Stapeldruck war die offene Hintertür zu einer Seite mit Schloss. Alle abgearbeitet. ## Prüfstand `pnpm lint`, `typecheck`, `format:pruefen`, `pruefe:doku` grün · **930 Tests** (vorher 879) · **54 Ende-zu-Ende-Tests** gegen den gebauten Stand · Screenshots in `docs/screenshots/m9/`. Closes #14 🤖 Generated with [Claude Code](https://claude.com/claude-code)
florian.wilde added 1 commit 2026-09-25 19:30:40 +00:00
feat(tags): QR-Aufkleber, Geraeteseite, Etikettendruck und Scanner
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
5f1b0d1435
Der Einstieg, fuer den die Anwendung gebaut ist: scannen, sehen was zu tun ist,
loslegen. `/t/<tagCode>` kennt drei Faelle — registriertes Geraet, vorgedruckter
Tag, unbekannter Code —, die Geraeteseite zeigt Zuweisungen, Schnellstart und
Historie, und beides ist am Handy bedienbar.

Im QR steht ausschliesslich `{APP_URL}/t/{tagCode}`: kein Name, keine
Seriennummer, kein Besitzer. Ein Aufkleber haengt jahrelang sichtbar am Geraet
und wird von jedem Telefon gelesen; was darauf steht, ist veroeffentlicht. Die
Masse sind gemessen, nicht behauptet: ein echtes PDF liefert 62 x 29 mm und A4,
und ein bei 300 dpi gerastertes Etikett wird mit demselben Decoder
zurueckgelesen, den auch der Scanner benutzt.

Drei Defekte zeigte erst der gebaute Stand, alle an den Naehten zwischen den
parallel gebauten Teilen: „Starten“ setzte IN_ARBEIT und sprang nicht, „Vorlage
zuweisen“ bot Vorlagen an, die der Dienst danach ablehnte, und die Geraeteliste
verlinkte nichts. Der unabhaengige Review fand drei Blocker — darunter, dass der
Scanner nie die native BarcodeDetector-API benutzte und dass ein Unterpfad in
APP_URL aus dem gedruckten QR herausfiel.

Closes #14

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
florian.wilde merged commit e7a2e2d5c7 into main 2026-09-25 19:30:51 +00:00
florian.wilde deleted branch feat/14-qr-tags-geraeteseite 2026-09-25 19:30:51 +00:00
Sign in to join this conversation.