# Changelog ## 3.8.3 – Oktober 2026 ### Sicherheit - 🔒 **Zugriff ohne Portfreigabe: stumme Verbindungen gehen wieder zu.** Ein Gerät, das sich über den Vermittler meldet, aber den verschlüsselten Handschlag nicht schickt, hielt bisher seinen Platz, solange es wollte. Weil der Vermittler je Instanz nur acht Geräte gleichzeitig zulässt, konnte so jemand alle Plätze besetzen, und die eigenen Geräte kamen nicht mehr hinein. Jetzt schließt Nupplo jede Verbindung, die nach zehn Sekunden noch keinen Handschlag hat. Gekoppelte Geräte merken davon nichts, ihr Handschlag dauert Millisekunden. ## 3.8.2 – Oktober 2026 ### Geändert - 🔒 **Der Figurenkatalog kommt verschlüsselt.** Die Beschreibungen, mit denen die Suche Figuren nach ihrem Aussehen findet, standen bisher als Klartext in `katalog/index.ndjson` – und damit unter der MIT-Lizenz des Repos, also für jeden frei nehmbar. Sie sind aber eigene Arbeit des Projekts und sollen nur in Nupplo genutzt werden. Jetzt lädt Nupplo `katalog/index.nupplo`, Zeile für Zeile verschlüsselt, und der Ordner `katalog/` hat eine eigene Lizenz (`katalog/LIZENZ.md`): Nutzung nur in Nupplo. Der Schlüssel steht in Nupplo selbst – jede Installation bekommt den Katalog weiter ohne Anmeldung und ohne Hub. Die Verschlüsselung ist bewusst ein Schild, keine Festung: Wer sie umgeht, weiß, dass der Inhalt nicht für ihn bestimmt ist. Ein paar Kontrollzeilen machen eine Kopie erkennbar; Nupplo übergeht sie. Das Format steht in `docs/KATALOG-FORMAT.md`. - 📣 **Ältere Fassungen bitten ums Update.** An der alten Stelle liegt nur noch ein Hinweis. Wer nicht aktualisiert, findet bei der Suche nach Aussehen statt Figuren die Bitte, Nupplo zu aktualisieren – mit dem Grund dafür. Nach dem Update verschwinden diese Hinweise von selbst, und jede Beschreibung kommt aus der neuen Datei zurück. Wer die alte Adresse als Katalogquelle eingetragen hatte, wird still auf die neue umgelenkt. - 🇩🇪 **Beschreibungen werden beim Abruf eingedeutscht**, nicht nur einmal beim Start. Sonst wären alle Beschreibungen, die nach dem Hinweis neu kommen, englisch geblieben, und „gelber Kopf“ fände nichts mehr. Sonst ändert sich nichts – dieses Update bringt nur die neue Katalogdatei und ihren Schlüssel. ## 3.8.1 – Oktober 2026 ### Geändert - 📘 **Der Verweis auf die Bauanleitungen steht nicht mehr in der Hauptansicht.** Beim Set in der Sammlung liegt er im Steckbrief unter **Mehr → Nachschlagen**, neben Preisverlauf und BrickLink; im Katalogfenster hinter **Mehr ▾** neben „Bei BrickLink ansehen“. Das 📘 neben den Sets einer Figur ist weg – wer die Anleitung sucht, öffnet das Set und findet sie dort unter „Mehr“. ## 3.8.0 – Oktober 2026 ### Neu - 📘 **Verweis auf die Bauanleitungen bei LEGO.** Bei Sets – in der Sammlung und im Katalog – und bei Figuren in der Liste „in Sets“ führt ein Verweis zu LEGOs Seite mit den Bauanleitungen zur Setnummer. **Optional und ausgeschaltet voreingestellt:** Unter *Mehr → 📘 Bauanleitungen* wählst du, ob er nur in der Browseransicht, nur in der Handyansicht oder in beiden erscheint. Artikelseiten verlinken wir nicht – die gibt es bei LEGO nur für Sets, die gerade verkauft werden. ## 3.7.4 – Oktober 2026 ### Behoben - 🔎 **„Badehose Stormtrooper" findet den Stormtrooper in Badehose.** Für diese Anfrage hatte sich die Instanz früher eine Übersetzung vom Modell gemerkt (`stormtrooper helmet`), und die ging der Liste vor – auch nachdem die Liste „Badehose" kannte. Jetzt stehen die Fassungen der Liste vorn, das Gelernte dahinter, und gesucht wird mit allen. - 🔎 **Die eigene Sammlung findet auch über die Bildbeschreibung.** Bisher verglich der zweite Anlauf dort nur Namen. Eine Figur, deren Badehose nur in der Beschreibung steht, fand die Katalogsuche, die eigene Sammlung aber nicht. ## 3.7.3 – Oktober 2026 ### Behoben - 🔎 **„Badehose" findet etwas.** Das Wort fehlte im mitgelieferten Wörterbuch, und ein unbekanntes Wort zählt als Pflichtwort – die Suche lief leer, obwohl eine Figur in Badehose im Katalog steht. Ergänzt sind Badehose, Whirlpool, Bademantel, Schlafanzug, Trainingsanzug, Laborkittel, Fliege, Schlittschuhe, Rettungsring und weitere Alltagswörter rund um Kleidung und Freizeit. - 🔎 **Ein unbekannter Wortteil leert die Suche nicht mehr.** Kennt die Liste den vorderen Teil eines zusammengesetzten Worts nicht, gilt wenigstens der hintere – eine „Quatschhose" ist eine Hose. Namen wie Skywalker oder Dumbledore bleiben unangetastet. ## 3.7.2 – Oktober 2026 ### Geändert - 📣 **„Meine Mitteilungen vom Hub-Admin“ erscheint nur, wenn etwas drin ist.** Bisher stand der Kasten im Tausch-Tab auch leer da – obwohl man den Hub-Admin von dort gar nicht anschreiben kann. Sind alle Mitteilungen gelöscht, verschwindet er. ## 3.7.1 – Oktober 2026 ### Sicherheit (externer Zugriff ohne Portfreigabe) - 🔒 **Gelöschte Benutzer nehmen ihre gekoppelten Geräte mit.** Bisher blieben die Geräte stehen und kamen weiter bis zur Anmeldeseite. Jetzt verschwinden sie samt offenen Kopplungscodes, und bestehende Verbindungen werden sofort getrennt. - 🔒 **Eine kaputte Nachricht trifft nur ihre eigene Verbindung.** Ein gekoppeltes Gerät konnte mit einer fehlerhaften Nachricht die Leitung für alle Geräte kurz abreißen lassen. Außerdem sind Anfragen je Verbindung auf 160 MB begrenzt; darüber gibt es „413“. - 🔒 **Die Herkunft kommt nie aus Kopfzeilen des Geräts.** Fehlte die Adresse vom Vermittler, zählte die Bremse gegen Passwortraten nach der vom Gerät gesetzten Absender-Kopfzeile. Solche Kopfzeilen werden jetzt verworfen; ohne Adresse zählt eine feste Kennung je Gerät. ## 3.7.0 – Oktober 2026 ### Neu - 🗑 **Mitteilungen vom Hub-Admin löschen.** Unter „Meine Mitteilungen vom Hub-Admin“ hat jeder Eintrag jetzt „Löschen“. Die Mitteilung verschwindet nur bei dir und gilt als gelesen; der Hub-Admin behält sie in seinem Verlauf. Braucht Hub 1.27.0. ## 3.6.0 – Oktober 2026 ### Neu - 🚫 **Zur Sperre selbst Stellung nehmen.** Im Kasten „Zugang gesperrt“ stand bisher nur, dass und warum gesperrt ist – widersprechen ließ sich nicht. Jetzt steht darunter „Stellung nehmen“ (bis 2000 Zeichen, nur der Hub-Admin liest es; erneutes Senden ersetzt die frühere Stellungnahme). - 🚫 **Auch ohne Mitgliedskonto.** Lehnt der Hub schon den Beitritt ab, weil die Installation gesperrt ist, sagt das jetzt *Mehr → Tausch-Netzwerk* samt Grund – und bietet dieselbe Stellungnahme an. Dann spricht die Installation mit ihrer Kennung statt mit einem Konto. Braucht Hub 1.26.0. ## 3.5.0 – Oktober 2026 ### Neu - 📣 **Zu einer Mitteilung des Hub-Admins Stellung nehmen.** Bisher blieb eine Verwarnung ohne Gegenrede im Verlauf stehen – man konnte sie nur mit „Verstanden“ wegdrücken. Jetzt steht daneben „Stellung nehmen“: ein Feld für bis zu 2000 Zeichen, das nur der Hub-Admin liest. Erneutes Senden ersetzt die frühere Stellungnahme. Braucht Hub 1.25.0. - 📣 **Meine Mitteilungen vom Hub-Admin.** Im Tausch-Tab stehen alle Mitteilungen an dich, auch bestätigte, mit deiner Stellungnahme. Zurückgenommene bleiben durchgestrichen mit Datum und Begründung stehen. - 🚫 **Auch gesperrt kann man Stellung nehmen.** Der Hub beantwortet die eigenen Mitteilungen auch während einer Sperre; die Liste ist dann gleich aufgeklappt. Das Lesen hebt den Sperrhinweis nicht auf – bisher galt jede erfolgreiche Antwort des Hubs als Freischaltung. ## 3.4.4 – Oktober 2026 ### Behoben - 🎨 **„rote Beine" findet jetzt, was der Name sagt.** Die Farbsuche schaute bisher nur in die Farbliste der Bildanalyse. Nannte der BrickLink-Name „… Red Legs", fehlte Rot aber in der Liste, fiel die Figur heraus – und umgekehrt kam „Red Torso, Blue Legs" herein, weil Rot irgendwo stand. Jetzt liest Nupplo SE aus dem Namen, welches Teil welche Farbe hat (`backend/namensfarben.py`): Fragt jemand nach einem Teil, entscheidet der Name; ohne Teil holt er eine Figur nur noch herein, hinter die Treffer der Farbliste („roter Droide" bleibt R-3PO). - Gelesen wird nur „ " – Details wie „Short Red Stripes" machen weiter keinen roten Droiden. Und es bleibt **lokal**: Die Namen holt jede Instanz über ihren eigenen BrickLink-Zugang, weitergegeben wird nichts. ## 3.4.3 – Oktober 2026 ### Geändert - 📚 **Der Katalog-Abzug hat eine eigene Karte.** Bisher stand er samt Stand („… Figuren und … Sets · zuletzt geholt am …“) unten in der Karte „Lokale KI für die Suche“ – dort sucht ihn niemand. Jetzt unter **Mehr → 📚 Katalog-Abzug**. Die Zahlen im Erklärtext stimmen wieder (gut 19.000 Figuren, gut 6 MB). ### Neu - 🔄 **Beim Öffnen der App wird der Katalog-Abzug nachgesehen** – wie bei den übrigen Nupplo-Oberflächen, statt bis zu zwölf Stunden auf den nächsten Hintergrundlauf zu warten. Geholt wird nur, was sich geändert hat, höchstens alle 15 Minuten, ohne BrickLink-Kontingent (die Namen schlägt weiter der Hintergrundlauf nach). Die Karte zeigt dazu „Zuletzt nachgesehen: …“. ## 3.4.2 – Oktober 2026 ### Behoben - 🐞 **Fehlerliste: kopierter Text und Issue nennen jetzt auch die jüngste Fassung.** Bisher stand dort nur die Version vom ersten Auftreten – ein heute wieder aufgetretener Fehler sah so aus, als käme er von einer Seite, die seit Tagen nicht neu geladen wurde. Jetzt steht dort wie in der Karte „2.92.0 → 3.4.0 (zuerst → zuletzt)“. ## 3.4.1 – Oktober 2026 ### Behoben - 🤝 **Angebote ziehen nach dem Abgleich selbst nach.** Wurde eine im Tausch-Netzwerk angebotene Figur über externen Zugriff verkauft oder geändert, stand das alte Angebot weiter im Netz – neu veröffentlichen durfte nur ein Admin. Jetzt veröffentlicht die Instanz nach so einem Abgleich im Hintergrund neu, wie nach einem Tausch (nur, wenn schon einmal veröffentlicht wurde). ## 3.4.0 – Oktober 2026 ### Neu - 🤝 **Verkaufslisten im Tausch-Netzwerk.** Unter einer Verkaufsliste steht „🤝 Im Netz anbieten“: Die offenen Artikel erscheinen im Netzwerk als Verkauf, so viele Stück wie auf der Liste, **mit Preis je Stück** (aus dem Preisfeld der Liste, sonst Ø-Marktwert). „Aus dem Netz nehmen“ zieht sie zurück; angebotene Artikel tragen „🤝 im Netz“. - **Liste und Netzwerk wissen voneinander:** Auf der Liste als verkauft abgehakt → raus aus dem Angebot. Über das Netzwerk verkauft und ausgetragen → die Liste hakt den Artikel von selbst ab, ohne die Sammlung ein zweites Mal anzufassen. - 💶 **Preise an Angeboten.** Wer mit Preis anbietet, bei dem steht er an der Karte – unter Angebote, in Entdecken und im Profil. Braucht Hub 1.24.0. ## 3.3.3 – Oktober 2026 ### Behoben - ↩︎ **Rückgängig bei Verkäufen aus der App.** Was in der iOS-App verkauft wurde, trägt keinen Schnappschuss des alten Stands. „Rückgängig“ in der Web-App setzte dann nur den Haken zurück, die Stücke fehlten weiter in der Sammlung. Jetzt sagt sie „In der App verkauft – bitte dort zurücknehmen“ und lässt alles, wie es ist. ## 3.3.2 – Oktober 2026 ### Behoben - 🏷️ **„ab … €“ passt zum Zustand.** Die Angebotsmarke in Einkaufs- und Verkaufslisten (und bei den Doppelten) zeigte immer den billigsten **gebrauchten** Preis, auch bei Artikeln im Zustand Neu. Jetzt steht dort „ab … neu“ bzw. „ab … gebraucht“, passend zum Artikel. Weiterhin eine Abfrage je Zeile – das BrickLink-Tageslimit wird nicht stärker belastet. ## 3.3.1 – Oktober 2026 ### Verbessert - 💰 **Gesamterlös auf Verkaufslisten.** „💰 Gesamtpreis“ verteilt einen Betrag anteilig nach Marktwert auf die offenen Artikel – auf einer Verkaufsliste heißt das Feld jetzt „Gesamterlös“, und der Vorschlag ist der volle Marktwert statt des Angebots-Anteils (60 %), der fürs Einkaufen gedacht ist. ## 3.3.0 – Oktober 2026 ### Neu - 💰 **Verkaufslisten.** Über den Stift ✏️ an einer Liste lässt sich jetzt auch die Art wählen: Einkaufs- oder Verkaufsliste. Eine Verkaufsliste tut beim Abhaken das Gegenteil – **„✔ Verkauft – raus aus der Sammlung“** nimmt die Stücke aus der Sammlung, das Kaufbuch geht mit, und die letzten Stücke nehmen die Zeile mit. Im Preisfeld steht der Erlös; er zählt nicht als Einkauf. „Rückgängig“ legt Menge, Kaufbuch und Notiz genau zurück. - Das Listen-PDF schlägt für Verkaufslisten gleich die Verkaufsfassung vor. ### Geändert - Der Stift an einer Liste öffnet jetzt einen Dialog mit Name und Art statt einer Zeile nur zum Umbenennen. ## 3.2.1 – Oktober 2026 ### Verbessert - 📄 **Listen-PDF kommt fertig vom Server.** Bisher lief es über den Druckdialog des Browsers – am iPhone ohne „Als PDF sichern“, mit Rändern und Skalierung nach Gutdünken. Jetzt baut die Instanz das PDF selbst (gleiches Aussehen überall, Nunito wie in der App, Seitenzahlen). Am Handy geht danach das Teilen-Menü auf (In Dateien sichern, AirDrop, Mail), am Rechner wird die Datei heruntergeladen – als „Verkaufsliste ‹Name›.pdf“ bzw. „Einkaufsliste ‹Name›.pdf“. ### Für Betreiber - Neue Abhängigkeit **fpdf2** (reines Python). Wer das Image zieht oder mit `update.sh` baut, muss nichts tun. ## 3.2.0 – Oktober 2026 ### Neu - 📄 **Listen als PDF.** Unter jeder Einkaufsliste steht „📄 PDF“, zur Auswahl in zwei Fassungen: - **🛒 Einkaufsliste** – alle Artikel mit Bild, Zustand, Menge, Ø-Preis, Summe, eingetragenen Einkaufspreisen und einem Kästchen zum Abhaken. - **💰 Verkaufsliste** – für den Käufer: nur die offenen Artikel, ein Preis je Stück (auf Wunsch ein Anteil vom Marktwert, z. B. 90 %) und die Summe – **ohne** eigene Einkaufspreise. Oben Wortmarke, Listenname und Eckdaten; gedruckt bzw. gesichert über den Druckdialog des Browsers („Als PDF sichern“). ## 3.1.3 – Oktober 2026 ### Neu - 🎬 **Neues Startbild.** Die Wortmarke steht größer da, die Steine fallen von weit oben ein und federn nach, „Nupp“ und „o“ gleiten weiter heran. Darunter steigen ein **Gruß zur Tageszeit** („Guten Morgen, Mia!“, ohne Anmeldung schlicht „Guten Morgen!“) und der Spruch auf. Der Name der Sammlung steht dort nicht mehr – er bleibt bei der Anmeldung. - Der Gruß in der Kopfleiste spricht jetzt genauso wie das Startbild: „Guten Morgen“ bis 11 Uhr, „Hallo“ bis 18 Uhr, „Guten Abend“ bis 23 Uhr, danach „Noch wach?“. ## 3.1.2 – Oktober 2026 ### Neu - 🔐 **„Nur mit zweitem Faktor“** für den Zugriff ohne Portfreigabe (*Mehr → Nach außen*, Admin). Dann kommt über den Vermittler nur herein, wer die Zwei-Faktor-Anmeldung eingerichtet hat; im Heimnetz ändert sich nichts. ### Warum - Gemeldet: Über den Vermittler kam keine Code-Abfrage. Das Konto hatte keinen zweiten Faktor – gefragt hatte bisher Cloudflare Access vor der Web-App, und dieser Weg führt nicht durch Access. - **Geprüft wird bei jeder Anfrage, nicht nur beim Anmelden.** Ein Gerät meldet sich zu Hause oft direkt an und geht erst unterwegs über den Vermittler; eine Prüfung nur beim Anmelden hätte diese Sitzung durchgelassen. ## 3.1.1 – Oktober 2026 ### Neu - 🧱 **„Jede Noppe zählt.“** – der neue Spruch unter der Wortmarke im Startbild und bei der Anmeldung (englisch „Every stud counts.“). Nupplo kommt von „Noppe“. ### Doku - Neue Bildschirmfotos in der README: Scannen, Sammlung, Einkaufsliste, Statistik, eigene Fotos und Sicherung – mit der Nupplo-Kopfleiste und erfundenen Beispieldaten. ## 3.1.0 – Oktober 2026 ### Neu - 📡 **Zugriff ohne Portfreigabe.** Nupplo SE kann von sich aus eine Verbindung zu einem Vermittler (`connect.nupplo.com`) aufbauen und offen halten. Externe Geräte erreichen die Instanz darüber, ohne dass am Router etwas freigegeben wird – ohne Domain, ohne Tunnel, ohne zweiten Container. Aus, bis ein Admin es unter *Mehr → Nach außen* einschaltet. **Im Aufbau:** Der Vermittler nimmt vorerst nur freigeschaltete Instanzen an. - 🔐 **Ende zu Ende verschlüsselt** mit dem Noise-Protokoll (IK). Der Vermittler reicht nur durch und kann nichts lesen. Geprüft gegen die offiziellen Testvektoren. - 📱 **Geräte koppeln per QR-Code** im Profil: Einmalcode, zehn Minuten gültig. **Nur gekoppelte Geräte kommen durch** – ein fremdes Gerät sieht nicht einmal die Anmeldeseite. Entkoppeln beendet auch eine gerade offene Verbindung. Angemeldet wird danach wie immer. - „Von außen genutzt“ in den Einstellungen zum zweiten Faktor kennt den neuen Weg und meldet ihn nicht als „ohne Zugangsschutz“. ### Warum so gebaut - **Anfragen gehen im Prozess an den Server**, nicht über eine HTTP-Bibliothek an 127.0.0.1. Im Probelauf hängte eine solche Bibliothek von sich aus `Accept-Encoding: gzip` an, und Fotos kamen gepackt an, obwohl niemand danach gefragt hatte. Kopfzeilen gehen jetzt unverändert durch; ein Test hält das fest. - **Die Absenderadresse des Geräts** gibt der Verbinder als Client-Adresse weiter. Sonst hätte die Sperre gegen Passwortraten („je Herkunft“) alle Geräte gemeinsam gebremst. - **Die Anmeldung beim Vermittler trägt eine Zufallszahl.** Ed25519 unterschreibt gleichen Inhalt immer gleich; eine Instanz, die sich in derselben Sekunde neu verbindet, wäre sonst als Wiederholung abgewiesen worden (beim Bau bemerkt). - Der Schlüssel liegt als `connect.key` neben dem Geheimnis, nicht in der Datenbank – Sicherungen wandern herum. ## 3.0.1 – Oktober 2026 **Das Repository heißt jetzt [Melle79/nupplo](https://github.com/Melle79/nupplo).** Die alte Adresse leitet weiter – Links, `git`, `update.sh` und die Katalogdatei kommen dort weiter an. ### Neu - 👋 **Gruß in der Kopfleiste** statt des Namens über der Wortmarke: „Guten Morgen“, „Guten Abend“ … mit dem eigenen Benutzernamen, passend zur Tageszeit. Der Name der Sammlung steht weiter im Startbild und bei der Anmeldung. ### Behoben - **Update-Hinweis nach dem Umzug.** Die Prüfung liest, wohin `…/releases/latest` weiterleitet. Seit dem Umzug steht davor eine zweite Weiterleitung – vom alten auf den neuen Namen –, und der folgte sie nicht. Jetzt folgt sie bis zu drei Sprüngen, nur innerhalb von GitHub. **Wer 3.0.0 oder älter betreibt, bekommt den Hinweis auf diese Fassung deshalb nicht angezeigt** und aktualisiert einmal von Hand. - Fehler melden legt die Issues im neuen Repository an; ein noch auf `Melle79/brickfolio` gesetztes `GITHUB_REPO` gilt als der neue Name. ## 3.0.0 – Oktober 2026 **Brickfolio heißt jetzt Nupplo SE** – SE steht für *Server Edition*, die Fassung, die man selbst betreibt. Gleiche App, neuer Name – bestehende Installationen laufen ohne Umstellung weiter. ### Neu - 🧱 **Neuer Name und neues Logo.** Die Wortmarke „Nupplo“, deren l ein Turm aus vier Steinen ist – oben gelb, dann rot, blau, unten grün. Sie steht im Startbild, bei der Anmeldung und in der Kopfleiste, mit einem kleinen „SE“ daneben, und nimmt die Farben jedes Designs an. - 🎬 **Startbild:** Der Turm baut sich Stein für Stein auf, dann gleiten die Buchstaben heran. Wer „Bewegung reduzieren“ eingestellt hat, sieht alles sofort. - 📲 **Neues App-Symbol:** der Steinturm auf Gelb, mit dem Namen der Instanz darüber, wenn einer eingestellt ist. Auf dem Startbildschirm erscheint es beim nächsten Hinzufügen. - 🔔 Nach dem Update sagt ein einmaliger Hinweis, dass Brickfolio jetzt Nupplo SE heißt. ### Für Betreiber - **Nichts umstellen nötig.** Datenbank (`data/brickfolio.db`), tägliche Sicherungen und JSON-Sicherungen behalten ihre Namen und ihr Format – Sicherungen lassen sich weiter in ältere Instanzen einspielen. - **Docker-Image:** Neu ist `ghcr.io/melle79/nupplo` (und `melle79/nupplo` auf Docker Hub). Das bisherige `…/brickfolio` bekommt während eines Übergangs von etwa drei Monaten dieselben Fassungen; wer es in seiner `docker-compose.yml` stehen hat, muss nichts tun, sollte aber bei Gelegenheit auf `nupplo` wechseln. - Die Umgebungsvariable für den Anzeigenamen heißt jetzt `NUPPLO_NAME`; `BRICKFOLIO_NAME` gilt weiter. - Die Verbindung zum Tausch-Netzwerk und dessen Verschlüsselung bleiben unverändert. ## 2.92.1 – September 2026 ### Verbessert - 🔎 **Das Suchwörterbuch kennt jetzt auch die Wörter der Setnamen** – rund 450 neue Stichwörter quer durch alle Themen: City, Friends, Ninjago, Harry Potter, Castle, Pirates, Technic, Creator, Duplo, Disney, Marvel/DC, Minecraft, Jurassic World, Super Mario, Botanicals. Gemessen worden war bisher nur an Figurennamen; dort deckte die Liste 80 % der Wörter, in den 21.669 Setnamen aber nur 37 %. „Bahnhof", „Bagger", „Garage", „Tempel" oder „Adventskalender" (allein 1.931 Sets) fanden nichts. Jetzt sind es 59 % – der Rest sind Eigennamen und Marken, die man so tippt, wie sie im Katalog stehen. - **Häufige Zusammensetzungen mit eigenem Eintrag.** Zerlegt wurde „Feuerwache" zu `fire` + `guard` und traf Wachen aller Art; jetzt ist es `fire station`. Ebenso „Polizeiwache", „Feuerwehrauto", „Todesstern". - **Deutsche Namen, die anders lauten:** „Schneewittchen", „Aschenputtel", „Dornröschen", „Arielle", „Todesstern", „Sternzerstörer", „Kopfgeldjäger", „Besen", „Zaubertrank" und andere. - Aufgenommen ist nur, was im Katalog auch vorkommt – ein Ziel, das in keinem Namen steht, fände nichts. ### Behoben - **Fehlende Bedeutungen:** „Pony" war nur die Frisur (jetzt auch das Tier), „Motorrad" zerfiel in `motor` + `wheel`, „Anhänger" war nur der Schmuck (jetzt auch der Anhänger am Auto), „Steine" nur Edelsteine, „See" nur das Meer. Die bisherige Bedeutung bleibt jeweils vorn. ## 2.92.0 – September 2026 ### Neu - 📚 **Der Katalog für externen Zugriff** (`/api/sync/katalog`). Wer die Sammlung mit eigener Datenbank führt, soll auch dann nachschlagen können, wenn die Instanz gerade nicht erreichbar ist – nach Name, Nummer oder Beschreibung. Dafür gibt die Instanz ihren Katalog heraus: Figuren und Sets mit Bild, Jahr und Beschreibung, dazu Kategorien, Setinhalte und die BrickLink-Nummern. - **Mit den Namen, ohne die Schlüssel.** Der öffentliche Abzug hat keine Namen; jede Instanz trägt sie über ihren eigenen BrickLink-Zugang nach. Wer den Katalog von hier holt, bekommt sie mit. Die BrickLink-Schlüssel verlassen die Instanz dabei nicht. - Geholt wird nur, was sich seit dem letzten Mal geändert hat, in Seiten zu 5.000 Einträgen und gepackt: Der ganze Figurenkatalog (gut 19.000) ist rund 1 MB. ## 2.91.0 – September 2026 ### Neu - 🔄 **Abgleich für externen Zugriff mit eigener Datenbank.** Wer von außen zugreift und seine Daten selbst mitführt, kann jetzt holen, was sich seit seinem letzten Stand geändert hat, und schicken, was bei ihm geändert wurde (`/api/sync/info`, `/pull`, `/push`). Das betrifft Sammlung, Kaufbuch, Wunschliste, Einkaufslisten und Preisverlauf. Konflikte entscheidet die neueste Änderung je Eintrag. Doppelt erfasste Artikel werden zusammengeführt, statt dass einer verloren geht. - Dafür bekommt jede dieser Zeilen eine feste Kennung und einen Stand. **Nachgezogen wird über Trigger in der Datenbank**, nicht an den rund 90 Stellen, an denen die Instanz schreibt: So zählt jeder Schreibweg mit, auch einer, der später dazukommt. Gelöschtes hinterlässt einen Vermerk, sonst käme es beim nächsten Abgleich wieder zurück. ### Rechte wie in der Web-App - **Kaufpreise und Kaufbuch nur für Sammlerprofis.** Standard-Konten bekommen sie beim Abholen nicht, und was sie schicken, wird dort ignoriert. - **Einkaufslisten** anlegen und ändern nur Profis. Standard-Konten dürfen Artikel verbuchen. Das Archiv gibt es für sie auch im Abgleich nicht. - Werte werden geprüft wie in der Web-App: kein `1e999` als Preis, keine unbekannten Zustände. ### Geändert - ↩️ **Nach dem Zurückspielen einer Sicherung** (JSON oder Tagesstand) beginnt jeder externe Zugriff mit eigener Datenbank von vorn. Mit einem Tagesstand kommt auch der alte Zählerstand zurück, und wer schon weiter war, hätte sonst Änderungen übersehen. ## 2.90.22 – September 2026 ### Neu - 🔎 **Steckbriefe in der Tauschbörse.** Ein Tipp auf Name oder Nummer eines Artikels öffnet seinen Steckbrief – in Angeboten, Entdecken, „Ich biete an“, im Profil eines anderen, im Anfrage-Fenster und im Kopf eines Gesprächs. Die Knöpfe behalten ihre Aufgabe. - 🎨 **Kopf des Tausch-Netzwerks als eigene Karte:** größeres Bild, Name fett, „Mein Profil“ und „Freund einladen“ als Knöpfe; die freien Einladungen stehen als Zahl im Einladen-Knopf. - 👑 **Hub-Admins laden ohne Kontingent ein** (mit Hub 1.23.0). ### Geändert - 👤 **„Benutzername ändern“** statt „Anzeigename ändern“ im Profil – das Feld ändert den Anmeldenamen. - 🔒 **Nummern übernehmen, doppelte Nummern zusammenführen und Themen nachladen** dürfen nur noch Admins und Sammlerprofis. Standard-Konten sehen den Hinweis weiter, ohne die Knöpfe. - 💬 **Rückfragen im eigenen Fenster** statt der Browser-Kästen (`confirm`/`alert`); Löschen und Entfernen mit rotem Knopf. - 🔢 **Sortierung „Nummer“** zählt Zahlen als Zahlen: 3001 vor 10179-1. - 🌍 **Englisch:** die übrigen Absätze in den Einstellungen (Jedipedia, Katalog-Abzug, Gelernte Begriffe, Tausch-Netzwerk, Diagnose, Quellen & Rechtliches) und die restlichen Texte aus dem Code übersetzt. ### Behoben - 🐞 **Ausfälle von BrickLink & Co. landen nicht mehr als Fehler** mit großem Hinweis und Push – die App hat sie abgefangen und sagt es. - 📉 **„Größte Wertverluste“** zählt keine Artikel ohne Marktpreis mehr. - 💬 **Dialoge schließen nicht mehr bei falscher Eingabe** („Weiterer Kauf“ mit Buchstaben, zu kurzes Passwort) – sie sagen, was fehlt. - 🧾 **Kaufbuch** zeigt den Betrag des Postens statt des gerundeten Stückpreises („2× 9,99 €“ statt „2× 5,00 €“). - ✏️ **Kleinigkeiten:** das × in Suchfeldern stimmt auch nach „Filter zurücksetzen“; der Stift in der Bezahlt-Kachel wird nicht abgeschnitten; Listen-Reiter und Fußzeile einzeilig; Schilder über mehrere Zeilen stoßen nicht an die Rundung; das Preis-Protokoll ist am Handy lesbar; der Zwei-Faktor-Schlüssel bricht nur zwischen den Vierergruppen um; „Fehlerbericht öffnen“ springt an den Anfang der Karte; der Listenpreis lässt sich leeren; der Minus-Knopf wechselt nach einem Kauf sein Zeichen; der Steckbrief nimmt Preise von Wunsch- und Einkaufsliste; „Modelle laden“ ohne Adresse sagt es; „Nichts zu tun“ nur, wenn wirklich nichts offen ist; „Alle auf die Wunschliste“ verschwindet, wenn schon alle gemerkt sind; Netzwerkfehler als Satz statt Python-Meldung; nach dem Abmelden keine Abfragen mehr; der Hinweistitel wechselt mit der Sprache; die Hilfe verweist auf „Manuell erfassen“ statt auf eine Suche, die es dort nicht gibt. - 🤝 **Tausch-Netzwerk:** Der Ungelesen-Zähler verpasst keine Antwort mehr in derselben Sekunde; „Ich biete an“ gleicht Nummer *und* Zustand ab; der Stand einer Meldung kommt nach dem Absenden sofort. - 🛡️ **Schnittstelle:** Die Anmeldebremse glaubt Proxy-Kopfzeilen nur aus dem eigenen Netz; die Ersteinrichtung legt auch bei gleichzeitigen Aufrufen nur einen Admin an; eine neue Nummer verwirft die alten Preise; eine CSV-Datei mit offenem Anführungszeichen meldet die Zeile. ## 2.90.21 – September 2026 Ergebnis eines Gesamttests: alle 181 Schnittstellen, die ganze Oberfläche (Handy und Desktop, drei Designs, Deutsch und Englisch) und das Tausch-Netzwerk mit zwei Instanzen und einem örtlichen Hub. ### Behoben – Sammlung, Listen, Kaufpreise - 💥 **Ein unendlicher Preis legte die App lahm.** `1e999` als Kaufpreis wurde angenommen; danach gaben Sammlung, Statistik und Sicherung nur noch Fehler. Unendlich und NaN werden jetzt überall abgelehnt, auch im CSV-Import. - ↩️ **„Rückgängig“ in der Einkaufsliste nimmt den Wareneingang zurück** – Menge und Kaufposten. Bisher blieb beides stehen, und wer den Artikel noch einmal annahm, hatte ihn doppelt. Nach „Ersetzen“ bleibt es beim Hinweis, die Sammlung von Hand anzupassen. - 🔒 **Kaufpreise nur für Sammlerprofis – auch in der Schnittstelle.** Die Oberfläche blendete sie für Standard-Benutzer aus, geliefert und angenommen wurden sie trotzdem (Sammlung, Kaufbuch, Statistik, Listen). - 📉 **Weniger Stück heißt weniger bezahlt.** Menge verringern ließ den ganzen Kaufpreis an der Zeile stehen; jetzt geht das Kaufbuch mit. - 🧹 **Gelöschter Kaufpreis bleibt gelöscht.** Nach dem Neuladen war er wieder da. - ☑️ **Haken in der Katalogliste entfernen löscht keine Einträge mit Kaufpreis mehr** – und räumt Kaufbuch und Fotos mit auf. - 🔢 **Neue Nummer übernehmen** führt zusammen, wenn es die Nummer schon gibt, statt mit einem Serverfehler abzubrechen. - 👤 **Benutzer löschen** klappt auch, wenn er ein Foto angehängt hat. - 🤝 **„Doppelte übernehmen“ bietet nur den Überschuss an** – nicht mehr das Exemplar zum Behalten und die Figuren aus eigenen Sets. - ⭐ **Wunschliste:** Besitz neu *und* gebraucht wird zusammengezählt. - 📈 **Wertverlauf** berücksichtigt beide Zustände einer Figur. - 💶 **Gesamtangebot:** kein Anteil mehr mit −0,01 €. - 📄 **CSV:** Der Export enthält Thema und (für Profis) Bezahlt, der Import liest beides und versteht „1,234.56“ wie „1.234,56“. - 🔐 **Falsches Passwort beim Einrichten der Zwei-Faktor-Anmeldung meldet nicht mehr ab.** - 🤖 **Der Ollama-Test fragt wirklich das Modell** – vorher antwortete das eingebaute Wörterbuch, und der Test meldete „verbunden“ ohne Dienst. - 🧩 **Steckbrief:** „Steckt in diesen Sets“ zeigt wieder Name und Anzahl statt „…|2“. - 🛒 **Manuell erfassen → Liste** übernimmt den Einkaufspreis. - 🔁 **Zustand im Karten-Fenster umstellen** aktualisiert Wert und Gewinn sofort. - Kleinigkeiten: Katalog ohne Abzug meldet „noch nicht geladen“, „Lukas' Brickfolio“ statt „Lukas's“, „1 Figur fehlt“, keine doppelten Fehlergründe, sichere Suche mit `%` und `_`, Push-Geräte ohne Schlüssel werden abgewiesen, Sicherungen mit kaputtem Aufbau bekommen eine klare Meldung, 422-Antworten wiederholen keine Eingaben (auch keine Passwörter), der Update-Vergleich versteht Anhänge wie `-rc1`. ### Behoben – Tausch-Netzwerk - 📨 **Nachrichten an ein gesperrtes Gegenüber gehen raus** (und kommen nach der Freischaltung an), statt mit „Mitglied nicht gefunden“ zu scheitern. - 📦 **Löscht das Gegenüber ein schon angenommenes Gespräch, bleibt es buchbar.** - 🗂 **Nach Abmelden und Wiederbeitritt** stehen alte Gespräche als „frühere Mitgliedschaft“ da, nicht als „vom Gegenüber gelöscht“. - 🔁 **Dasselbe Angebot lässt sich nach einem abgeschlossenen Tausch wieder anfragen**; der Zustand (neu/gebraucht) zählt dabei. - 🚦 **Statuswechsel werden geprüft** – die eigene Anfrage annehmen oder ein abgeschlossenes Gespräch wieder öffnen geht nicht mehr. - 🚪 **Zweimal beitreten** legt kein zweites Mitglied mehr an. - 🔌 **Vom Hub-Admin entfernt?** Die App sagt es und zeigt den Weg zum Neubeitritt, statt überall „Token ungültig“ zu melden. - 🐞 **Absagen des Hubs sind keine Fehler mehr.** Sperre, Kontingent, benutzte Einladung landeten als 502 im Fehlerbericht. - ⚖️ **Gleichzeitiges Austragen** bucht Menge und Kaufbuch sauber nacheinander. - Kleinigkeiten: „nicht mehr angeboten“ nur, solange nichts zugesagt ist; der Sperrhinweis sagt nicht „bis auf Weiteres“ neben einem Enddatum; „Freund einladen“ verschwindet bei Sperre; leere Nachrichten werden abgewiesen. ### Geändert – Darstellung - 📱 **Sammlung am Handy:** Die Suche hat eine eigene Zeile, „Alle Typen“ und „Zuletzt erfasst“ werden nicht mehr abgeschnitten. - 📱 **Kacheln am Handy:** Große Beträge passen nebeneinander, auch in der Wunschliste. - 🎨 **Galaxy und Nova:** Ausgewählte Zustands-Pillen und das Wunschlisten-Schild haben dunkle Schrift auf Gelb bzw. Hellblau. - 🌍 **Englisch:** gut 60 fehlende Übersetzungen im Tausch-Netzwerk (Entdecken, Profil, Einstieg) ergänzt. ## 2.90.20 – September 2026 ### Behoben - 🔌 **Vereinzelte „502“ mitten im Betrieb.** Hinter einem Tunnel wie Cloudflare schloss der Server ruhende Verbindungen schon nach 5 Sekunden, der Tunnel hielt sie aber bis zu 90 Sekunden für die nächste Anfrage bereit. Traf eine Anfrage genau diesen Moment, kam sie mit „502“ zurück – ohne dass der Server neu startete. Er hält Verbindungen jetzt 120 Sekunden offen. Wirkt nach dem Update, weil der Startbefehl im Image steckt. ## 2.90.19 – September 2026 ### Behoben - 💰 **„Gesamtangebot“ in Einkaufslisten geht wieder.** Seit die Knöpfe einer Liste in der eigenen Fußzeile stehen (2.88.37), suchte der Knopf noch den alten Rahmen, fand ihn nicht und brach ohne Meldung ab – es passierte einfach nichts. - 📱 **Tausch-Netzwerk am Handy aufgeräumt.** Unter dem eigenen Namen stehen „Mein Profil“, „Freund einladen“ und die freien Einladungen jetzt in einer eigenen, eingerückten Zeile, statt links unter das Bild zu rutschen. - 📱 **„Ich biete an“:** „Entfernen“ sitzt jetzt klein unten rechts neben der Menge. Bisher nahm der Knopf neben dem Titel fast die halbe Breite ein und quetschte lange Namen auf fünf Zeilen. - 🎨 **Keine blaue Schrift mehr auf dem iPhone.** Safari färbt Knöpfe und Auswahllisten ohne eigene Farbe systemblau – betroffen waren etwa die Reiter im Tausch-Netzwerk und die Mengenauswahl. Sie übernehmen jetzt die Textfarbe des Themas. In den dunklen Themen ist die Schrift auf gelb bzw. blau hinterlegten, ausgewählten Reitern und Umschaltern wieder dunkel. ## 2.90.18 – September 2026 ### Geändert - 📱 **Preiszeilen brechen sauber um.** Das gelbe Schild steht links, alles andere in einer eigenen Spalte daneben – was umbricht, bleibt unter dem Preis eingerückt. Bisher rutschte „· 13× verkauft 🇩🇪“ auf dem Handy an den linken Rand unter das Schild. Ist die Zeile schmal (Handy, Katalogfenster), steht die Verkaufszahl grundsätzlich in einer eigenen, eingerückten Zeile; ist sie breit, bleibt alles in einer. Angaben wie „1× verkauft 🇩🇪“ werden nie mehr mittendrin getrennt. ## 2.90.17 – September 2026 ### Geändert - 💶 **Das Katalogfenster zeigt jetzt auch Preise** – wie der Steckbrief, mit Spanne, Verkaufszahl, Gebietsfahne und den Angebotspreisen, wenn eingeschaltet. Bisher standen dort nur Bild, Name und die Knöpfe. Das Fenster ist dafür etwas breiter geworden. - Die Gebietsfahne hängt an der Angabe davor und rutscht nicht mehr allein in die nächste Zeile. ## 2.90.16 – September 2026 ### Geändert - 💶 **Auch das Info-Fenster aus Listen, Sets und Katalog zeigt die Preise wie der Steckbrief** – mit Spanne, Verkaufszahl, Gebietsfahne und den Angebotspreisen, wenn eingeschaltet. Wie beim Suchtreffer (2.90.15) steht die Kurzzeile sofort da, die vollen Angaben folgen. ## 2.90.15 – September 2026 ### Geändert - 💶 **Das Infofenster eines Suchtreffers zeigt die Preise wie der Steckbrief.** Bisher stand dort nur „Ø neu … · Ø gebr. …“. Jetzt kommen neu und gebraucht mit Spanne, Verkaufszahl und Gebietsfahne, darunter die Angebotspreise, wenn eingeschaltet. Die Kurzzeile steht sofort da, die vollen Angaben folgen einen Moment später. ## 2.90.14 – September 2026 ### Neu - ✉️ **Meine Einladungen.** Unter „Freund einladen“ stehen die eigenen Einladungen: offene mit ihrem Code – noch einmal kopieren, teilen oder zurückziehen –, eingelöste mit Name und Datum (vier Wochen lang). Bisher war ein Code nach dem Schließen des Fensters weg, obwohl die Einladung verbraucht war, und ob er eingelöst wurde, sah man nirgends. Den Code merkt sich die eigene Instanz, der Hub kennt nur seine Prüfsumme. Braucht Hub 1.22.0. ## Hub 1.22.0 – September 2026 ### Neu - `GET /v1/invites` liefert die eigenen Einladungen mit Stand (Prüfsumme als Kennung, ohne Code), `DELETE /v1/invites/:prüfsumme` zieht eine offene zurück. ### Behoben - Abgelaufene, nie eingelöste Einladungen zählten für immer gegen das Kontingent. Jetzt zählen nur noch offene und eingelöste. ## 2.90.13 – September 2026 ### Geändert - ✉️ **Einladen mit eigenem Fenster.** Der Code stand bisher als rohe Zeile unter dem Zähler. Jetzt öffnet „Freund einladen“ ein Fenster mit dem Code in groß, „Kopieren“ und – wo das Gerät es kann – „Teilen“, dazu drei Schritte, was der Freund damit macht. Wie viele Einladungen noch frei sind, steht als kleine Marke direkt am Knopf. - 📝 README und Handbuch: Der Tausch-Abschnitt sagt jetzt gleich oben, dass das Netzwerk von Haus aus aus ist und nur geteilt wird, was man ausdrücklich auswählt. Die Flaggen-Beschreibung passt zu 2.90.12. ## 2.90.12 – September 2026 ### Geändert - 🇩🇪 **Jede Preiszeile im Steckbrief zeigt ihr Gebiet.** Bisher stand die Fahne nur, wenn die App auf ein größeres Gebiet ausweichen musste. Dann sah man etwa bei „Gebraucht“ die EU-Fahne und bei „Neu“ nichts. Jetzt steht auch die Fahne des eingestellten Gebiets dahinter, bei Verkaufs- wie Angebotspreisen, und der Tooltip sagt, woher der Preis kommt. Die kurze Zeile auf der Karte bleibt, wie sie war. ## Hub 1.21.0 – September 2026 ### Neu - **Instanz ganz entfernen:** `DELETE /v1/admin/instances/:id` löscht die Instanz samt aller Konten, die je darüber beigetreten sind, und allem, was an ihnen hängt. Für Testinstanzen und verwaiste Installationen – wer nur nicht zurücksoll, bekommt weiter „Neubeitritt sperren“. Instanzen mit Admin-Konto bleiben stehen. In der Konsole unter *Instanzen → Entfernen*. ## 2.90.11 – September 2026 ### Neu - 💬 **Rückfragen zu Meldungen.** Der Hub-Admin kann beim Meldenden nachfragen. Die Frage steht unter der Meldung im Gespräch, es kommt ein Hinweis, und man antwortet gleich dort. - 📣 **Maßnahmen, die der Betroffene sieht.** Hinweis und Verwarnung des Hub-Admins stehen oben im Tausch-Tab, bis man „Verstanden“ drückt. Der Sperrhinweis nennt Grund und Ende einer Sperre. Wer gemeldet hat, steht nirgends. - ✔ **Der Meldende sieht, was aus seiner Meldung wurde** – die Maßnahme, wenn der Admin sie freigibt, sonst nur „bearbeitet“. Braucht Hub 1.20.0. ## Hub 1.20.0 – September 2026 ### Neu - **Rückfragen:** `report_messages`; der Admin schreibt über `POST /v1/admin/reports/:id/messages`, der Meldende über `POST /v1/reports/:id/messages` (öffnet eine erledigte Meldung wieder). Beide Seiten bekommen den Austausch mit den Meldungen geliefert. - **Maßnahmen beim Erledigen:** `massnahme` (`keine`, `hinweis`, `verwarnung`, `sperre_zeit` mit `tage`, `sperre`), Text an den Gemeldeten, `ergebnis_sichtbar` für den Meldenden. Hinweise landen in `member_notices` und über `/v1/me` beim Betroffenen, bestätigt mit `POST /v1/notices/:id/ack`. Sperren setzen `blocked_until`/`block_reason`, befristete heben sich beim nächsten Besuch nach Ablauf selbst auf. Der 403 einer Sperre nennt Grund und Ende. - **Archiv:** erledigte Meldungen und entschiedene Einladungsanfragen lassen sich archivieren (`POST …/archive`, Liste mit `?archiv=1`) oder löschen. - Die Meldungsliste der Verwaltung nennt beim Gemeldeten, wie oft er schon gemeldet wurde und welche Maßnahmen es gab. Die Mitgliederliste zeigt Meldungen, Maßnahmen und Sperrgrund. ## 2.90.10 – September 2026 ### Neu - ⚑ **Die eigene Meldung bleibt sichtbar.** Bisher kam nach dem Melden nur eine kurze Bestätigung, danach fand man die Meldung nirgends wieder. Jetzt steht im Gespräch, wann man gemeldet hat und ob mit Verlauf, in der Gesprächsliste die Marke „⚑ gemeldet“. Hat ein Hub-Admin die Meldung erledigt, steht das dort ebenfalls, und es kommt ein Hinweis. Braucht Hub 1.19.0. ## Hub 1.19.0 – September 2026 ### Neu - `POST /v1/reports` gibt die Nummer der Meldung zurück, `GET /v1/reports` liefert die eigenen Meldungen mit Stand (`open`/`handled`) und Datum. Die Notiz des Admins und der offengelegte Verlauf gehen dabei nicht mit. ## 2.90.9 – September 2026 ### Behoben - ✉️ **„Freund einladen“ war kaum zu finden.** Der Knopf stand im Reiter „Angebote“ neben „Aktualisieren“. Seit „Entdecken“ der Startreiter ist, sah man ihn gar nicht mehr. Jetzt steht er oben im Tausch-Tab neben „Mein Profil“, samt Einladungszähler, und ist von jedem Reiter aus erreichbar. ## 2.90.8 – September 2026 ### Behoben - 🧱 **Kompakte Ansicht nach Thema sortiert zeigte Riesenkacheln.** Auf breiten Bildschirmen standen statt der kleinen Kacheln drei 400 px breite Kästen je Reihe. Schuld war die Spaltenregel der Listenansicht: Sie traf auch die kompakte Ansicht und stand später in der Datei. Jetzt gilt sie nur noch für die Liste, und ein Test hält das fest. ## 2.90.7 – September 2026 ### Neu - ↕️ **Nach Kaufpreis und Gewinn sortieren** (nur Sammlerprofis): „Bezahlt (hoch → niedrig)“, „Gewinn (hoch → niedrig)“ und „Gewinn (niedrig → hoch)“ – letztere zeigt die Verluste zuerst. „Wert“ bleibt der Marktwert. Einträge ohne Kaufpreis stehen am Ende. Für alle anderen bleiben die Sortierungen unsichtbar und greifen auch nicht, denn schon die Reihenfolge verriete, was bezahlt wurde. ## 2.90.6 – September 2026 ### Behoben - 📒 **Ein leer gelassenes „Bezahlt (optional)“ wurde als 0 € gebucht.** Beim Übernehmen eines Tauschs landete damit „0 € bezahlt“ im Kaufbuch statt „kein Preis“, und der Gewinn der Zeile stimmte nicht. Leer heißt jetzt wieder: keine Angabe. ## 2.90.5 – September 2026 ### Behoben - 🔁 **Ein Neustart beim Ausrollen ging manchmal als Fehler in die Liste.** Nach einem 502 fragte die App genau einmal nach 20 Sekunden, ob der Server frisch gestartet ist. Dauerte der Austausch länger, lief die Nachfrage ins Leere, und „502 bei GET /api/update/status“ landete als Fehler im Bericht. Jetzt fragt sie bis zu zwei Minuten lang nach. Gemeldet wird nur, wenn der Server schon lange läuft oder nach zwei Minuten immer noch weg ist. ## 2.90.4 – September 2026 ### Behoben - 📬 **Neue Nachrichten erschienen erst nach bis zu einer Minute.** Außerhalb eines Gesprächs sah die App nur einmal pro Minute beim Hub nach. Wer vorher neu lud, sah die Nachricht sofort und hielt das Nachladen für kaputt. Jetzt alle 20 Sekunden (in der Nachrichtenliste alle 15, im offenen Gespräch weiter alle 8) und zusätzlich sofort, wenn man in den Tab oder ins Fenster zurückkommt. ## 2.90.3 – September 2026 ### Behoben - Eine Nachricht an jemanden, der das Netzwerk verlassen hat, scheiterte mit „502 – Mitglied nicht gefunden“. Jetzt heißt es gleich „Das Gegenüber hat das Tausch-Netzwerk verlassen“. In der Oberfläche war das Eingabefeld dort schon ausgeblendet, es betraf nur den direkten Aufruf. ## 2.90.2 – September 2026 ### Neu - 🚪 **Hinweis, wenn das Gegenüber das Netzwerk verlassen hat.** Bisher konnte man in so ein Gespräch weiterschreiben, aber es kam nie etwas an. Jetzt steht im Gespräch „hat das Tausch-Netzwerk verlassen", das Eingabefeld verschwindet, und der Verlauf bleibt lesbar. Ist das Gegenüber gesperrt, sagt ein Hinweis, dass Nachrichten erst nach einer Freischaltung ankommen. ### Geändert - 📝 Der Text zum Tausch-Netzwerk unter *Mehr* stammte noch aus der Zeit, als nur Abgebbares geteilt wurde. Jetzt sagt er, was wirklich geteilt wird: Angebote, Profil und, wenn man will, die Wunschliste. Braucht Hub 1.18.0. ## Hub 1.18.0 – September 2026 ### Neu - `/v1/trades` liefert `from_status`/`to_status` (`active`, `left`, `disabled`, `gone` für gelöschte Mitglieder). Nachrichten an Abgemeldete lehnt der Hub mit 410 ab – sie würden nie abgeholt. ### Geändert - Beim Abmelden geht auch das Profil (Über mich, Gegend, Themen). Es bleiben nur Name und Eckdaten, damit die Verwaltung den Austritt sieht und die Gegenseite ihre Gespräche behält. ## 2.90.1 – September 2026 ### Neu - 🚪 **Abmelden heißt jetzt auch abmelden.** Bisher vergaß beim Trennen nur die eigene Instanz die Verbindung. Im Hub blieben Angebote und Wünsche stehen, andere fragten bei jemandem an, der nie antworten würde. Jetzt meldet sich die App beim Hub ab, der nimmt alles heraus, und in der Verwaltung steht „abgemeldet am …". Der Knopf heißt „Aus dem Netzwerk abmelden", und die Rückfrage sagt, was passiert. - ⏸ **Pause bei Inaktivität.** Wer länger nicht im Netzwerk war (Standard 30 Tage), dessen Angebote und Wünsche blendet der Hub aus, bis er wiederkommt. Dann sind sie von selbst zurück, und die App sagt, von wann bis wann sie pausiert waren – als Hinweis und zwei Wochen lang im Tausch-Tab. ### Behoben - 📒 **Austragen nach einem Tausch ließ das Kaufbuch stehen.** Es sank nur die Stückzahl, und bei einer Figur standen danach „10,37 € für 5 Stück" bei nur noch 4 in der Sammlung. Einkauf und Gewinn der Zeile stimmten nicht mehr. Jetzt gehen die weggegebenen Stücke im Buch mit hinaus, vom jüngsten Kauf her, denn abgegeben wird meist der zuletzt dazugekommene Doppelte. Braucht Hub 1.17.0. ## Hub 1.17.0 – September 2026 ### Neu - `POST /v1/leave`: Das Mitglied bekommt `status = 'left'` und `left_at`, Angebote und Wünsche werden gelöscht, der Token gilt nicht mehr. Der Name ist danach wieder frei. - **Pause bei Inaktivität:** `hub_settings.inaktiv_tage` (Standard 30, 0 = aus, über `GET/PUT /v1/admin/settings`). Angebote und Wünsche von Mitgliedern, deren letzter Besuch länger zurückliegt, fehlen in `/v1/offers` und `/v1/wants`, ihr Profil trägt `pausiert`. Kommt jemand zurück, hält der Hub `pause_von`/`pause_bis` fest, und `/v1/me` meldet sie zusammen mit `inaktiv_tage`. - Verwaltung: `/v1/admin/overview` zählt `paused` und `left`, `/v1/admin/members` liefert `left_at`, `paused_since`, `pause_von` und `pause_bis`. ## 2.90.0 – September 2026 ### Neu - 🏷 **Angebotspreise: was die Figur gerade *kostet*.** Bisher stand überall der Ø-Verkaufspreis – was zuletzt tatsächlich bezahlt wurde, also was die Figur *wert* ist. Neu daneben: **ab wie viel sie zu haben ist**. Zwei verschiedene Fragen, und für den Flohmarkt ist die zweite oft die nützlichere. - In der **Detailansicht** unter dem Verkaufspreis, für neu und gebraucht, mit der Zahl der angebotenen Stücke. - In **Wunsch- und Einkaufslisten** als kleine Marke an der Zeile („ab 6,70 € gebraucht"). - **Zuschaltbar unter *Mehr → Angebotspreise*, voreingestellt aus.** Die gewohnte Ansicht bleibt, wie sie war, und die zusätzlichen BrickLink-Abrufe zahlt niemand ungefragt. - Dieselbe Schnittstelle, dieselben Zugangsdaten – nur ein anderer Parameter. Keine neue Quelle. - **Angebote werden nicht gespeichert.** Was heute zu haben ist, ist morgen weg; der Wert deiner Sammlung beruht weiter auf Verkäufen. ### Intern - Listen holen ihre Angebote in **einem** Abruf statt einem je Zeile (höchstens 60 Nummern; der 20-Minuten-Speicher fängt Wiederholungen ab). Fällt eine Figur aus, reißt sie die anderen nicht mit. - Beim Rückfall auf ein breiteres Preisgebiet entscheidet bei Angeboten die **Stückzahl**, nicht der Durchschnitt: BrickLink meldet in einem leeren Gebiet `0.0000` statt nichts. ## 2.89.4 – September 2026 ### Neu - 🏁 **Tausche schließen sich selbst ab.** Bisher blieb ein fertiger Tausch für immer auf „angenommen". Jetzt meldet jede Seite ihre Buchung (ausgetragen bzw. übernommen) an den Hub, und sobald beide gebucht haben, steht er auf „abgeschlossen". Die Schrittleiste endet mit „🏁 Abgeschlossen". Wer seinen Teil noch nicht gebucht hat, behält den Knopf. Schon gebuchte Tausche schließen sich beim nächsten Abgleich nach. ### Behoben - 🆕 **Bei „🤝 Anbieten" wurde „gebraucht" vorgeschlagen, auch für neue Stücke.** Der Zustand ging nicht mit. Jetzt schickt die abgebende Seite ihn mit, und die bekommende übernimmt ihn als Vorschlag. Beim Austragen ist das Stück im passenden Zustand vorgewählt. Braucht Hub 1.16.0. ## Hub 1.16.0 – September 2026 ### Neu - `given_at` und `taken_at` an `trades`: `POST /v1/trades/:id/progress` kennt dafür die Schritte `given` (abgebende Seite) und `taken` (bekommende). Stehen beide, setzt der Hub den Status auf `closed`. Gebucht werden darf auch nach dem Abschluss noch. - `trades.condition` (`new`/`used`) – beim Anlegen mitgeschickt, in der Vorgangsliste zurück. ## 2.89.3 – September 2026 ### Neu - 📦 **Verschickt → angekommen → übernehmen.** Nach dem Annehmen ging es bisher direkt ans Buchen, ob das Päckchen schon unterwegs oder da war, stand nirgends. Jetzt führt das Gespräch durch Schritte, sichtbar als Leiste: Wer abgibt, meldet **„verschickt / übergeben"** (mit einer vorbelegten Nachricht, gern samt Sendungsnummer) und trägt danach aus. Wer bekommt, bestätigt **„angekommen"** und übernimmt dann in die Sammlung. Gebucht wird erst nach dem eigenen Schritt. Von Hand zu Hand geht die Ankunft auch ohne „verschickt". In der Gesprächsliste steht, was ansteht. Braucht Hub 1.15.0; ältere App-Fassungen merken davon nichts. ## Hub 1.15.0 – September 2026 ### Neu - **Tauschschritte** `shipped_at` und `arrived_at` samt `POST /v1/trades/:id/progress` (`step`: `shipped` oder `arrived`). „Verschickt" darf nur die abgebende Seite melden, „angekommen" nur die bekommende, beides nur bei angenommenem Tausch. Der Status bleibt `accepted`. ## 2.89.2 – September 2026 ### Behoben - 🤫 **Die Mahnung beim Betreiber-Feld ist wieder weg.** 2.89.0 meldete „BrickLink ist eingerichtet, aber es steht keine Kontaktadresse da" – jeder Instanz, immer. Für die allermeisten ist das Unsinn: Wenn außer der eigenen Familie niemand die Instanz benutzt, gibt es keine Fremden, die jemanden erreichen müssten. Eine Auflage, die im Regelfall ins Leere läuft, gehört nicht als Dauerhinweis in die Einstellungen. Das Feld bleibt, die Mahnung geht. - 📝 **Und der Hinweis sagt jetzt, wann man es überhaupt braucht:** bei einem Zugang für jemanden außerhalb des Haushalts oder einer öffentlich erreichbaren Instanz. Sonst: leer lassen. ## 2.89.1 – September 2026 ### Behoben - 📝 **Der Hinweis beim Betreiber-Feld sagte nicht, wofür die Adresse da ist.** Die naheliegende Rückfrage lautet: „Meine Adresse liegt BrickLink doch aus der Registrierung vor, und das Feld wird gar nicht dorthin übertragen – wozu dann?" Beides stimmt, nur geht die Auflage in eine andere Richtung: Die Adresse ist **nicht für BrickLink**, sondern für **Dritte, die deine Instanz benutzen**. Sie soll angezeigt werden, nicht gesendet. Steht jetzt so dort – und in beiden Handbüchern. - 💬 Ein neues Gespräch zeigte bis zum ersten Abgleich „an ?" statt des Namens, und eine nie zugestellte Nachricht in einem gelöschten Gespräch stand ewig auf „unterwegs …". ## 2.89.0 – September 2026 BrickLinks Nutzungsbedingungen einmal gelesen statt überflogen – und dabei drei Stellen gefunden, an denen Brickfolio sie nicht erfüllte. ### Neu - 🔑 **Kontaktadresse des Betreibers** unter *Mehr → API-Schlüssel*. BrickLink verlangt eine sichtbare Kontaktadresse in der Anwendung. Gemeint ist die des **Betreibers**: Die Zugangsdaten registriert jede Instanz selbst, damit ist auch jeder Betreiber selbst der „Developer" im Sinne dieser Bedingungen – eine feste Projektadresse wäre dort schlicht falsch. Das Feld ist nicht maskiert, leeren heißt löschen, und ohne BrickLink-Zugang bleibt es ohne Wirkung. - ⚖️ **Der vorgeschriebene BrickLink-Hinweis** steht jetzt unter *Mehr → Rechtliches* – im Wortlaut, wie verlangt, und auf Englisch auch in der deutschen Oberfläche. Er erscheint nur, wenn diese Instanz die API überhaupt benutzt. Ein Test vergleicht ihn Zeichen für Zeichen und ein zweiter stellt sicher, dass der Übersetzungslauf ihn nicht anfasst. ### Behoben - 📄 **„Ein kostenloses Konto genügt" stimmte nicht.** Die Store-API steht nur Verkäufern offen: Im BrickLink-Konto muss einmal ein Shop eröffnet sein, der aber leer bleiben darf. Das Handbuch sagte es längst, die Projektseite nicht – dort stand es an drei Stellen falsch. ### Intern - Die neue Einstellung ist als personenbezogen eingestuft und wird aus Fehlerberichten entfernt. Sichtbar in der eigenen Instanz heißt nicht sichtbar in einem öffentlichen Issue. ## 2.88.56 – September 2026 Gefunden beim Durchspielen von vier Tauschgesprächen zwischen zwei Testinstanzen und einer echten. ### Behoben - 🧹 **Nach einem Tausch blieb Veraltetes stehen.** - Wer ein Stück übernahm, behielt es auf der Wunschliste. Das Netzwerk zeigte deshalb weiter an, wer es hätte, und anderen, dass man es sucht. Jetzt verschwindet der Wunsch beim Übernehmen in die Sammlung (auf eine Einkaufsliste bleibt er stehen). - Wer ein Stück austrug, bot es im Netzwerk weiter in alter Stückzahl an, bis von Hand neu veröffentlicht wurde. Jetzt zieht die App die Angebote im Hintergrund nach – aber nur, wer schon einmal veröffentlicht hat. - 🖼 **Ein erhaltenes Angebot kam ohne Bild in die Sammlung.** Der Hub liefert dem Empfänger kein Bild mit. Jetzt kommt es von der Wunschliste oder als Standardbild von BrickLink. - 👻 **Vom Gegenüber gelöschte Gespräche standen ewig als „offen" da.** Antworten liefen ins Leere. Jetzt heißen sie „vom Gegenüber gelöscht", bleiben lesbar, und das Eingabefeld verschwindet. - **Annehmen und Ablehnen** standen auch beim Fragenden, der so seine eigene Anfrage „annehmen" konnte. Jetzt sieht die Knöpfe nur, wer gefragt wurde, und nur, solange das Gespräch offen ist. ## 2.88.55 – September 2026 ### Behoben - 🤝 **Wer jemandem etwas anbietet, das er sucht**, bekam im Gespräch „⚠ Dieser Artikel wird nicht mehr angeboten" zu sehen: Der Hub suchte den Artikel in den Angeboten des *Gegenübers*, wo er nie stand. Gespräche tragen jetzt ihre Art – Anfrage oder Angebot. Die Warnung gibt es nur noch bei Anfragen, und nach dem Annehmen stimmt auch die Richtung: Wer angeboten hat, trägt aus, wer das Angebot bekommt, übernimmt. Bisher war es genau verkehrt herum. Braucht Hub 1.14.0. ## Hub 1.14.0 – September 2026 ### Neu - **Vorgänge tragen ihre Art** (`trades.kind`: `anfrage` oder `angebot`). Ältere App-Fassungen schicken nichts, das gilt als Anfrage. Bei einem Angebot meldet der Hub den Artikel immer als verfügbar. Bestehende Vorgänge, deren Empfänger den Artikel sucht und nicht selbst anbietet, stellt die Migration auf „angebot" um. ## Hub 1.13.0 – September 2026 ### Neu - 💶 **Angebote tragen ihre Art**: Tausch, Verkauf oder beides (neue Spalte `offers.deal`). Fehlt sie – bei älteren App-Fassungen –, gilt das Angebot als Tausch. ## Hub 1.12.0 – September 2026 ### Neu - 🧭 **Profile und freiwillig gezeigte Wunschlisten.** Zwei neue Tabellen (`member_profiles`, `wants`) und sechs Endpunkte: eigenes Profil lesen und speichern, fremdes Profil samt Tauschbilanz, Profilliste, eigene Wünsche ersetzen, gezeigte Wünsche der anderen. Wünsche nimmt der Hub nur an, solange „Wunschliste zeigen" gesetzt ist; beim Abschalten löscht er sie sofort. Die Sammlungsgröße speichert er gerundet und zeigt sie nur, wenn sie freigegeben ist. Beim Löschen eines Mitglieds gehen Profil und Wünsche mit. - Ältere App-Fassungen fragen diese Wege nicht an und merken nichts davon. ## Hub 1.11.0 – September 2026 ### Geändert - 📚 **Nachtrag zur Beschreibung des Katalogwegs.** Der Eintrag zu Hub 1.8.0 (weiter unten) beschreibt die Technik von damals; wie der Katalog *heute* entsteht, stand nirgends zusammenhängend. Deshalb hier in drei Schritten: 1. **Angelegt und vervollständigt wird der Katalog im Katalogdienst** — Nummern der Reihe nach, dazu die Beschreibung des Katalogfotos. Dort liegen die BrickLink-Schlüssel dafür, und nur dort. 2. **Ausgerollt wird über GitHub** — als Datei mit Nummer und Beschreibung, **ohne Namen**. 3. **Die Namen holt sich jede Instanz selbst** über ihren eigenen BrickLink-Zugang, oder in Sekunden aus der Katalogdatei. Am 05.09.2026 nachgetragen, weil das Handbuch an zwei Stellen Verschiedenes sagte. ## Hub 1.8.0 – August 2026 ### Neu - 📚 **Der Katalogabzug liegt jetzt im Hub.** Bisher baute ihn jede Instanz selbst: Nummern der Reihe nach bei BrickLink abklappern (Tage, eigenes Kontingent) und danach jedes Bild von einem Sehmodell beschreiben lassen (rund 24 Stunden Grafikeinheit für 9.741 Figuren). Dieselbe Arbeit für dasselbe Ergebnis — der Katalog beschreibt BrickLinks Fotos, nicht die Sammlung von irgendwem. `POST /v1/katalog` nimmt Stapel zu 500 Zeilen entgegen, `GET /v1/katalog?seit=…` liefert nur, was sich seit dem eigenen Stand geändert hat. Im Normalbetrieb sind das null Zeilen — der Katalog ändert sich in der Größenordnung eines Dutzend Namen im Monat. **Schreiben braucht ein eigenes Recht (`can_katalog`), lesen nicht.** Das Recht hängt am Hub und nicht in der App, denn die Instanzen sind selbst gehostet: Wer seinen Container betreibt, kann dessen Code ändern, und eine Absprache wäre damit keine Regel, sondern eine Bitte. Der Schaden wäre auch nicht Unordnung, sondern Verschlechterung — eine schwächere Bildanalyse überschreibt eine bessere, und man sieht es der Beschreibung nicht an. Jede Zeile vermerkt, welches **Modell** die Beschreibung erzeugt hat. Ohne das wäre ein Modellwechsel ein stilles Umschreiben aller Zeilen, und niemand könnte zwei Beschreibungen daraufhin ansehen, ob sie überhaupt vergleichbar sind. ## 2.88.54 – September 2026 ### Neu - 💶 **Zum Tausch, zum Verkauf oder beides.** Unter „Ich biete an" wählst du je Artikel, wozu er angeboten wird; anfangs steht alles auf Tausch. Beim Gegenüber steht die Art an der Karte, unter „Angebote" lässt sich danach filtern, und bei reinem Verkauf schlägt die Anfrage einen Kauf vor statt eines Tauschs. Braucht Hub 1.13.0. ### Geändert - Die Reiter im Tausch-Tab heißen jetzt **„💬 Nachrichten"** und **„📤 Ich biete an"**, der Knopf zum Veröffentlichen **„📤 Im Netzwerk anbieten"**. ## 2.88.53 – September 2026 ### Neu - 🧭 **Entdecken im Tausch-Netzwerk.** Der Tausch-Tab öffnet mit einem neuen Reiter und drei Abschnitten, alle auf der eigenen Instanz ausgerechnet: **„Hat, was du suchst"** (Angebote anderer, die auf deiner Wunschliste stehen – deine Wunschliste verlässt dafür die Instanz nicht), **„Sucht, was du übrig hast"** (gezeigte Wunschlisten anderer gegen deine Doppelten und Angebote, mit „🤝 Anbieten") und **„Passt zu dir"** (gleiche Lieblingsthemen). - 👤 **Profile.** Ein Tipp auf einen Namen öffnet das Profil: Über mich, Gegend, Lieblingsthemen, Tauschbilanz, freiwillig die gerundete Sammlungsgröße, dazu was das Mitglied anbietet und – falls gezeigt – sucht. Was davon zu dir passt, ist gelb umrandet. - ✏️ **Mein Profil** oben im Tab, ganz freiwillig. Zwei Schalter stehen anfangs auf aus: **„Meine Wunschliste im Netzwerk zeigen"** (wird bei jeder Änderung nachgezogen, beim Abschalten oder Trennen im Hub gelöscht) und **„Sammlungsgröße zeigen"**. - 🤝 **Einrichtungsplaner nach dem Beitritt.** Sechs Schritte – Beitreten, Über dich, Themen, Sichtbarkeit, Angebote, Los –, jeder überspringbar, gespeichert nach jedem Schritt. - Beitreten geht weiterhin nur mit Einladung, und ohne Beitritt bleibt der Tab verborgen. ### Geändert - Die Reiter heißen kürzer: „💬 Vorgänge" und „📤 Auswahl", damit vier nebeneinander aufs Telefon passen. ## 2.88.52 – September 2026 ### Intern - 🤝 **Das Tausch-Netzwerk hat eigene Dateien.** Die 26 Endpunkte standen mitten in `main.py`, der Tausch-Tab mitten in `app.js`. Jetzt liegen sie in `backend/community.py` (als eigener Router) und `frontend/community.js`. `main.py` ist damit gut 700 Zeilen kürzer, `app.js` gut 800. Am Verhalten ändert sich nichts – die angemeldeten Routen sind vorher wie nachher dieselben 171. Grundlage für den Ausbau zur Community (Profile, Entdecken). - Beitreten geht weiterhin **nur mit Einladungscode**, und ohne Beitritt bleibt der Tausch-Tab verborgen; ein Test hält beides fest. ## 2.88.51 – September 2026 ### Geändert - Im Zwei-Faktor-Abschnitt fällt der feste Satz „Empfehlenswert, sobald die App von außen erreichbar ist" weg, sobald die App weiß, wie sie genutzt wird. Direkt unter „nötig ist sie nicht" widersprach er sonst. ## 2.88.50 – September 2026 ### Neu - 🌐 **Die App merkt, ob sie von außen genutzt wird – und ob etwas davor steht.** Nicht durch einen Test von außen (dafür kennt sie ihre öffentliche Adresse nicht, und ein Aufruf aus dem eigenen Netz beweist nichts), sondern an den angemeldeten Anfragen selbst: Über Cloudflare kommen eigene Kopfzeilen mit, über Cloudflare Access zusätzlich dessen Anmeldenachweis, über einen Reverse Proxy mit Portfreigabe eine öffentliche Absenderadresse. Im Zwei-Faktor-Abschnitt steht dann „nur aus dem Heimnetz", „von außen, geschützt durch Cloudflare Access" oder „von außen – ohne Zugangsschutz davor". - 🔔 **Im letzten Fall ein Hinweis für Admins ohne Zwei-Faktor** – einmal, mit „Zwei-Faktor einschalten". Mit Access davor drängt nichts: Dort steht mit dem Code per E-Mail schon ein zweiter Faktor vor der App. ### Behoben - Hinweise auf dem Startbildschirm erscheinen jetzt auch auf Englisch übersetzt, wo es eine Übersetzung gibt. ## 2.88.49 – September 2026 ### Behoben - 🔐 **Rettungscodes ließen sich auf dem Handy nicht eintippen.** Das Code-Feld beim Anmelden holt den Ziffernblock – die Rettungscodes haben aber Buchstaben (a–f). Unter dem Feld steht jetzt **„Rettungscode eingeben"**, das die volle Tastatur holt. Außerdem gilt ein Rettungscode auch **ohne Bindestriche**; vorher hieß „3f9a0b12c7de" „Code stimmt nicht". ## 2.88.48 – September 2026 ### Neu - 🔐 **Zwei-Faktor schon bei der ersten Einrichtung.** Der Assistent hat einen Schritt „Absichern mit Zwei-Faktor" vor dem Abschluss (jetzt acht Schritte). Das Passwort vom Anlegen des Kontos ist schon eingetragen – QR-Code scannen, Code eintippen, Rettungscodes sichern, weiter. Es ist derselbe Block wie im Profil, nicht ein zweiter Nachbau; das Passwort liegt nur im Speicher der Seite und wird beim Ende des Assistenten vergessen. Überspringen geht wie bei jedem Schritt. ### Geändert - Als Beispiel für den Anzeigenamen im Tausch-Netzwerk steht „Steinesammler" statt eines echten Vornamens. ## 2.88.47 – September 2026 ### Behoben - 🔐 **Der QR-Code für die Zwei-Faktor-Anmeldung ließ sich nicht scannen.** Er kam mit fester Größe (265 px) und ohne `viewBox`; die Oberfläche zeigt ihn in 200 px, und ein solches Bild wird dabei nicht verkleinert, sondern abgeschnitten – rechts und unten fehlte ein Drittel. Keine Authenticator-App konnte ihn lesen (gemeldet mit dem Google Authenticator). Jetzt skaliert er, hat den Rand, den die Norm verlangt, und einen weißen Grund im Bild selbst. Nachgeprüft mit der QR-Erkennung von macOS: der alte nicht lesbar, der neue fehlerfrei. ### Geändert - 🔐 **Einschalten der Zwei-Faktor-Anmeldung beendet alle anderen Sitzungen.** Ein Gerät, das schon angemeldet war, blieb es bis zu 90 Tage – ohne je nach dem Code gefragt zu werden. Jetzt muss es sich neu anmelden; das Gerät, auf dem man einschaltet, bleibt angemeldet. ## 2.88.46 – September 2026 ### Geändert - 🛒 **„Verkaufsliste (Doppelte)" und „Fehlende Set-Figuren" stehen über dem Anlegen.** Das Feld für eine neue Einkaufsliste steht jetzt direkt über den Listen, zu denen sie gehört; die beiden Auswertungen rücken nach oben, und ihre Kästen klappen gleich unter den Knöpfen auf. - **Feld und „Anlegen" in einer Zeile.** Vorher stand „Anlegen" als eigener grüner Balken über die volle Breite darunter. Der Platzhalter heißt dafür kürzer „Neue Liste, z. B. Flohmarkt" – der alte hätte auf dem Telefon 292 px gebraucht, neben dem Knopf bleiben 210. ## 2.88.44 – September 2026 ### Behoben - ⭐ **Die Wunschliste frischt sich auf wie die Einkaufslisten.** Was ein anderes Gerät oder der Live-Scanner auf eine Einkaufsliste legte, erschien nach wenigen Sekunden von selbst – was er merkte oder wieder von der Wunschliste nahm, erst nach dem nächsten Neuladen. Die App verglich auf dem Listen-Tab nur den Stand der Einkaufslisten; jetzt zählt die Wunschliste mit. ## 2.88.43 – September 2026 ### Geändert - ⬆️ **Die Update-Prüfung fragt nicht mehr die GitHub-API.** Die erlaubt ohne Anmeldung nur 60 Abfragen je Stunde – für den ganzen Internetanschluss, geteilt mit jedem anderen Gerät dahinter. War das aufgebraucht, stand unter Mehr „GitHub gerade nicht erreichbar", und der Hinweis auf eine neue Fassung blieb aus. Jetzt liest die App die neueste Fassung aus der Weiterleitung der Release-Seite; die zählt nicht mit. - Ein Fehlschlag wird eine halbe Stunde gemerkt. Vorher fragte jeder Aufruf des Mehr-Tabs erneut bei GitHub nach. „Jetzt prüfen" fragt weiterhin sofort. ## 2.88.42 – September 2026 ### Geändert - ✏️ **Die Suchvorschläge beim manuellen Erfassen in der neuen Handschrift.** Jeder Treffer trug vier gleich große Knöpfe – „✔ Übernehmen", „☆ Merken", „🛒 Liste", „BrickLink ↗". Jetzt derselbe Aufbau wie die Trefferkarte beim Scannen: **„✔ Übernehmen" breit und grün**, ☆ und 🛒 als Zeichen daneben, „Bei BrickLink ansehen ↗" als Verweis darunter. - ⭐ **Der Stern ist gefüllt, wenn der Artikel schon auf der Wunschliste steht** – beim Scannen wie beim Suchen. Vorher erfuhr man das erst nach dem Tippen, als Zuruf „Steht schon auf der Wunschliste". - „✔ Übernehmen" ist jetzt auch auf Englisch übersetzt. ## 2.88.41 – September 2026 ### Geändert - ✅ **„Da! Ab in die Sammlung" bestätigt sichtbar.** Bisher verschwand der Artikel einfach aus der Einkaufsliste, und die Meldung erschien unten am Rand – wer auf den Artikel schaute, bekam keine Rückmeldung. Jetzt bleibt die Zeile kurz stehen, links grün markiert und mit dem Schild „✔ In der Sammlung · Gebraucht" (beim Dazulegen „· jetzt 3×"), dasselbe Grün wie „schon in der Sammlung" auf der Wunschliste. Erst danach rückt sie zu den erledigten. Die Meldung unten nennt dazu den Namen. ### Behoben - 🗓 **Das Jahr steht in den Suchvorschlägen nur noch einmal.** Beim manuellen Erfassen hieß es „sw0815 · 2017 · 2017 · Ø neu …": Der eigene Katalog gibt das Jahr gleich mit, und die Preisabfrage hängte es ein zweites Mal an. - Beim Dazulegen hieß die Meldung noch „Einkaufspreis gemittelt" – seit 2.88.40 wird addiert, wie es sich für ein Kaufbuch gehört. ## 2.88.40 – September 2026 ### Behoben - 🧾 **Käufe von der Einkaufsliste stehen jetzt im Kaufbuch.** „✔ Da! Ab in die Sammlung" schrieb den Preis direkt an den Eintrag, aber keinen Posten ins Kaufbuch – und der bezahlte Betrag ist die Summe dieser Posten. Kam danach ein weiteres Exemplar mit Preis dazu, wurde die Summe aus dem Buch neu gerechnet, und der Listenkauf fiel heraus: 5 € von der Liste plus 2 € gescannt ergaben 2 €. Beim nächsten Neustart zog die App fehlende Posten zwar nach, bis dahin aber stimmte die Summe nicht. Aufgefallen beim Test einer frisch aufgesetzten Instanz. Dabei auch behoben: „zusätzlich" **mittelte** den alten und den neuen Preis, statt sie zu addieren, und „überschreiben" ließ die alten Posten im Buch stehen. Im Kaufbuch steht als Herkunft jetzt der Name der Liste. ## 2.88.39 – September 2026 ### Behoben - ✅ **„✔ Da! Ab in die Sammlung" fragt nicht mehr alles noch einmal ab.** Für Profis öffnete der Knopf eine eigene Zeile mit „Preis [..] € – leer = BrickLink-Ø" und „✔ Gebraucht übernehmen" – dabei stehen Einkaufspreis und Zustand direkt darüber in derselben Karte. Jetzt nimmt ein Tipp, was dort steht: den Zustand aus der Pille, den Preis aus dem Einkaufsfeld (auch wenn er noch nicht mit ✓ gespeichert ist – man sieht ihn ja). Leer heißt wie bisher: BrickLink-Durchschnitt; das steht jetzt als Erklärung am Feld. Gefragt wird nur noch, wenn es wirklich etwas zu entscheiden gibt: Steht die Figur schon in diesem Zustand in der Sammlung, heißt es „zusätzlich oder überschreiben?" – mit rotem ✕ wie überall. ## 2.88.38 – September 2026 ### Geändert - 🧩 **Fehlende Set-Figuren ohne Knopfzeile.** Je Figur standen zwei gleich große Knöpfe, „☆ Merken" und „BrickLink ↗", bei gemerkten Figuren dazu ein gelbes Schild – bei 40 fehlenden Figuren viel Höhe für wenig. Jetzt wie im Katalog: **der Stern als Zeichen rechts an der Zeile**, gefüllt und gelb, wenn die Figur schon auf der Wunschliste steht; BrickLink als Verweis in der Nummernzeile. Im Fuß ist „☆ Alle auf die Wunschliste" die breite Hauptsache, CSV und Drucken stehen daneben. ### Behoben - 🔄 **Ein Neustart erzeugte Fehlerberichte.** Beim Ausrollen ist die Instanz ein paar Sekunden weg; Cloudflared antwortet dann mit seiner eigenen HTML-Seite, und die Hintergrundabfragen (Tauschbörse jede Minute, Update-Wache) laufen genau hinein. So kam am 24.09. ein „502 bei POST /api/hub/trades/sync" an – das Tunnelprotokoll zeigte 17 Sekunden Neustart und mittendrin genau diese Anfrage. Verschwiegen wird so ein Fehler trotzdem nicht: Die App fragt nach 20 Sekunden `/api/laufzeit`, seit wann der Server läuft. Ist er um den Fehler herum frisch gestartet, war es der Neustart; läuft er schon länger, war es ein echter Ausfall, und der wird gemeldet. Fehler der App selbst gehen wie bisher sofort ins Protokoll. ## 2.88.37 – September 2026 ### Geändert - 🧾 **Wunschliste, Einkaufsliste und „Auf eine Liste legen" sprechen dieselbe Sprache wie der Scan.** Überall dasselbe Muster: eine breite Hauptsache, Löschen und Abbrechen als rotes Zeichen, die Wege nach draußen als Verweise, eine Wahl als Pille. - **Wunschliste:** `[✔ Gekauft!] [🗑]` statt vier gleich großer Knöpfe im Raster; Preisverlauf und BrickLink als Verweise darunter. „Gekauft als" ist die Zeile `[Preis €] [Gebraucht] [Neu] [✕]` – „leer = BrickLink-Ø" steht als Erklärung am Feld statt als eigene Zeile. - **Einkaufsliste:** Einkaufspreis mit kleinem ✓ und daneben der Zustand als Pille – vorher zwei umrandete Zustandsknöpfe, einer gelb, und ein grüner ✓-Balken über die volle Breite. Im Fuß `[Gesamtangebot] [Archivieren] [🗑]` statt „Liste löschen" über die volle Breite. - **Auf eine Liste legen** (Trefferkarte, Suchtreffer, Formular): Einkaufspreis und Zustand in einer Zeile, die Listen als ruhige Knöpfe – im Formular war jede Liste ein grüner –, unten `[+ Neue Liste] [✕]` bzw. `‹`, wenn es zurück zur Listenwahl geht. - **Figurenliste im Set-Steckbrief:** Das ✕ im Zustands-Schritt war dort noch schwarz, als einzige Stelle der App. ### Behoben - 🌐 **Texte, die an der Übersetzung vorbeiliefen.** „+ Zur Sammlung", „83 % sicher", „Auf welche Liste?", „Flohmarkt 24.09." und die Zurufe nach dem Aufnehmen standen als deutscher Text im Markup; zwei Zurufe wurden sogar aus deutschen Teilen zusammengesetzt. Wer die App auf Englisch nutzt, las dort Deutsch. ## 2.88.36 – September 2026 ### Behoben - 🌫 **Nach jedem Scan wurde die ganze Seite grau.** Der grüne „hier geschaut"-Rahmen auf dem Foto dunkelt mit einem riesigen Schatten das Foto um sich herum ab. Der Behälter schnitt aber nicht ab – seit **v1.78.0 (31.07.)** lief der Schatten über die **ganze Seite**. Alles wurde um 28 % dunkler; nur was eine Ebene höher liegt – Kopfleiste, Trefferkarte – blieb hell. Das sah aus wie ein grauer Hintergrund, der nach dem Foto auftaucht. Der Behälter schneidet jetzt ab. Damit das Foto seinen eigenen Schlagschatten nicht verliert, trägt diesen jetzt der Behälter – dessen eigener Schatten wird vom Abschneiden nicht erfasst. ### Geändert - 📏 **Der Zustands-Schritt steht in einer Zeile**, so breit wie die Knopfreihe, die er ersetzt: `[Bezahlt €] [Gebraucht] [Neu] [✕]`. In 2.88.35 zog sich das Feld auf breiten Karten noch über 650 Pixel. Jetzt teilen sich die beiden Zustände den Platz, Feld und ✕ bleiben fest – die Karte springt beim Umschalten nicht. **Abbrechen ist ein rotes ✕**, in derselben Sprache wie „Letztes Exemplar löschen" in der Sammlung. - 📝 **„Manuell erfassen" mit eigenen Bauteilen.** Das rohe „Datei auswählen | Keine Datei ausgewählt" des Systems ist weg: Das Bild ist eine Kachel mit Vorschau und ✕, daneben „Bild wählen" und „Vom Scan" in gleicher Größe. **Typ und Zustand sind Pillen** wie im Steckbrief statt Systemauswahl, die **Anzahl hat Plus und Minus**, und unten stehen die Knöpfe wie auf der Trefferkarte – ein breiter grüner, ☆ und 🛒 als Zeichen. Dabei ist auch „Zur Sammlung" endlich überall **grün**; im Formular war es gelb. Die alten Auswahlfelder bleiben unsichtbar als Quelle der Wahrheit stehen: `m-type` wird an elf Stellen gelesen – keine davon musste angefasst werden. Wo der Code den Wert direkt setzt, zeichnen sich die Pillen nach; ein Test hält fest, dass kein Setzen ohne das dazukommt. ## 2.88.35 – September 2026 ### Geändert - 🎯 **Die Trefferkarte im Scan hat eine Hauptsache.** Vorher standen dort vier gleich große Knöpfe mit demselben kräftigen Rahmen – obwohl sie sehr unterschiedlich wichtig sind: „Zur Sammlung" will man fast immer, „Liste" fast nie, und BrickLink führt aus der App heraus. Weil sie nicht nebeneinander passten, brach jede Beschriftung um („+ Zur / Sammlung"). Jetzt derselbe Aufbau wie in der Katalogliste und im Steckbrief: **ein breiter Knopf** für die Sammlung, **Merken und Liste als Zeichen** daneben, **BrickLink als Verweis** darunter. Nach dem Merken füllt sich der Stern und das Zeichen wird gelb, statt dass „⭐ Gemerkt" den kleinen Knopf sprengt. - ⚖️ **Der Zustands-Schritt ist ruhiger.** Ein Tipp auf „Gebraucht" oder „Neu" nimmt die Figur weiter sofort auf – das ist der schnellste Weg in die Sammlung, ein Zwischenschritt wäre ein Verlust. Geändert hat sich die Gewichtung: „Abbrechen" war so groß wie das Hinzufügen selbst. Jetzt teilen sich „Bezahlt" und „Abbrechen" eine Zeile, und Abbrechen ist ein Verweis – mit derselben Trefferfläche von 44 Pixeln wie jeder Knopf. **324 → 266 px.** Der Hinweis „wird sofort gespeichert" stand vorher ohne Übersetzung im Markup; auf Englisch stand dort Deutsch. ## 2.88.34 – September 2026 ### Behoben - 🚨 **Aus dem Scan liess sich nichts mehr aufnehmen.** „+ Zur Sammlung", „☆ Merken" und „🛒 Liste" taten **gar nichts** – keine Reaktion, keine Fehlermeldung, nichts im Protokoll. Betroffen seit **2.86.5 (22.09.)**, also zwei Tage. Dieselbe Zeile wie in 2.88.32, nur an der zweiten Stelle: `2.86.5` setzte `enrichSuggestions(items, meta.detailVon || 0)` in **zwei** Funktionen – in eine, die ein `meta` hat, und in die Scan-Ansicht, die keines hat. Dort flog die Ausnahme genau **zwischen** dem Zeichnen der Karte und dem Verdrahten der Knöpfe: ``` enrichSuggestions(items, meta.detailVon || 0); ← hier knallt es wireWantButtons(…); wireCartButtons(…); ← kommt nie an …forEach([data-add]) ← kommt nie an ``` Die Karte stand also vollständig da und sah richtig aus – sie war nur taub. Die Scan-Ergebnisse brauchen kein `meta`: Sie kommen in einem Stück, es gibt keine zweite Seite. - 🛡 **Ein Wächter gegen genau diese Art Fehler.** Beide Zeilen sahen richtig aus – ein Test auf den Wortlaut hätte nichts gefunden. Der neue prüft den **Geltungsbereich**: Keine Funktion darf ein `meta` benutzen, das sie nicht hat. Kommentare und Zeichenketten bleiben dabei außen vor, sonst zählt jedes `` in einer Vorlage mit. ## 2.88.33 – September 2026 ### Dokumentation - 📖 **Das englische Handbuch war seit 2.87.0 stehen geblieben.** Nachgezogen sind die Kamera in der App (Livebild, Mediathek daneben, Zoom, der Sucherausschnitt und warum das Telefon jedes Mal nach der Freigabe fragt) und der Steckbrief mit Kopf und drei Reitern, samt Zeitspannen und Ablesen am Preisverlauf. Ein Kapitel zum Katalog-Durchblättern gibt es dort nicht – `MANUAL.md` ist eine gekürzte Fassung, kein Spiegel von `HANDBUCH.md`. ## 2.88.32 – September 2026 ### Behoben - 🔢 **Die Suche nach einer BrickLink-Nummer brach ab** (aus der App gemeldet, 24.09.2026): `Cannot read properties of undefined (reading 'detailVon')`. Fand BrickLink zu einer eingetippten Nummer etwas, stürzte das Zeichnen der Trefferliste ab – die Treffer waren da, zu sehen war nichts. Die Zeichenfunktion nimmt die Treffer und freiwillig ein paar Angaben zur Seitenzahl. Drei der vier Aufrufer haben diese Angaben nicht; im Rumpf war eine Stelle darauf vorbereitet, eine zweite nicht. **Seit 2.86.5 drin.** - 🙈 **Warum es drei Monate niemand bemerkt hat.** Der dritte dieser Wege – die Nummernsuche beim manuellen Erfassen – steht in einem Fangblock, der *jede* Ausnahme in einen Hinweistext verwandelt. Dort stand dann „Cannot read properties of undefined – der Eintrag behält die Rebrickable-Nummer", und das liest sich wie eine Meldung des Dienstes. Gemeldet wurde nichts. Ein `TypeError` ist kein Netzwerkfehler: Solche Ausnahmen gehen jetzt auch dort ins Fehlerprotokoll, statt nur als Text dazustehen. ## 2.88.31 – September 2026 ### Geändert - 🟡 **Die Marke im Kopf sieht aus wie überall sonst.** Die erste Noppe war dort weiß – als Einzige in der ganzen App. Der Grund war handfest: Die Kopfleiste ist gelb, eine gelbe Noppe darauf wäre unsichtbar. Der Preis war die Farbfolge, an der man die Marke erkennt. Statt die Farbe zu ändern, tragen jetzt **alle vier eine haarfeine Kante**. Sie hält die gelbe Noppe gegen den gelben Grund und lässt die anderen drei, wie sie sind – alle vier, weil ein Ring um genau eine von Nahem auffiele. - 🌙 **In den dunklen Themen fällt die Ausnahme ganz weg.** Dort ist die Kopfleiste dunkel; die Noppe ist auch ohne Kante bestens zu sehen. Das Blaugrau, das da stand, war nur mitkopiert. In Nova nimmt die erste Noppe jetzt die Akzentfarbe des Themas an – dort ist das ein Blau, und das ist Absicht des Themas, nicht ein verlorenes Gelb. ## 2.88.30 – September 2026 ### Behoben - 🧩 **Absturz beim Nachladen der Sammlung** (aus der App gemeldet, 24.09.2026): `NotFoundError: Failed to execute 'insertBefore' … not a child of this node`, aus dem Beobachter heraus. Die Sammlung lädt blockweise nach und fügt die Karten vor einer unsichtbaren Marke ein. Zeichnet sich die Liste neu – Suche, Filter, Sortierung –, wird der Nachschub beendet und die Liste geleert; eine beim Beobachter **bereits eingereihte Meldung** läuft aber trotzdem noch durch. Dann zeigt die Marke ins Leere. Nachgestellt und Wort für Wort derselbe Fehler; der Nachschub hält jetzt an, wenn die Marke nicht mehr zur Liste gehört. Nebenbei hätte das auch Karten aus dem **alten** Bestand in die neue Liste gesetzt, denn Daten und Zählstand gehörten noch zum vorigen Lauf. - 🔇 **Und der stillere Fehler an derselben Stelle:** Der Beobachter lag in einer Variablen der Datei, nicht beim einzelnen Lauf. Räumte ein alter Lauf auf, beendete er damit den Beobachter des **neuen** – die Liste hörte lautlos auf nachzuladen, ohne Fehlermeldung. Jeder Lauf hat jetzt seinen eigenen. ## 2.88.29 – September 2026 ### Geändert - 🧱 **Der Platzhalter für fehlende Bilder trägt die heutige Handschrift.** Er war als Einziger noch im alten Stil: ein flächiger gelber Stein mit 3 px schwarzer Kontur. Die App zeichnet Steine längst anders – weiche Ecken, keine Kontur, eine dunklere Unterkante als Tiefe. Jetzt sind es die **vier Steine des Ladezeichens**, in denselben Farben und derselben Reihenfolge: Gelb, Rot, Blau, Grün. Er steht an sechs Stellen und liest sich noch bei 28 Pixeln. ## 2.88.28 – September 2026 ### Geändert - 📚 **Die Artikel im Katalog sind endlich auseinanderzuhalten.** Der Name stand einzeilig in 162 Pixeln – nachgemessen an 80 Zeilen auf einem Telefon: **74 % abgeschnitten, und 14 Zeilenpaare sahen gleich aus.** BrickLink-Namen tragen die Identität vorn und das Unterscheidungsmerkmal hinten, also fiel genau der Teil weg, der zählt: ``` Luke Skywalker - Pilot Suit, … Dark Gray Hips, Yellow Head Luke Skywalker - Pilot Suit, … Dark Bluish Gray Hips, Yellow Head beide sichtbar als → „Luke Skywalker - Pilot Suit" ``` In der Mitte zu kürzen half kaum (14 → 13 gleiche Paare) – die Namen teilen sich Kopf *und* Schwanz. Es half nur Platz: | | ganz lesbar | |---|---| | vorher | 23 % | | Name darf umbrechen (zwei Zeilen) | 57 % | | + Merkknopf raus, Namensfeld 196 px | **75 %** | - ⭐ **Gemerkt wird jetzt im Steckbrief**, nicht mehr am Zeilenende. Dass eine Figur auf der Wunschliste steht, zeigt ein kleiner **Stern am Bild** – derselbe wie im Reiter „Wünsche"; der Katalog war die einzige Stelle mit einem Herz. Der Stern ist nur eine Anzeige, ein Tipp darauf öffnet den Steckbrief. „Hab ich" bleibt, wo es war: Das braucht man im Vorbeigehen. - 🗂 **Die Artikel stehen auf weißen Karten**, je Hunderterblock eine, und die Blocknummer liegt dazwischen auf der grauen Fläche. Sie gliedert, sie ist kein Artikel. Bisher lag die ganze Liste ohne eigene Fläche auf dem Grau, und die weißen Bildchen wirkten darin wie Löcher. ### Behoben - 🔌 **„Merken" im Steckbrief hätte lautlos aufgehört zu wirken.** Es schaltete nicht selbst, sondern suchte den passenden Knopf in der Katalogzeile und klickte ihn. Mit dem Herz wäre dieser Knopf verschwunden – und die Prüfung `if (knopf)` hätte den Fall kommentarlos verschluckt: keine Wirkung, keine Fehlermeldung. Beide Wege schalten jetzt über die Daten, und ein Fehlschlag nimmt die Anzeige wieder zurück. ## 2.88.27 – September 2026 ### Geändert - 🎚 **Die Zoomstufen versprechen nichts mehr über Objektive.** In 2.88.26 hießen sie 1× / 2× / 5×, weil moderne iPhones dort einrasten. Das war eine Zusage, die die App nicht halten kann: Auf einem Modell **ohne Teleobjektiv** wäre die 5 rein gerechnet. Und umgekehrt genauso – auf einem Gerät *mit* 5×-Tele ist ein 3× eine Zwischenstufe. **Es gibt keine Leiter, die überall auf Rastpunkte trifft.** Der Grund liegt tiefer: Die Schnittstelle **unterscheidet Optik und Rechnung nicht**. Sie meldet einen durchgehenden Bereich, in dem der digitale Zoom mitzählt (beim iPhone bis 25×); welcher Faktor mit Glas entsteht, steht nirgends. Was sich nicht unterscheiden lässt, darf die Oberfläche auch nicht andeuten. Also wieder eine gleichmäßige Leiter **1× / 2× / 3×**, die nur sagt, wie viel näher es wird – und die Kneifgeste für alles dazwischen und darüber. Gefiltert wird weiterhin: Was der gemeldete Bereich nicht hergibt, erscheint nicht. ## 2.88.26 – September 2026 ### Geändert - 🔍 **Die Zoomstufen heißen jetzt 1× / 2× / 5×.** Vorher 1/2/3 – eine Zahlenreihe, die kein Telefon so hat. Ein iPhone 16 Pro Max rastet bei 1×, 2× und 5× ein; ein 3× gibt es dort **nicht**, das läge zwischen zwei Objektiven und wäre gerechnet. Wo ein Gerät den Bereich nicht hergibt – kein Teleobjektiv –, fällt die 5 von selbst weg. Und wo es den Gerätezoom gar nicht gibt, bleibt es bei 1/2/3: Digital wird nur beschnitten, und bei 5× blieben von einem Sucherausschnitt von 599 Pixeln noch 120 übrig. **Die Zahlen benennen die Vergrößerung, nicht das Objektiv** – so wie Apples Beschriftung auch. Welches Glas dafür zum Einsatz kommt, entscheidet iOS. > **Warum eine feste Leiter und keine abgefragte:** Das Telefon gibt > seine Rastpunkte nicht heraus. Der Browser bekommt nur `{min, max, > step}`, also einen durchgehenden Bereich; die Umschaltpunkte kennt nur > AVFoundation intern. Aus `max` lässt sich der optische Endpunkt auch > nicht ablesen, weil dort der digitale Zoom mitzählt (bis 25×). ### Behoben - 🔢 **Ein Zwischenwert aus der Kneifgeste fand seine Stufe nicht mehr.** Welche Stufe ihn anzeigt, wurde mit `Math.floor` bestimmt – das setzt die Reihe 1, 2, 3 voraus. Bei 1/2/5 käme für 3,4× eine 3 heraus, die es nicht gibt: Keine Stufe trüge den Wert, die Leiste zeigte weiter „2×". ## 2.88.25 – September 2026 ### Geändert - ↩️ **Die Objektivwahl aus 2.88.24 ist wieder raus.** Am Gerät sah man, warum: iOS bietet dort gar keine einzelnen Objektive an, sondern seine virtuellen Kombi-Kameras („Rückseitige Triple-Kamera", „Rückseitige Dual-Weitwinkelkamera") – und die Frontkamera gleich mit. Viel Auswahl, wenig Gewinn. Die Zoomstufen genügen. ### Behoben - 🔍 **„1×" hätte am iPhone heraus gezoomt.** Der Gerätezoom wurde gegen den *kleinsten* Wert gerechnet, den die Kamera meldet. Bei einer Rückseite, die intern zwischen Ultraweitwinkel, Weitwinkel und Tele umschaltet, gehört dieser kleinste Wert zum **Ultraweitwinkel** – die Ansicht beim Öffnen liegt darüber. „1×" hätte also ein weiteres Bild gezeigt als das, was man gerade sieht, und „2×" wäre kaum mehr als normal gewesen. Bezugspunkt ist jetzt, was die Kamera beim Öffnen meldet: **Was du siehst, ist 1×.** Nachgemessen an einer Attrappe mit dem Verhalten einer Triple-Kamera (Bereich 1–15, Ausgangslage 2): 2× stellt 4, 3× stellt 6, und zurück auf 1× stellt wieder 2. Rein optisch, ohne Ausschnitt. ## 2.88.24 – September 2026 ### Neu - 🔭 **Die Objektive des Telefons stehen zur Wahl.** Über den Zoomstufen liegt jetzt eine Reihe mit den Kameras, die das Gerät hergibt – Weitwinkel, Ultraweitwinkel, Teleobjektiv. Wer eines davon wählt, bekommt **echte Optik** statt eines Ausschnitts. **Warum das nicht der Zoomregler tut:** Auf dem iPhone gibt es die Zoom-Schnittstelle nicht. WebKit reicht `zoom` in den Fähigkeiten einer Videospur nicht heraus, und weil alle Browser auf dem iPhone dieselbe Maschine benutzen, hilft auch kein anderer. Was es seit iOS 16.3 gibt: Die Rückkameras stehen **einzeln** in der Geräteliste. Über diesen Weg läuft die Wahl. Die Namen kommen vom Betriebssystem und sind übersetzt – darum werden sie angezeigt und nicht durchsucht. Welches Objektiv wofür taugt, weiß die App nicht: **Ein Teleobjektiv stellt oft erst ab einem halben Meter scharf** und ist für eine Figur auf dem Tisch womöglich das falsche. Also wählen lassen, nicht raten. Wo es nur eine Kamera gibt, bleibt die Reihe weg. ## 2.88.23 – September 2026 ### Neu - 🔍 **Zoom in der Kamera.** Über dem Auslöser stehen **1× / 2× / 3×**, und Kneifen mit zwei Fingern geht auch – stufenlos. Wo das Gerät es kann, zoomt der Sensor selbst (echte Details); sonst wird der Ausschnitt verkleinert. Die Stufen erscheinen nur, wo es etwas zu wählen gibt. ### Behoben - 📷 **Aufgenommen wurde viel mehr, als der Sucher zeigte.** Das Livebild füllt den Bildschirm und ist dafür beschnitten – auf einem hochkanten Telefon sieht man **26 % der Bildbreite**. Das Foto nahm trotzdem das ganze Sensorbild. Wer eine Figur einrahmte, bekam sie also auf ein Viertel geschrumpft, und die Erkennung rechnet jedes Bild auf 1024 Pixel herunter. Der alte Grund dafür war, dass sonst der Rand fehle, an dem die Figur oft steht. Der Gedanke stimmt, die Größenordnung nicht: 74 % sind kein Rand. Jetzt wird der Sucherausschnitt genommen, **plus ein Fünftel Sicherheitsrand**. Nachgemessen: Die Figur kommt ohne Zoom mit **171 statt 96 Pixeln** bei der Erkennung an, mit 3× mit **427**. - 🔓 **Nicht mehr bei jedem Foto nach der Kamera fragen.** Bisher endete der Kamerastrom beim Schließen sofort; das nächste Foto fragte neu. Wer fünf Figuren hintereinander scannte, wurde fünfmal gefragt. Der Strom bleibt jetzt eine halbe Minute stehen – beim Tabwechsel und im Hintergrund endet er sofort, damit die Kameraanzeige des Geräts nicht ohne Grund leuchtet. **Das Fragen beim App-Start bleibt.** Für eine Web-App vom Startbildschirm merkt sich iOS die Kamerafreigabe nicht über den Start hinaus (WebKit-Fehler 215884) – daran kann keine App etwas ändern. ## 2.88.22 – September 2026 ### Behoben - 📐 **Der Update-Kasten brach mitten durch den Satz.** „Die App startet gleich / neu – bitte kurz warten." – der Umbruch riss das Verb auseinander, und in der zweiten Zeile las sich „neu" wie ein neuer Gedanke. Jetzt bricht er nach „neu –", wo der Satz auch atmet. ### Dokumentation - 📖 **Handbuch und README beschreiben den Steckbrief, wie er heute aussieht.** Dort standen noch die vier Abschnitte von 2.69.0 und ein Themenfeld mit Stift, den es bei Katalogartikeln nicht mehr gibt. Neu beschrieben sind der Kopf (Bild über die volle Breite, Marken, die drei Kacheln) und die Reiter Exemplar / Preise / Mehr. - 📖 **Die Kamera in der App steht jetzt im Handbuch** (Abschnitt 4.1): Livebild beim Antippen, Mediathek darin daneben, Licht nur wo das Gerät es kann – und der Hinweis, dass es über `http://` beim Dateidialog bleibt, weil das Livebild eine gesicherte Verbindung braucht. - 📖 **Zeitspannen und Ablesen am Preisverlauf** sind beschrieben, samt dem Punkt, der leicht Fragen aufwirft: Die Spannen filtern im Browser und kosten keinen Abruf. ## 2.88.21 – September 2026 ### Behoben - 🧱 **Die Ladeanzeige im Katalog klebte unter der Filterleiste** und sagte nicht, worauf man wartet. Dort standen nur die vier Steine – ohne Abstand, ohne Beschriftung. Jetzt derselbe Block wie in Sammlung, Statistik und Tauschbörse: Luft darum und „Katalog wird geladen …" darunter. ## 2.88.20 – September 2026 ### Geändert - ↩️ **Die Schiebeschalter aus 2.88.17 und 2.88.19 sind zurückgenommen.** Sie kamen aus der Formensprache der Fenster und wirkten in den Listen geborgt: Die App lebt von kräftigen Konturen, ein weicher Schalter sieht darin aus wie aus einer anderen App hineinkopiert. Reiterreihen, Katalogfilter, Themenwahl und Suchfeld stehen wieder wie zuvor. Geblieben ist nur, was kein Geschmack ist: die Trefferfläche der Marken „Hab ich" und „Merken" im Katalog – 44 statt 35 Pixel, das Maß, das überall sonst gilt. Und die unsichtbare Vorsorge im Katalogkopf gegen das seitliche Verschieben. ## 2.88.19 – September 2026 ### Geändert - ↩️ **Zurückgenommen mit 2.88.20** – hier nur der Vollständigkeit halber, weil 2.88.20 darauf verweist: Die Schiebeschalter aus 2.88.17 waren auf alle Reiterreihen ausgeweitet worden (Wünsche/Einkaufen/Archiv/Katalog, Katalogfilter, Tauschbörse). Zwei Formensprachen übereinander sahen schlechter aus als eine, aber die richtige war die alte. Geblieben ist die Trefferfläche der Marken „Hab ich" und „Merken" im Katalog: 44 statt 35 Pixel, das Maß, das überall sonst gilt. ## 2.88.18 – September 2026 ### Behoben - 🔁 **„Bilder holen" lief endlos über dieselben Bilder.** Von BrickLink kommen die meisten Figurenbilder mit **400 Pixeln** – nachgemessen: von 100 frisch geholten waren 91 genau 400 groß und acht 800. Die Ablage verkleinert nur, sie erfindet keine Pixel; ein solches Bild ist nach dem Holen genauso klein wie vorher und galt deshalb sofort wieder als offen. Neben jedem geholten Bild liegt jetzt eine Merkdatei mit der Zielgröße im Namen. Damit endet der Lauf – und wenn die Zielgröße später steigt, gilt sie nicht mehr und alles wird noch einmal versucht. **Was das für die Schärfe heißt:** Das große Bild im Steckbrief wird nur dort besser, wo BrickLink mehr als 400 Pixel liefert. Bei vielen Figuren ist 400 schlicht das Original. - ↩️ **Der Text im Update-Fenster bricht ausgeglichen um.** „bitte kurz / warten." ließ das letzte Wort allein stehen. ## 2.88.17 – September 2026 ### Geändert - 📚 **Der Katalogkopf spricht dieselbe Sprache wie der Rest.** Die vier Filter („Alle", „Fehlt mir", „Hab ich", „Gemerkt") waren einzeln umrandete Knöpfe, einer davon gelb – das sah aus wie vier Aktionen, ist aber eine Wahl. Jetzt ein Schiebeschalter, dieselbe Form wie „Gebraucht/Neu" im Steckbrief. „Figuren/Sets" ebenso. Themenwahl und Suchfeld tragen die ruhige Fassung aus den Fenstern: weiche Kontur, Fläche statt Kasten, Rand erst beim Hineingehen. - 🛡 **Dieselbe Vorsorge wie in der Sammlung.** Im Katalogkopf steht dasselbe Auswahlfeld in derselben Bauweise, an der Safari die Seite seitlich aufschob – der Kopf schneidet jetzt ab, bevor es dort dazu kommen kann. ## 2.88.16 – September 2026 ### Geändert - 🪟 **Auch Hilfe und Figuren-Steckbrief fahren jetzt auf.** Sie hängen an einer anderen Hülle als die übrigen Fenster und blieben deshalb beim Umbau zurück – sie sprangen herein, während alles daneben aufging. Der Schleier dahinter ist jetzt ebenfalls weichgezeichnet. - 🔘 **Die Knöpfe im Katalogfenster haben dieselben Maße wie überall sonst** – mindestens 44 Pixel hoch, weiche Ecken. Am Telefon trifft man sie damit sicher. ## 2.88.15 – September 2026 ### Geändert - 🔍 **„Bilder holen" schärft die alten mit.** Bisher holte es nur, was ganz fehlte; die vor 2.88.0 abgelegten 400er blieben liegen und wurden erst scharf, wenn jemand den Artikel öffnete. Bei 780 Figuren dauert das seine Zeit. Sie gelten jetzt als offen und laufen in denselben Häppchen mit, samt Fortschrittsanzeige. **Richtigstellung:** In 2.88.3 und 2.88.13 stand, ein Sammellauf ginge gegen dasselbe BrickLink-Tageskontingent wie die Preise. Das ist falsch. Bilder kommen von den CDNs (`img.bricklink.com`, `cdn.rebrickable.com`), das Tageslimit von 5000 gilt für `api.bricklink.com`. Mit diesem falschen Argument war die bessere Lösung verworfen worden. - 🪟 **Interesse, Melden und das Gespräch sehen aus wie der Rest.** Der Steckbrief hatte die ruhigere Sprache bekommen, der Dialog auch – diese drei blieben zurück und fielen nebeneinander auf. Sie sind gleich gebaut, also tragen sie jetzt dasselbe Kleid: weiche Felder, Abstand zum Rand, gleich breite Knöpfe. - 🐞 **Ein wiederkehrender Fehler behält beides**, den ersten und den jüngsten Text. Gleichartige Meldungen werden zusammengefasst und behielten bisher nur den ersten; nach einer Behebung erhöhte ein Wiedersehen bloß den Zähler, und man sah dem Eintrag nicht an, ob er von vor oder nach der Änderung stammte. Genau daran ist am 23.09.2026 eine Runde verlorengegangen. ## 2.88.14 – September 2026 ### Behoben - 📈 **Am Telefon blieb der abgelesene Preis nicht stehen.** Beim Antippen der Kurve erschienen Datum und beide Preise – und verschwanden beim Loslassen wieder, also genau in dem Moment, in dem man sie lesen wollte. Am Zeiger ist das Ausblenden richtig: Die Maus fährt weiter, ein klebender Wert wäre dort falsch. Am Finger ist es andersherum, denn zum Ablesen muss man loslassen. Jetzt bleibt der Wert stehen, bis man die Kurve erneut antippt oder eine andere Zeitspanne wählt. ## 2.88.13 – September 2026 Diese Fassung bündelt alles seit 2.88.2. Die Zwischenschritte 2.88.3 bis 2.88.12 liefen nur auf einer Instanz und stehen unten einzeln – hier das Wesentliche für alle. ### Geändert - 🔍 **Zu klein abgelegte Bilder holen sich selbst nach**, sobald jemand die Figur oder das Set aufruft. Wer durch die Sammlung blättert, löst nichts aus. *(Hier stand zunächst, ein Sammellauf ginge gegen dasselbe BrickLink-Tageskontingent wie die Preise. Das war falsch – siehe 2.88.15.)* - 🧹 **Die Fehlersuche-Abschnitte sind raus** – sowohl die Überstands- Messung, die eigens für die Jagd unten gebaut wurde, als auch das Abschalten einzelner Bausteine aus 2.73.0. Letzteres war für die Absturzsuche gedacht; die ist abgeschlossen, und was damals gelernt wurde, steht in den Proben. Wer Bausteine abgeschaltet hatte, bekommt sie damit automatisch zurück. ### Behoben - ↔️ **Die Sammlung ließ sich seitlich schieben** – auf dem iPhone, nicht auf dem Prüfgerät. Der Rahmen um das Sortierfeld ist 98 Pixel breit, sein Inhalt meldete 175: Safari rechnet die Textbreite der `