Ctrl K
ComunidadGuías…

CLAUDE.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 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.