CLAUDE.md
Rama main · réplica de lectura del repositorio original.
# Arbeiten an Nupplo (bis 2.92 „Brickfolio“)
Selbstgehostete PWA für LEGO-Sammlungen: FastAPI + SQLite im Rücken,
Vanilla-JS im Browser. **Kein Bauschritt**, keine Abhängigkeiten im Frontend –
`frontend/app.js` wird so ausgeliefert, wie sie im Repo steht.
## Sprache
Alles auf Deutsch: Oberfläche, Kommentare, Commit-Texte, Changelog, Handbuch.
Die deutschen Zeichenketten **sind** die Übersetzungsschlüssel;
`frontend/i18n/en.json` bildet sie ab (sortiert, `indent=1`). Ein Test schlägt
an, sobald ein Schlüssel dort keine Entsprechung mehr in der Oberfläche hat.
Kommentare erklären das **Warum**, nicht das Was – und besonders das, was ohne
Erklärung wie ein Fehler aussieht. Wo eine Entscheidung aus einem konkreten
Vorfall stammt, gehört der Vorfall dazu.
## Prüfen statt behaupten
Der Quelltext ist kein Beweis. Was am laufenden Programm geprüft werden kann,
wird dort geprüft:
DB_PATH=… SECRET_KEY_FILE=… UPLOAD_DIR=… FRONTEND_DIR=./frontend \
.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8400 # aus backend/
**Die Cache-Falle:** Die Dateien gehen mit `immutable` raus. Nach einer
Änderung an JS oder CSS zeigt der Browser weiter die alte Fassung, solange
`APP_VERSION` gleich bleibt – entweder Version hochsetzen oder auf einem
**anderen Port** starten, dort ist der Zwischenspeicher leer. Das hat schon
mehrfach eigene Testartefakte wie Fehler aussehen lassen.
**`node --check frontend/app.js`** gehört zu jeder Frontend-Änderung. Die
Python-Tests lesen die Datei, sie führen sie nicht aus – ein Syntaxfehler
kommt dort nie an, zerlegt die App aber beim Laden.
## Tests
`pytest` aus dem Projektstamm. Ein neuer Test beschreibt im Docstring den
**Vorfall**, aus dem er entstanden ist, nicht die Funktion, die er aufruft.
Und er muss ohne die Korrektur durchfallen – sonst prüft er nichts:
git stash push backend/main.py && pytest tests/test_neu.py; git stash pop
## Nach jeder Änderung
1. `APP_VERSION` in `backend/core.py` hochsetzen
2. `CHANGELOG.md` – was war kaputt, was ist jetzt anders, **warum**
3. Handbuch (`docs/HANDBUCH.md`) nachziehen, wenn sich Bedienung ändert
4. Übersetzungen ergänzen
5. Commit, Tag, Release
Ohne Versionssprung sieht niemand die Änderung – siehe Cache-Falle.
## Was leicht schiefgeht
- **`requests.HTTPError` erbt von `RequestException`.** Ein 404 fällt sonst in
den Zweig „Dienst nicht erreichbar" und wird als Ausfall gemeldet.
- **Deutsche Anführungszeichen** in Python-Zeichenketten zerlegen sie.
- **`display: flex`** schlägt `[hidden] { display: none }` des Browsers –
versteckte Zeilen brauchen eine eigene Regel.
- **BrickLink-Nummern** sind nicht die von Rebrickable. Preise gehen über die
BrickLink-Nummer, sonst kommt nichts zurück.