Skip to main content

Vinarium - Releases

← App details

Nextcloud 34

Vinarium 0.5.2
Release Details
UpdatedAug. 8, 2026, 9:35 p.m.
Changelog

Fixed

  • 0.5.1 ließ sich nicht benutzen: die App rendert nicht — jede Datumsausgabe warf TypeError: (0, ns.default) is not a function. Betroffen war formatDate, und die steckt im Dashboard und fünf weiteren Ansichten, darunter der Standardroute; sichtbar blieb ein leerer Inhaltsbereich. Ursache war der Bundler-Wechsel in 0.5.1: @nextcloud/moment liefert ein UMD-Bundle ohne eigenen default-Export, und Vite 8 (Rolldown) greift bei solchen Paketen im Bibliotheks-Build direkt auf .default zu, wo Vite 7 zuvor einen Auspack-Helfer eingefügt hatte. formatDate kommt jetzt ohne die Bibliothek aus: für ein ISO-Datum als TT.MM.JJJJ genügen ein Muster und eine Kalenderprüfung über UTC. Damit hängt die Funktion an keiner Bundler-Interop mehr, und das Bundle verliert die komplette moment-Sprachdatenbank, rund 132 KB (Fixes #233)

Changed

  • Vite bleibt auf 8. Ein Rückbau auf 7 war zwischenzeitlich erwogen und wieder verworfen: die Interop ist nicht generell defekt, sondern nur für UMD-Pakete ohne default. Für gewöhnliche CommonJS-Pakete setzt der eingefügte Helfer default korrekt auf module.exports, nachgewiesen an @nextcloud/event-bus
  • @nextcloud/moment als Abhängigkeit entfernt
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturesJcpYAXpveeojzkqkXbjpOpi9ynBLpRlQ+DN8eo5jJxaHnU208XPXL6WCR6CA4X5SUlSP0qKmgiPAdN9Bn7vnozHzEf/M/YNVJX3JZRoMO+eUWVUkMoa9GORCEU4NKvvdxfAIkFQc1Gs+hYI4K3wImQLh6oLkiooelfqYH14LG6Wa9niqXCxX8COFzvOs0zmZrhgdM0cAfkfcUxBi8Y/MTnv1U6L2aeBsbu+TSNBaqE3+BjV1I4TgGf+rInpM7iFahHngmFBvZOeq04XToHc5nxeW9lL5so7eihXlz7aQk51LAbZnTjNR+Jnc4O454ApnEA9rZEIUrhhqCyJW1gQMA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.1
Release Details
UpdatedAug. 4, 2026, 4:17 a.m.
Changelog

Added

  • Etikett mit Vorder- und Rückseite — das Etikettenfoto hängt jetzt am Jahrgang statt an der einzelnen Flasche, und es lassen sich zwei Seiten hinterlegen. Die Rückseite trägt in der Praxis Rebsorten, Lage und Abfüller. Bestehende Flaschenfotos wandern als Vorderseite mit; tragen mehrere Flaschen eines Jahrgangs unterschiedliche Fotos, gewinnt die zuerst aufgenommene, keine Datei wird gelöscht (Fixes #190)
  • Etiketten frei zuschneiden — das feste 3:4-Hochformat entfällt für Etiketten. Rückenetiketten sind oft anders proportioniert; ein erzwungenes Verhältnis schnitt dort Text weg. Verkostungsfotos behalten ihr Verhalten
  • Regal-Reihenfolge per Tastatur — am aktiven Regal verschieben zwei Knöpfe es eine Position nach links oder rechts. Drag & Drop war bisher der einzige Weg und ist per Tastatur nicht bedienbar (Fixes #211)

Fixed

  • Vue lief im ausgelieferten Produktionsbundle im Entwicklungsmodus — ein pauschales 'process.env': {} in der Vite-Konfiguration ließ NODE_ENV als undefined durchlaufen, wodurch Warnungen, Prop-Typprüfungen und Devtools-Hooks im Bundle landeten. Nach der Korrektur ist das Bundle rund 100 KB kleiner (gzip 472 → 438 KB)
  • Aktivitäts-Widget zeigte das Datum ohne Jahr — Einträge aus verschiedenen Jahren waren nicht unterscheidbar, ein Datum in der Zukunft las sich wie ein Sortierfehler. Das Widget nutzt jetzt denselben Datums-Helfer wie die Vollansicht; im Frontend gibt es kein zweites Datumsformat mehr (Fixes #205)
  • Verwaiste Daten nach dem Löschen eines Benutzers — nach occ user:delete blieben Keller- und Weindaten in der Datenbank liegen, über kein UI mehr erreichbar. Ein Listener räumt beide Besitzwurzeln transaktional ab (Fixes #212)
  • Aktivitätslog: Die Sortierung „neueste zuerst" verließ sich bei Einträgen ohne Uhrzeit (Geschenk/Verlust) auf einen Zufall der strcmp-String-Länge statt auf eine benannte Regel; das Ergebnis bleibt gleich, aber ein künftiges ISO-T oder Sekundenbruchteile in einer Quelle würden die Reihenfolge nicht mehr still verschieben (Fixes #214)
  • Der Kauf-Wizard lud dasselbe Etikettenfoto einmal pro Flasche hoch — bei sechs Flaschen sechs identische Dateien. Jetzt ein Upload an den Jahrgang

Changed

  • Migration auf Vite 8 — der Bump scheiterte bisher an einem Laufzeitfehler (process is not defined). Ursache waren die esm-bundler-Builds von Vue, Pinia und Vue Router, die eine Ersetzung von process.env.NODE_ENV durch den Bundler voraussetzen (Fixes #182)
  • vinarium_vintage erhält photo_front_file_id und photo_back_file_id; vinarium_bottle.photo_file_id entfällt. Zwei getrennte Migrationsschritte, damit ein Abbruch beim Übertragen die Quelldaten intakt lässt
  • Neue Etikettenfotos liegen unter Vinarium/labels/; das bisherige Verzeichnis bleibt beim Ausliefern zugelassen, vorhandene Bilder werden nicht verschoben
  • Die Foto-Endpunkte sind von /bottles/{id}/photo nach /vintages/{id}/photo/{side} gewandert
  • Unit-Tests 80 → 115; neuer Workflow schließt referenzierte Issues beim Merge nach develop (Fixes #213, #216)
  • Dependency-Updates: ws, fast-uri, fast-xml-parser, @babel/core, postcss, immutable, js-cookie
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureKXImojCw5WspgTclqcxE/ZeZjYBXd+sJzS+dt8s5nCDmQwBQ5kt8zul8VRACrUq+2BvB/JArMf1HdNSHU77t84Dw3gxif8NZ+my5fhVLWVykW7by21VxVBeKEwtExVmlwJs1buldof734Dv8ar+6n/hPu+GBp88ey5Nvkd/kDlggsUtyY7dkV/yylVbJiDx22yvXZnuQO1WmQWz2BYs5r+JKA7MpYPhP2vQECVuPmiOI4tXQhL3gSPhX5TtzYc7JFntMRjVUzvfIFyZghtgQAuk3AyJB1NUke/8xql/0lYbw26VeEbZfbEif5jlNJMTxWxFaT0sOJkpRfdfclvvChA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.0
Release Details
UpdatedAug. 2, 2026, 9:14 p.m.
Changelog

Added

  • Weine-Tab zeigt „Im Bestand" neben „Gekauft" — bisher stand dort nur die Summe aller je gekauften Flaschen, entkorkte, verschenkte und verlorene wurden nie abgezogen. Wer 12 gekauft und eine getrunken hatte, sah weiterhin 12. Die neue Spalte zählt die tatsächlich im Keller liegenden Flaschen und ist visuell führend; die Kaufhistorie steht gedämpft daneben (Fixes #189)
  • Süße-Grad am Jahrgang — neues optionales Feld (trocken / halbtrocken / lieblich / süß) an der Vintage, weil derselbe Wein je Jahrgang unterschiedlich ausgebaut sein kann. Erfassbar im Kauf-Wizard, im Jahrgangs-Edit und im Detail-Panel, filterbar im Bestand (auch als Deep-Link), angezeigt als Chip in Bestands- und Verkostungsliste (Fixes #89)
  • Eigener Anlage-Wizard für Weine ohne Kauf — „+ Wein" im Weine-Tab öffnet einen dreistufigen Wizard (Weingut / Wein / Jahrgang, Jahrgang überspringbar). Für geschenkte Flaschen, Altbestand aus der Zeit vor der App oder eine Wunschliste (Fixes #137)
  • Regal-Reihenfolge per Drag & Drop — Regale lassen sich über einen Griff im Tab umsortieren; die Reihenfolge wird atomar persistiert (Fixes #191)
  • Aktivitätslog unter #/activity — vollständige chronologische Übersicht über Käufe, Verkostungen, Geschenke und Verluste, mit Filter nach Art und Zeitraum sowie „Mehr laden". Der Dashboard-Link „Aktivität alle ›" führt jetzt dorthin statt ersatzweise auf die Verkostungen (Fixes #92)

Fixed

  • Esc schließt Modals auch dann, wenn der Fokus in einem Eingabefeld steht (Fixes #176)
  • composer.lock war nicht mehr deckungsgleich mit composer.json: nextcloud/ocp und doctrine/dbal fehlten, composer install brach ab und die PHP-Testsuite lief lokal nicht mehr
  • Zähler in Tabs und Kopfzeile des Bestands blieben nach dem Anlegen oder Löschen von Stammdaten stehen, bis die Seite neu geladen wurde

Changed

  • Zusätzlicher Endpoint GET /api/v1/vintages/stock liefert die Bestandszahlen als Aggregat — bewusst nicht aus der bereits geladenen Flaschenliste berechnet, die gefiltert ist und dadurch stillschweigend zu wenig angezeigt hätte
  • Neuer Endpoint PUT /api/v1/cellar/{cellarId}/shelves/order nimmt die vollständige Zielreihenfolge entgegen und nummeriert in einer Transaktion durch; fremde, fehlende oder doppelte IDs werden abgewiesen
  • Neuer Endpoint GET /api/v1/activity aggregiert Käufe, Verkostungen und Flaschen-Status-Ereignisse

Migration

  • vinarium_vintage.sweetness (nullable VARCHAR(16)) wird ergänzt. Kein Backfill — „nicht angegeben" ist für jede bestehende Zeile die zutreffende Aussage
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureJEZjUPpaA+YEzvliwINv6G01IKWT3fskgKfCboLaINciM4PGkLYFJTyhlWCJO3JugedMQLJXX5In6VhT7h1bRy1Bme9vHF9zptTek1BPXY981XvUutUmM307PvGBSL6oFFESRingGoqRhkvifLtrVLV2E6No1GqhKvQ77I6axOrSibHMPlfHRUevtwgj2YdvcHul2Jns6o1LvFpQLCLgg9QTqw9JKc9SbkVHlrU8R+LGBwGn5PjQPthjGf9uHWeuz9hzn5Yw3EmGJJZBIe0kr5iZ6ZOgb8eJFqmk51e+TsZAmkTdfT4PLqzz1+9NvUnltm3DyEB3v6KY73CLiIaAtw==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.2
Release Details
UpdatedJuly 6, 2026, 4:11 a.m.
Changelog

Added

  • Nextcloud 34 wird unterstützt (max-version 33 → 34)
  • Dashboard-Volltextsuche über Weingüter, Weine und Jahrgänge — Relevanz-sortiertes Dropdown mit Tastatursteuerung (⌘K, ↑↓, Enter, Esc), Klick springt in den Bestand; Jahrgang-Treffer zeigen die Flaschenzahl im Bestand (Fixes #103)
  • Bestand: Filter in der URL — alle Filter (Farbe, Status, Jahrgang, Weingut, Trinkfenster) sind deep-link-fähig und überleben ein Neuladen; neuer Filter „Trinkfenster läuft bis" als Preset-Auswahl; Dashboard-Kachel „Bald trinken → alle" verlinkt direkt auf den passend gefilterten Bestand (Fixes #90)
  • Spenden-Link (Ko-fi) in den App-Metadaten

Changed

  • Test- und CI-Härtung: stabilere Frontend-Tests (flushPromises statt nextTick), Typecheck-Fixtures repariert, Release-bewusstes Bot-Review, Dependabot auf Security-Updates reduziert
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureP/TsINmDSdIsI7lFKDI+dh1DHzW7CpEzTHNbAUMUuzIL9yFr9FRcfBMH5XfA6DaWB3LZocpMgmPtETCuZ3FQ38ZHEySnNXTtwsyrNP3SB8YAlJJqdwMOhansu+kqoMgCRb9eUJpS3CXc+ISISUaJ4EP4e8tVWEoC8K6CADrDVLWk1QYArZDETv9qXlxPIPPcF48MrukUOOYi+IxLVFOI/l6aVho/zmKgL2RGPo+ZHEPB8zEhof427fjFrlAlsue/p/k70G20IAZKwE1b/D2H/RXW/WMTbYxRJN8dnmzLp4LuSSCm40gvmDhY5VDV1qgKnDd148xk6Hdue4oym7ZFJQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0

Nextcloud 33

Vinarium 0.5.2
Release Details
UpdatedAug. 8, 2026, 9:35 p.m.
Changelog

Fixed

  • 0.5.1 ließ sich nicht benutzen: die App rendert nicht — jede Datumsausgabe warf TypeError: (0, ns.default) is not a function. Betroffen war formatDate, und die steckt im Dashboard und fünf weiteren Ansichten, darunter der Standardroute; sichtbar blieb ein leerer Inhaltsbereich. Ursache war der Bundler-Wechsel in 0.5.1: @nextcloud/moment liefert ein UMD-Bundle ohne eigenen default-Export, und Vite 8 (Rolldown) greift bei solchen Paketen im Bibliotheks-Build direkt auf .default zu, wo Vite 7 zuvor einen Auspack-Helfer eingefügt hatte. formatDate kommt jetzt ohne die Bibliothek aus: für ein ISO-Datum als TT.MM.JJJJ genügen ein Muster und eine Kalenderprüfung über UTC. Damit hängt die Funktion an keiner Bundler-Interop mehr, und das Bundle verliert die komplette moment-Sprachdatenbank, rund 132 KB (Fixes #233)

Changed

  • Vite bleibt auf 8. Ein Rückbau auf 7 war zwischenzeitlich erwogen und wieder verworfen: die Interop ist nicht generell defekt, sondern nur für UMD-Pakete ohne default. Für gewöhnliche CommonJS-Pakete setzt der eingefügte Helfer default korrekt auf module.exports, nachgewiesen an @nextcloud/event-bus
  • @nextcloud/moment als Abhängigkeit entfernt
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturesJcpYAXpveeojzkqkXbjpOpi9ynBLpRlQ+DN8eo5jJxaHnU208XPXL6WCR6CA4X5SUlSP0qKmgiPAdN9Bn7vnozHzEf/M/YNVJX3JZRoMO+eUWVUkMoa9GORCEU4NKvvdxfAIkFQc1Gs+hYI4K3wImQLh6oLkiooelfqYH14LG6Wa9niqXCxX8COFzvOs0zmZrhgdM0cAfkfcUxBi8Y/MTnv1U6L2aeBsbu+TSNBaqE3+BjV1I4TgGf+rInpM7iFahHngmFBvZOeq04XToHc5nxeW9lL5so7eihXlz7aQk51LAbZnTjNR+Jnc4O454ApnEA9rZEIUrhhqCyJW1gQMA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.1
Release Details
UpdatedAug. 4, 2026, 4:17 a.m.
Changelog

Added

  • Etikett mit Vorder- und Rückseite — das Etikettenfoto hängt jetzt am Jahrgang statt an der einzelnen Flasche, und es lassen sich zwei Seiten hinterlegen. Die Rückseite trägt in der Praxis Rebsorten, Lage und Abfüller. Bestehende Flaschenfotos wandern als Vorderseite mit; tragen mehrere Flaschen eines Jahrgangs unterschiedliche Fotos, gewinnt die zuerst aufgenommene, keine Datei wird gelöscht (Fixes #190)
  • Etiketten frei zuschneiden — das feste 3:4-Hochformat entfällt für Etiketten. Rückenetiketten sind oft anders proportioniert; ein erzwungenes Verhältnis schnitt dort Text weg. Verkostungsfotos behalten ihr Verhalten
  • Regal-Reihenfolge per Tastatur — am aktiven Regal verschieben zwei Knöpfe es eine Position nach links oder rechts. Drag & Drop war bisher der einzige Weg und ist per Tastatur nicht bedienbar (Fixes #211)

Fixed

  • Vue lief im ausgelieferten Produktionsbundle im Entwicklungsmodus — ein pauschales 'process.env': {} in der Vite-Konfiguration ließ NODE_ENV als undefined durchlaufen, wodurch Warnungen, Prop-Typprüfungen und Devtools-Hooks im Bundle landeten. Nach der Korrektur ist das Bundle rund 100 KB kleiner (gzip 472 → 438 KB)
  • Aktivitäts-Widget zeigte das Datum ohne Jahr — Einträge aus verschiedenen Jahren waren nicht unterscheidbar, ein Datum in der Zukunft las sich wie ein Sortierfehler. Das Widget nutzt jetzt denselben Datums-Helfer wie die Vollansicht; im Frontend gibt es kein zweites Datumsformat mehr (Fixes #205)
  • Verwaiste Daten nach dem Löschen eines Benutzers — nach occ user:delete blieben Keller- und Weindaten in der Datenbank liegen, über kein UI mehr erreichbar. Ein Listener räumt beide Besitzwurzeln transaktional ab (Fixes #212)
  • Aktivitätslog: Die Sortierung „neueste zuerst" verließ sich bei Einträgen ohne Uhrzeit (Geschenk/Verlust) auf einen Zufall der strcmp-String-Länge statt auf eine benannte Regel; das Ergebnis bleibt gleich, aber ein künftiges ISO-T oder Sekundenbruchteile in einer Quelle würden die Reihenfolge nicht mehr still verschieben (Fixes #214)
  • Der Kauf-Wizard lud dasselbe Etikettenfoto einmal pro Flasche hoch — bei sechs Flaschen sechs identische Dateien. Jetzt ein Upload an den Jahrgang

Changed

  • Migration auf Vite 8 — der Bump scheiterte bisher an einem Laufzeitfehler (process is not defined). Ursache waren die esm-bundler-Builds von Vue, Pinia und Vue Router, die eine Ersetzung von process.env.NODE_ENV durch den Bundler voraussetzen (Fixes #182)
  • vinarium_vintage erhält photo_front_file_id und photo_back_file_id; vinarium_bottle.photo_file_id entfällt. Zwei getrennte Migrationsschritte, damit ein Abbruch beim Übertragen die Quelldaten intakt lässt
  • Neue Etikettenfotos liegen unter Vinarium/labels/; das bisherige Verzeichnis bleibt beim Ausliefern zugelassen, vorhandene Bilder werden nicht verschoben
  • Die Foto-Endpunkte sind von /bottles/{id}/photo nach /vintages/{id}/photo/{side} gewandert
  • Unit-Tests 80 → 115; neuer Workflow schließt referenzierte Issues beim Merge nach develop (Fixes #213, #216)
  • Dependency-Updates: ws, fast-uri, fast-xml-parser, @babel/core, postcss, immutable, js-cookie
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureKXImojCw5WspgTclqcxE/ZeZjYBXd+sJzS+dt8s5nCDmQwBQ5kt8zul8VRACrUq+2BvB/JArMf1HdNSHU77t84Dw3gxif8NZ+my5fhVLWVykW7by21VxVBeKEwtExVmlwJs1buldof734Dv8ar+6n/hPu+GBp88ey5Nvkd/kDlggsUtyY7dkV/yylVbJiDx22yvXZnuQO1WmQWz2BYs5r+JKA7MpYPhP2vQECVuPmiOI4tXQhL3gSPhX5TtzYc7JFntMRjVUzvfIFyZghtgQAuk3AyJB1NUke/8xql/0lYbw26VeEbZfbEif5jlNJMTxWxFaT0sOJkpRfdfclvvChA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.0
Release Details
UpdatedAug. 2, 2026, 9:14 p.m.
Changelog

Added

  • Weine-Tab zeigt „Im Bestand" neben „Gekauft" — bisher stand dort nur die Summe aller je gekauften Flaschen, entkorkte, verschenkte und verlorene wurden nie abgezogen. Wer 12 gekauft und eine getrunken hatte, sah weiterhin 12. Die neue Spalte zählt die tatsächlich im Keller liegenden Flaschen und ist visuell führend; die Kaufhistorie steht gedämpft daneben (Fixes #189)
  • Süße-Grad am Jahrgang — neues optionales Feld (trocken / halbtrocken / lieblich / süß) an der Vintage, weil derselbe Wein je Jahrgang unterschiedlich ausgebaut sein kann. Erfassbar im Kauf-Wizard, im Jahrgangs-Edit und im Detail-Panel, filterbar im Bestand (auch als Deep-Link), angezeigt als Chip in Bestands- und Verkostungsliste (Fixes #89)
  • Eigener Anlage-Wizard für Weine ohne Kauf — „+ Wein" im Weine-Tab öffnet einen dreistufigen Wizard (Weingut / Wein / Jahrgang, Jahrgang überspringbar). Für geschenkte Flaschen, Altbestand aus der Zeit vor der App oder eine Wunschliste (Fixes #137)
  • Regal-Reihenfolge per Drag & Drop — Regale lassen sich über einen Griff im Tab umsortieren; die Reihenfolge wird atomar persistiert (Fixes #191)
  • Aktivitätslog unter #/activity — vollständige chronologische Übersicht über Käufe, Verkostungen, Geschenke und Verluste, mit Filter nach Art und Zeitraum sowie „Mehr laden". Der Dashboard-Link „Aktivität alle ›" führt jetzt dorthin statt ersatzweise auf die Verkostungen (Fixes #92)

Fixed

  • Esc schließt Modals auch dann, wenn der Fokus in einem Eingabefeld steht (Fixes #176)
  • composer.lock war nicht mehr deckungsgleich mit composer.json: nextcloud/ocp und doctrine/dbal fehlten, composer install brach ab und die PHP-Testsuite lief lokal nicht mehr
  • Zähler in Tabs und Kopfzeile des Bestands blieben nach dem Anlegen oder Löschen von Stammdaten stehen, bis die Seite neu geladen wurde

Changed

  • Zusätzlicher Endpoint GET /api/v1/vintages/stock liefert die Bestandszahlen als Aggregat — bewusst nicht aus der bereits geladenen Flaschenliste berechnet, die gefiltert ist und dadurch stillschweigend zu wenig angezeigt hätte
  • Neuer Endpoint PUT /api/v1/cellar/{cellarId}/shelves/order nimmt die vollständige Zielreihenfolge entgegen und nummeriert in einer Transaktion durch; fremde, fehlende oder doppelte IDs werden abgewiesen
  • Neuer Endpoint GET /api/v1/activity aggregiert Käufe, Verkostungen und Flaschen-Status-Ereignisse

Migration

  • vinarium_vintage.sweetness (nullable VARCHAR(16)) wird ergänzt. Kein Backfill — „nicht angegeben" ist für jede bestehende Zeile die zutreffende Aussage
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureJEZjUPpaA+YEzvliwINv6G01IKWT3fskgKfCboLaINciM4PGkLYFJTyhlWCJO3JugedMQLJXX5In6VhT7h1bRy1Bme9vHF9zptTek1BPXY981XvUutUmM307PvGBSL6oFFESRingGoqRhkvifLtrVLV2E6No1GqhKvQ77I6axOrSibHMPlfHRUevtwgj2YdvcHul2Jns6o1LvFpQLCLgg9QTqw9JKc9SbkVHlrU8R+LGBwGn5PjQPthjGf9uHWeuz9hzn5Yw3EmGJJZBIe0kr5iZ6ZOgb8eJFqmk51e+TsZAmkTdfT4PLqzz1+9NvUnltm3DyEB3v6KY73CLiIaAtw==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.2
Release Details
UpdatedJuly 6, 2026, 4:11 a.m.
Changelog

Added

  • Nextcloud 34 wird unterstützt (max-version 33 → 34)
  • Dashboard-Volltextsuche über Weingüter, Weine und Jahrgänge — Relevanz-sortiertes Dropdown mit Tastatursteuerung (⌘K, ↑↓, Enter, Esc), Klick springt in den Bestand; Jahrgang-Treffer zeigen die Flaschenzahl im Bestand (Fixes #103)
  • Bestand: Filter in der URL — alle Filter (Farbe, Status, Jahrgang, Weingut, Trinkfenster) sind deep-link-fähig und überleben ein Neuladen; neuer Filter „Trinkfenster läuft bis" als Preset-Auswahl; Dashboard-Kachel „Bald trinken → alle" verlinkt direkt auf den passend gefilterten Bestand (Fixes #90)
  • Spenden-Link (Ko-fi) in den App-Metadaten

Changed

  • Test- und CI-Härtung: stabilere Frontend-Tests (flushPromises statt nextTick), Typecheck-Fixtures repariert, Release-bewusstes Bot-Review, Dependabot auf Security-Updates reduziert
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureP/TsINmDSdIsI7lFKDI+dh1DHzW7CpEzTHNbAUMUuzIL9yFr9FRcfBMH5XfA6DaWB3LZocpMgmPtETCuZ3FQ38ZHEySnNXTtwsyrNP3SB8YAlJJqdwMOhansu+kqoMgCRb9eUJpS3CXc+ISISUaJ4EP4e8tVWEoC8K6CADrDVLWk1QYArZDETv9qXlxPIPPcF48MrukUOOYi+IxLVFOI/l6aVho/zmKgL2RGPo+ZHEPB8zEhof427fjFrlAlsue/p/k70G20IAZKwE1b/D2H/RXW/WMTbYxRJN8dnmzLp4LuSSCm40gvmDhY5VDV1qgKnDd148xk6Hdue4oym7ZFJQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.1
Release Details
UpdatedJune 19, 2026, 9:42 p.m.
Changelog

Added

  • „Würde ich wieder kaufen"-Flag bei Verkostungen — eigenständiges Empfehlungs-Signal (ja / nein / keine Angabe), unabhängig von der Bewertung; filigraner ✓/✗-Toggle im Entkork-Dialog, Badge im Verkostungs-Detail (Fixes #143)

Fixed

  • Kauf-Wizard Schritt 4: irreführendes Button-Label „📷 Foto aufnehmen" → „Foto hinzufügen" (am Desktop ist es ein Datei-Upload), konsistent mit den übrigen Foto-Buttons (Fixes #142)
  • l10n/de.json und l10n/en.json waren durch ein gerades Anführungszeichen kein valides JSON — auf deutsches schließendes Anführungszeichen korrigiert (Fixes #146)
  • CI: Bot-Review nutzt die korrekte PR-Nummer und eine breitere Lese-Allowlist
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
Signatureu4lkF9YOU7hyuKntedlHxUVnCtEkbCH4ddoimnbpbmINVXQCFxx6hTnyo8jh7XWxBkq1Gb8H90t0zN+ih2N1xyP0KMMsfy9y48YACeM9DkFZmjMAE5bbf5ck4cdKmMI6/Tf4tiGHdZEl+s28JPN3pF2SzSMZXQ5/Yxpd3Aj2DEVlMzjwF7d46Jvv6RmYToZQZc9aWWhsbTm2SFVr6s17eKBHXrOkbvlElg2k7NlrbpMRebhHzETjdJYu3bHKAaGigvCHTfm5cuZX6MzGSYvfiBpCioH0kk+9rn+5Ai9rE+/tlZ/uzO1uXE3Ir0USCUZ2ISlhxAQfQ+zNGVHXpOuz6g==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.0
Release Details
UpdatedJune 11, 2026, 5:02 p.m.
Changelog

Großes UI-Redesign über alle Ansichten („v4-Konzept") plus neue Detail- und Foto-Funktionen.

Added

  • Dashboard-Redesign — Bestand-Hero mit Farb-Verteilung, „Bald trinken"-Vorschläge anhand des Trinkfensters, „Top & Flop" (beste/schlechteste Bewertung pro Wein × Jahrgang) und Aktivitäts-Feed (Fixes #94, #99, #91)
  • Bestand komplett neu — fünf flache Sub-Tabs (Flaschen · Weingüter · Weine · Käufe), v4-Kartentabellen mit Bewertungs-Spalte und Weingut-Filter (Fixes #111, #113, #114, #115)
  • Wein × Jahrgang — der Weine-Tab zeigt Weine gruppiert mit ihren Jahrgängen und einer farbigen Trinkfenster-Pille; der separate Jahrgänge-Tab entfällt (Fixes #132)
  • Käufe in den Stammdaten editier- und löschbar (CRUD-Konsistenz) (Fixes #116)
  • Flaschen-Detail-Modal mit fünf Reitern (Flasche · Weingut · Wein · Jahrgang · Kauf) und Vor/Zurück-Navigation samt Tastatursteuerung (Fixes #131)
  • Etiketten-Fotos — direkt beim Einlegen ins Regal aufnehmen, als Hintergrund im Regal-Slot anzeigen, jahrgangsweit geteilt mit Zuschnitt (Fixes #117, #118, #127, #128)
  • Verkostungen-Redesign — Vier-KPI-Reihe und Bewertungs-Balken in der Tabelle (Fixes #97)
  • Weinkeller/Regal-Redesign — links angeheftete Parkzone und gedämpfte Slot-Farben (Fixes #96)
  • Kauf-Wizard: Händler-Autocomplete aus bestehenden Käufen (Fixes #86)
  • Fächer werden beim Löschen automatisch neu durchnummeriert (Fixes #105)

Changed

  • Kauf-Wizard: Notiz-/Beschreibungsfelder klarer beschriftet (Cuvée vs. Jahrgang) (Fixes #87)
  • App-Store-Screenshots auf den neuen v4-Stand aktualisiert

Fixed

  • Verkostungs-Datum erlaubt keine Zukunft mehr (Fixes #85)
  • Tabellenkopf im Bestand bleibt korrekt sticky (Fixes #112)
  • Foto rendert nicht (CSRF) plus zwei Layout-Bugs im Detail-Panel (Fixes #126)
  • Diverse Review-Fixes: CSV-Export gegen Formel-Injection abgesichert, durchgängige UTC-Zeitzonen-Behandlung, vollständige englische l10n

Removed

  • Eigenständige Weine-View — in den Bestand als Stammdaten-Tab gefaltet (Fixes #95)
  • Jahrgänge-Tab — in den Wein × Jahrgang-View integriert (Fixes #132)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureqkG5mJT1X8Beech72w5aeHZmuMJEk2cFFVjtlJ7jAHjNqrKz5VBsY8fDxlH9BzmtYYyJiHfD8A+MzsG2wHhYqWkH1LCwjaBHSkAuTTc9yenTzoAYpcF7b5DVBGLWDd6Ge2MKGztAKYYz/hUbAEvx2/MFeGb44pVW1nzx6z0+AVi1lSaNvi78d1aNmCnvx6CJjDFmcbVGofR1NMHz6i+DP6SZ8xq75/QY1OOEhVPLmEEcjkvrs+qB2hOweCB7gg84bD55pXq5uaRqeFOdxcJ0dB5MfgWD02GyMCVZFZotsI3h/Wd3uQ5bhZUjEByuN0Bw04XpgFOnRhpbRIUEZdRwdg==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.3.0
Release Details
UpdatedMay 20, 2026, 12:20 p.m.
Changelog

Added

  • Flaschen verschenken und als verloren markieren — Verschenken erfasst Empfänger (mit Autosuggest aus früheren Empfängern), Datum und Anlass; Verloren erfasst Datum und Grund. Buttons im Regal-Detail und im Bestand (nur bei Flaschen im Bestand); beide geben den Slot frei. Dashboard um Zähler „Verschenkt" und „Verloren" erweitert (Fixes #66)
  • Regal-Kopfbereich als sticky Tab-Leiste — Regale als Tabs (immer sichtbar), Regal per Klick auf den Tab umbenennen, ✕ mit Bestätigungsdialog, „+"-Tab zum Anlegen eines neuen Regals. Der Kopfbereich (inkl. Parkzone) bleibt beim Scrollen langer Regale sichtbar (Fixes #64, #70)
  • Fächer umbenennen per Inline-Edit (Klick auf den Fach-Titel) (Fixes #73)
  • Sticky Header/Filter/Tabellenkopf in der Bestands-Ansicht — bei langen Listen bleiben Überschrift, Filter und Spaltenköpfe sichtbar (Fixes #65)

Changed

  • Kauf-Wizard persistiert erst beim Abschluss — „Weiter" legt nichts mehr vorzeitig an, Vor/Zurück lässt alle Felder editierbar, „Abbrechen" hinterlässt keine Geister-Daten. Producer/Wein/Jahrgang/Kauf werden am Ende in einer Transaktion erstellt (Fixes #68)
  • Bestands-Aktionen kompakt: gefüllter „Entkorken"-Button + ⋮-Menü für Verschenken/Verloren statt drei gestapelter Buttons
  • formatDate in eine gemeinsame Utility ausgelagert (statt in vier Komponenten dupliziert)

Fixed

  • Datumsanzeige im deutschen Format dd.mm.yyyy statt US-Format MM/DD/YYYY (Fixes #67)
  • PHPUnit-Suite an aktuelle Code-Signaturen angepasst — volle Suite wieder grün (Fixes #72)
  • Backend-Status-Validierung für Verschenken/Verloren (nur Flaschen im Bestand, sonst HTTP 400)
  • Diverse Robustheits-Fixes aus Code-Reviews: Race-Condition beim Click-to-Move im Regal, Dateigrößen-Prüfung vor Foto-Upload, Regalname auf DB-Limit (255) begrenzt, Event-Felder in der Bottle-Detail-Response, sichtbares Fehler-Feedback beim Zurücksetzen
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureuuQYRj3gjlbyTj7E6lnyC82tMSMEdVxfTOJdp49xqI6kbpaiWMbvqLnbCYjwJYSQC/FKGJALX/WYgVi8puxt/5snzR4D+ecg70fpfkL92MX3/1XTZc0mQ1eZGf2OaSvaGL51c+Cs2vXsm42jg3WDcW+D30vU8BJEFztDc5fD6x38On4jbPTBA7CVEt7XakJVgM//A64fT5lnMDRYqIE8gzlZm4DOZnkTCFOgwMdLGgLd4M5JDPrI+8t9yZ36dkvGsDVjh/IoY1JWm4mcjMMwDrLYRSRibQH06JUc42doPc6xvT25vmy4e9uYvoF0q7LjlCe4URFoEcm/2PDkq3wuDw==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.2.0
Release Details
UpdatedMay 19, 2026, 8:59 p.m.
Changelog

Added

  • Fächer eines Regals lassen sich nachträglich hinzufügen und löschen — „+ Fach hinzufügen"-Button am Ende eines Regals, ✕-Button pro Fach mit Bestätigungsdialog; Flaschen aus gelöschten Fächern landen in der Parkzone (Fixes #49)
  • Cellar-View: Parkzone ist jetzt unabhängig vom Cellar immer sichtbar; das letzte Regal lässt sich löschen — die View fällt dann auf einen schlanken Empty-State zurück (Fixes #48)

Changed

  • Native Browser-confirm()-Dialoge ersetzt durch NC-styled ConfirmDialog (knallroter Delete-Button, NC-Look) — durchgängig in Wine-Picker, Bottle-Move, Shelf-Delete, Compartment-Delete (Fixes #50)
  • NcButton-Migration typevariant an 21 Stellen: Primary-Buttons sind jetzt wieder NC-blau, Tertiary transparent — die visuelle Hierarchie war zuvor verloren gegangen (Fixes #55)
  • Bessere Fehlermeldungen im TastingDialog und beim Bottle-Picker bei API-Fehlern statt stiller Fehlschläge (Fixes #41)
  • App-Beschreibung in info.xml gestrafft

Fixed

  • TastingService::consumeWithTasting() ist jetzt atomar — Flasche und Verkostung werden in einer DB-Transaktion erstellt; schlägt die Verkostung fehl, wird der Flaschen-Status zurückgerollt (Fixes #36)
  • DoesNotExistException in den neuen Compartment-Endpoints wird jetzt korrekt zu HTTP 404 statt 500

Removed

  • Toter Code: consumeBottle() aus API und Store entfernt (Fixes #37)
  • Toter Code: ungenutzter Frontend-Wrapper createDefaultCellar() aus api/cellar.ts
  • Standard-Regal-Button im Empty-State entfernt — Anlegepfad ist jetzt einheitlich der „+ Neues Regal"-Wizard

Refactored

  • cssColorFor in src/utils/wineColors.ts extrahiert (6 Aufrufer statt zuvor 2 dupliziert) (Fixes #39)
  • restoreBottle als Store-Action ergänzt (Fixes #40)

Compliance

  • Apache-2.0-Attribution für mdi-grapes in THIRD_PARTY_NOTICES.md ergänzt (Fixes #38)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureNPwU40rhD1C6vL+MBWzsgJo+OWOJFr8SEkaGQNebPMvf20saNa7rP5FxdfiQ/4DUKTRgJE+088PBLeSL2UdzYmTjzVFr0MLAvwvSNBB8qUsqQNOyXL/jazq3UIiTlo4AcqDcxUpgj70M9ZHZYuN99yBTWAsdjjd5rxlKU7qCxnRvMpso29L9/OhbgqwoaQjLwr5jPcYXbVF1umhCazOZDDfbZFLDZVp5beC8w2KgFo5DcV/+1y/rKjlibKqtvx9wIPTDqTU3DwwFc07QFCNI8xyxKm6995H48uP2E8zit4ovoLOqs6DpRJEw1BnH2J/oyz3S1wNm3dfIyIkeldyEzQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.2
Release Details
UpdatedMay 18, 2026, 5:42 p.m.
Changelog

Added

  • App Store Screenshots (Dashboard, Wines, Inventory, Tasting-Detail, Tastings)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturehkhxxeKp/qxcQIGp2bRTUjO1iwK8W7X7bShRF85w9Vb3xvkc6CxS/t0CCiFdSZHD6HRkqkVKAeb9wlJKaWhQt/SaFDBJOw6xK5eX1GDVGr9y+Yi3Rrz9whjgQxTKDlZdEzZyIOphTdM7BZwwzuKpm9Sixxej0Bts8gIiy2JMlDdPaYINJObPZ6GQ5CCPVx1gjlGZbqtE9RO9uVEHRxtsPTEXTiXXINC6R/IA4LotR02LUgNz/cv7O34aAc/LpGLtEP/Ft8eTIfI0NPZKfoskgvwpX9HXst6Fm/m+CiBZIdoOZ5kWWGQBlDjuxLbkl74BFGQ4Ymv1YB9PfHgpR4WaHQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.1
Release Details
UpdatedMay 18, 2026, 12:57 p.m.
Changelog

Fixed

  • l10n: JSON-Dateien hatten keinen translations-Wrapper → HTTP 500 für Nutzer mit EN-Locale
  • l10n: ASCII-Anführungszeichen " statt typografischem " in l10n-Keys → JS-Syntaxfehler beim Laden
  • NcModal: name-Prop in TastingDialog, TastingDetailModal, EntityEditModal und PurchaseWizardModal ergänzt (Accessibility)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturejZ4bYSjrgI5OtRUgR5l1OswIygA23KIIh4dCJawWzAyoT+F+ebyMZA45lTfLqfhen8rDs+fSIyYSVsfRLqNdu5BOW8gECIzN14OzkgB80NALiv0Yi9J/69Es4DOskW09uOu85iDMOprOeXcxpRWmBikLbJSeAcfhvXR4tnF056MdcZyX9gVhtclwsYJByPfWZBCQUjXOXmoyuyfzh0iuIEF7tcHzK3EgICUGMznnQAdPQkvDHFfkhyekvr9Fzut5NNjrNtKI6iEGge79yYodoBoZYvXwG6nA3quIYHUfTvc7N5bUg/a++hcWqwpVYNQizRv7CqehzbVmaMXw4U0B+A==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.0
Release Details
UpdatedMay 18, 2026, 6:49 a.m.
Changelog

Erste offizielle Veröffentlichung — Weinverwaltung End-to-End.

Added

Datenbank + Backend - 10 DB-Tabellen via Migration (Cellar, Shelf, Compartment, Slot, Producer, Wine, Vintage, Purchase, Bottle, Tasting) - 10 Entities + 10 QBMapper-Subklassen mit Owner-Queries - CellarService: Default-Regal (234 Slots), Reconfigure mit Parkzonen-Migration - ProducerService, WineService, VintageService: CRUD mit Ownership-Checks - PurchaseService: CRUD + Bottle-Size-Validation - BottleService: Bulk-Insert, Move (409 SlotOccupied), Swap, Consume, Restore, Filter (4-Table JOIN) - TastingService: Create, Update, ConsumeWithTasting, List (denormalisiert), Detail-View - DashboardService: Stats-Aggregation (Bestand, Farb-Verteilung, Bald-Trinken) - ExportService: CSV-Export (UTF-8 BOM, Semikolon, denormalisiert) - PhotoService: Foto-Upload in NC-Files (IRootFolder), Thumbnail via NC Preview API - Foto-Upload für Flaschen (1 Foto) und Verkostungen (mehrere Fotos)

REST-API - 40+ Endpoints unter /api/v1/ (Producer, Wine, Vintage, Purchase, Bottle, Tasting, Cellar, Dashboard, Export, Photo) - DataResponse mit HTTP-Status-Mapping (404/403/400/409/201/204) - CSRF-Schutz auf allen mutierenden Endpoints

Frontend - Vue 3 + TypeScript + Vite + Pinia - PurchaseWizardModal: 4-Step-Wizard (Weingut → Wein → Jahrgang → Kauf) - Single-Action-Flow (Weiter = speichert + advanced) - Form zeigt Daten bei Auswahl eines bestehenden Eintrags - Deutsche Farblabels (Rot/Weiß/Rosé/Schaumwein/Dessertwein/Likörwein) - WinesView: 4 Tabs (Weingüter/Weine/Jahrgänge/Käufe) mit Edit/Delete - InventoryView: Flaschen-Tabelle mit Filter (Farbe/Status/Jahrgang), Foto-Upload, Flasche zurücksetzen - SimpleShelfView: Regal-Ansicht mit HTML5 Drag & Drop + Bottle-Swap, Detail-Panel mit Split-View - Slots mit 2-Zeilen-Weinname + Jahrgang - Parkzone mit Wein-Labels - Slot-Labels menschenlesbar (Fach/Ebene/Platz) - Regal-Einstellungen: Ebenen/Spalten/Versatz konfigurieren - TastingDialog: Bewertungs-Slider (0.5–10), Notizen, Anlass, Begleitung, Foto-Upload (mehrere) - TastingsView: Chronologische Tabelle mit Foto-Badge, Entkorken direkt aus Liste - TastingDetailModal: Detail-Ansicht mit Foto-Strip, Lightbox-Vollbild, verwandte Verkostungen - DashboardView: 4 Stat-Widgets, Farb-Verteilung, Bald-Trinken, letzte Verkostungen, CSV-Export - Entkorken-Funktion: Flasche öffnen + Verkostung in einem Schritt - Weingut standalone erfassen (ohne Wizard) - App-Icon: Weintraube (MDI mdi-grapes)

Internationalisierung - Vollständige Zweisprachigkeit DE + EN

Infrastruktur - Vue 3.5 + Composition API + TypeScript 5.7 + Vite 7.3 - @nextcloud/vue 9.6, @nextcloud/axios, @nextcloud/router - Pinia Stores mit Optimistic Updates + Rollback - 88 PHPUnit-Tests + 24 Vitest-Tests (112 gesamt) - Pre-Commit-Hook für OCP-only API-Enforcement

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturekRhu1SmG7i9VmNtsp1dMId19I1oCjMwkQ5d0ZY8g3BCo/IlAg2hJvUmiFyYroa/NLtTkGm6o31SissX8NrfNZku2A6csuiTBBdnsy9lTWIYXPgxZaoA+Ne6zGYEna7QxVOb7+Zi1UceD3Jj6T97kBCBaA8NzZ/1WUkKi7nwwq202N4Nmk6cMsF6UAK7u+GLHa8SapoeGZF0QkZURxOTViJqp1RZGGtJbFGPiUxbdTZXZVIVBL3O2VPKugmw2AvH3npgqcIQeso62ONhpgQk/MBTCdLvR6Uyy55v/YRlGPwCZxwMRVnaxqool0PgbXq1BdWcNdhIA8Vq5ayNErYapzQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0

Nextcloud 32

Vinarium 0.5.2
Release Details
UpdatedAug. 8, 2026, 9:35 p.m.
Changelog

Fixed

  • 0.5.1 ließ sich nicht benutzen: die App rendert nicht — jede Datumsausgabe warf TypeError: (0, ns.default) is not a function. Betroffen war formatDate, und die steckt im Dashboard und fünf weiteren Ansichten, darunter der Standardroute; sichtbar blieb ein leerer Inhaltsbereich. Ursache war der Bundler-Wechsel in 0.5.1: @nextcloud/moment liefert ein UMD-Bundle ohne eigenen default-Export, und Vite 8 (Rolldown) greift bei solchen Paketen im Bibliotheks-Build direkt auf .default zu, wo Vite 7 zuvor einen Auspack-Helfer eingefügt hatte. formatDate kommt jetzt ohne die Bibliothek aus: für ein ISO-Datum als TT.MM.JJJJ genügen ein Muster und eine Kalenderprüfung über UTC. Damit hängt die Funktion an keiner Bundler-Interop mehr, und das Bundle verliert die komplette moment-Sprachdatenbank, rund 132 KB (Fixes #233)

Changed

  • Vite bleibt auf 8. Ein Rückbau auf 7 war zwischenzeitlich erwogen und wieder verworfen: die Interop ist nicht generell defekt, sondern nur für UMD-Pakete ohne default. Für gewöhnliche CommonJS-Pakete setzt der eingefügte Helfer default korrekt auf module.exports, nachgewiesen an @nextcloud/event-bus
  • @nextcloud/moment als Abhängigkeit entfernt
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturesJcpYAXpveeojzkqkXbjpOpi9ynBLpRlQ+DN8eo5jJxaHnU208XPXL6WCR6CA4X5SUlSP0qKmgiPAdN9Bn7vnozHzEf/M/YNVJX3JZRoMO+eUWVUkMoa9GORCEU4NKvvdxfAIkFQc1Gs+hYI4K3wImQLh6oLkiooelfqYH14LG6Wa9niqXCxX8COFzvOs0zmZrhgdM0cAfkfcUxBi8Y/MTnv1U6L2aeBsbu+TSNBaqE3+BjV1I4TgGf+rInpM7iFahHngmFBvZOeq04XToHc5nxeW9lL5so7eihXlz7aQk51LAbZnTjNR+Jnc4O454ApnEA9rZEIUrhhqCyJW1gQMA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.1
Release Details
UpdatedAug. 4, 2026, 4:17 a.m.
Changelog

Added

  • Etikett mit Vorder- und Rückseite — das Etikettenfoto hängt jetzt am Jahrgang statt an der einzelnen Flasche, und es lassen sich zwei Seiten hinterlegen. Die Rückseite trägt in der Praxis Rebsorten, Lage und Abfüller. Bestehende Flaschenfotos wandern als Vorderseite mit; tragen mehrere Flaschen eines Jahrgangs unterschiedliche Fotos, gewinnt die zuerst aufgenommene, keine Datei wird gelöscht (Fixes #190)
  • Etiketten frei zuschneiden — das feste 3:4-Hochformat entfällt für Etiketten. Rückenetiketten sind oft anders proportioniert; ein erzwungenes Verhältnis schnitt dort Text weg. Verkostungsfotos behalten ihr Verhalten
  • Regal-Reihenfolge per Tastatur — am aktiven Regal verschieben zwei Knöpfe es eine Position nach links oder rechts. Drag & Drop war bisher der einzige Weg und ist per Tastatur nicht bedienbar (Fixes #211)

Fixed

  • Vue lief im ausgelieferten Produktionsbundle im Entwicklungsmodus — ein pauschales 'process.env': {} in der Vite-Konfiguration ließ NODE_ENV als undefined durchlaufen, wodurch Warnungen, Prop-Typprüfungen und Devtools-Hooks im Bundle landeten. Nach der Korrektur ist das Bundle rund 100 KB kleiner (gzip 472 → 438 KB)
  • Aktivitäts-Widget zeigte das Datum ohne Jahr — Einträge aus verschiedenen Jahren waren nicht unterscheidbar, ein Datum in der Zukunft las sich wie ein Sortierfehler. Das Widget nutzt jetzt denselben Datums-Helfer wie die Vollansicht; im Frontend gibt es kein zweites Datumsformat mehr (Fixes #205)
  • Verwaiste Daten nach dem Löschen eines Benutzers — nach occ user:delete blieben Keller- und Weindaten in der Datenbank liegen, über kein UI mehr erreichbar. Ein Listener räumt beide Besitzwurzeln transaktional ab (Fixes #212)
  • Aktivitätslog: Die Sortierung „neueste zuerst" verließ sich bei Einträgen ohne Uhrzeit (Geschenk/Verlust) auf einen Zufall der strcmp-String-Länge statt auf eine benannte Regel; das Ergebnis bleibt gleich, aber ein künftiges ISO-T oder Sekundenbruchteile in einer Quelle würden die Reihenfolge nicht mehr still verschieben (Fixes #214)
  • Der Kauf-Wizard lud dasselbe Etikettenfoto einmal pro Flasche hoch — bei sechs Flaschen sechs identische Dateien. Jetzt ein Upload an den Jahrgang

Changed

  • Migration auf Vite 8 — der Bump scheiterte bisher an einem Laufzeitfehler (process is not defined). Ursache waren die esm-bundler-Builds von Vue, Pinia und Vue Router, die eine Ersetzung von process.env.NODE_ENV durch den Bundler voraussetzen (Fixes #182)
  • vinarium_vintage erhält photo_front_file_id und photo_back_file_id; vinarium_bottle.photo_file_id entfällt. Zwei getrennte Migrationsschritte, damit ein Abbruch beim Übertragen die Quelldaten intakt lässt
  • Neue Etikettenfotos liegen unter Vinarium/labels/; das bisherige Verzeichnis bleibt beim Ausliefern zugelassen, vorhandene Bilder werden nicht verschoben
  • Die Foto-Endpunkte sind von /bottles/{id}/photo nach /vintages/{id}/photo/{side} gewandert
  • Unit-Tests 80 → 115; neuer Workflow schließt referenzierte Issues beim Merge nach develop (Fixes #213, #216)
  • Dependency-Updates: ws, fast-uri, fast-xml-parser, @babel/core, postcss, immutable, js-cookie
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureKXImojCw5WspgTclqcxE/ZeZjYBXd+sJzS+dt8s5nCDmQwBQ5kt8zul8VRACrUq+2BvB/JArMf1HdNSHU77t84Dw3gxif8NZ+my5fhVLWVykW7by21VxVBeKEwtExVmlwJs1buldof734Dv8ar+6n/hPu+GBp88ey5Nvkd/kDlggsUtyY7dkV/yylVbJiDx22yvXZnuQO1WmQWz2BYs5r+JKA7MpYPhP2vQECVuPmiOI4tXQhL3gSPhX5TtzYc7JFntMRjVUzvfIFyZghtgQAuk3AyJB1NUke/8xql/0lYbw26VeEbZfbEif5jlNJMTxWxFaT0sOJkpRfdfclvvChA==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.5.0
Release Details
UpdatedAug. 2, 2026, 9:14 p.m.
Changelog

Added

  • Weine-Tab zeigt „Im Bestand" neben „Gekauft" — bisher stand dort nur die Summe aller je gekauften Flaschen, entkorkte, verschenkte und verlorene wurden nie abgezogen. Wer 12 gekauft und eine getrunken hatte, sah weiterhin 12. Die neue Spalte zählt die tatsächlich im Keller liegenden Flaschen und ist visuell führend; die Kaufhistorie steht gedämpft daneben (Fixes #189)
  • Süße-Grad am Jahrgang — neues optionales Feld (trocken / halbtrocken / lieblich / süß) an der Vintage, weil derselbe Wein je Jahrgang unterschiedlich ausgebaut sein kann. Erfassbar im Kauf-Wizard, im Jahrgangs-Edit und im Detail-Panel, filterbar im Bestand (auch als Deep-Link), angezeigt als Chip in Bestands- und Verkostungsliste (Fixes #89)
  • Eigener Anlage-Wizard für Weine ohne Kauf — „+ Wein" im Weine-Tab öffnet einen dreistufigen Wizard (Weingut / Wein / Jahrgang, Jahrgang überspringbar). Für geschenkte Flaschen, Altbestand aus der Zeit vor der App oder eine Wunschliste (Fixes #137)
  • Regal-Reihenfolge per Drag & Drop — Regale lassen sich über einen Griff im Tab umsortieren; die Reihenfolge wird atomar persistiert (Fixes #191)
  • Aktivitätslog unter #/activity — vollständige chronologische Übersicht über Käufe, Verkostungen, Geschenke und Verluste, mit Filter nach Art und Zeitraum sowie „Mehr laden". Der Dashboard-Link „Aktivität alle ›" führt jetzt dorthin statt ersatzweise auf die Verkostungen (Fixes #92)

Fixed

  • Esc schließt Modals auch dann, wenn der Fokus in einem Eingabefeld steht (Fixes #176)
  • composer.lock war nicht mehr deckungsgleich mit composer.json: nextcloud/ocp und doctrine/dbal fehlten, composer install brach ab und die PHP-Testsuite lief lokal nicht mehr
  • Zähler in Tabs und Kopfzeile des Bestands blieben nach dem Anlegen oder Löschen von Stammdaten stehen, bis die Seite neu geladen wurde

Changed

  • Zusätzlicher Endpoint GET /api/v1/vintages/stock liefert die Bestandszahlen als Aggregat — bewusst nicht aus der bereits geladenen Flaschenliste berechnet, die gefiltert ist und dadurch stillschweigend zu wenig angezeigt hätte
  • Neuer Endpoint PUT /api/v1/cellar/{cellarId}/shelves/order nimmt die vollständige Zielreihenfolge entgegen und nummeriert in einer Transaktion durch; fremde, fehlende oder doppelte IDs werden abgewiesen
  • Neuer Endpoint GET /api/v1/activity aggregiert Käufe, Verkostungen und Flaschen-Status-Ereignisse

Migration

  • vinarium_vintage.sweetness (nullable VARCHAR(16)) wird ergänzt. Kein Backfill — „nicht angegeben" ist für jede bestehende Zeile die zutreffende Aussage
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureJEZjUPpaA+YEzvliwINv6G01IKWT3fskgKfCboLaINciM4PGkLYFJTyhlWCJO3JugedMQLJXX5In6VhT7h1bRy1Bme9vHF9zptTek1BPXY981XvUutUmM307PvGBSL6oFFESRingGoqRhkvifLtrVLV2E6No1GqhKvQ77I6axOrSibHMPlfHRUevtwgj2YdvcHul2Jns6o1LvFpQLCLgg9QTqw9JKc9SbkVHlrU8R+LGBwGn5PjQPthjGf9uHWeuz9hzn5Yw3EmGJJZBIe0kr5iZ6ZOgb8eJFqmk51e+TsZAmkTdfT4PLqzz1+9NvUnltm3DyEB3v6KY73CLiIaAtw==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.2
Release Details
UpdatedJuly 6, 2026, 4:11 a.m.
Changelog

Added

  • Nextcloud 34 wird unterstützt (max-version 33 → 34)
  • Dashboard-Volltextsuche über Weingüter, Weine und Jahrgänge — Relevanz-sortiertes Dropdown mit Tastatursteuerung (⌘K, ↑↓, Enter, Esc), Klick springt in den Bestand; Jahrgang-Treffer zeigen die Flaschenzahl im Bestand (Fixes #103)
  • Bestand: Filter in der URL — alle Filter (Farbe, Status, Jahrgang, Weingut, Trinkfenster) sind deep-link-fähig und überleben ein Neuladen; neuer Filter „Trinkfenster läuft bis" als Preset-Auswahl; Dashboard-Kachel „Bald trinken → alle" verlinkt direkt auf den passend gefilterten Bestand (Fixes #90)
  • Spenden-Link (Ko-fi) in den App-Metadaten

Changed

  • Test- und CI-Härtung: stabilere Frontend-Tests (flushPromises statt nextTick), Typecheck-Fixtures repariert, Release-bewusstes Bot-Review, Dependabot auf Security-Updates reduziert
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureP/TsINmDSdIsI7lFKDI+dh1DHzW7CpEzTHNbAUMUuzIL9yFr9FRcfBMH5XfA6DaWB3LZocpMgmPtETCuZ3FQ38ZHEySnNXTtwsyrNP3SB8YAlJJqdwMOhansu+kqoMgCRb9eUJpS3CXc+ISISUaJ4EP4e8tVWEoC8K6CADrDVLWk1QYArZDETv9qXlxPIPPcF48MrukUOOYi+IxLVFOI/l6aVho/zmKgL2RGPo+ZHEPB8zEhof427fjFrlAlsue/p/k70G20IAZKwE1b/D2H/RXW/WMTbYxRJN8dnmzLp4LuSSCm40gvmDhY5VDV1qgKnDd148xk6Hdue4oym7ZFJQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.1
Release Details
UpdatedJune 19, 2026, 9:42 p.m.
Changelog

Added

  • „Würde ich wieder kaufen"-Flag bei Verkostungen — eigenständiges Empfehlungs-Signal (ja / nein / keine Angabe), unabhängig von der Bewertung; filigraner ✓/✗-Toggle im Entkork-Dialog, Badge im Verkostungs-Detail (Fixes #143)

Fixed

  • Kauf-Wizard Schritt 4: irreführendes Button-Label „📷 Foto aufnehmen" → „Foto hinzufügen" (am Desktop ist es ein Datei-Upload), konsistent mit den übrigen Foto-Buttons (Fixes #142)
  • l10n/de.json und l10n/en.json waren durch ein gerades Anführungszeichen kein valides JSON — auf deutsches schließendes Anführungszeichen korrigiert (Fixes #146)
  • CI: Bot-Review nutzt die korrekte PR-Nummer und eine breitere Lese-Allowlist
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
Signatureu4lkF9YOU7hyuKntedlHxUVnCtEkbCH4ddoimnbpbmINVXQCFxx6hTnyo8jh7XWxBkq1Gb8H90t0zN+ih2N1xyP0KMMsfy9y48YACeM9DkFZmjMAE5bbf5ck4cdKmMI6/Tf4tiGHdZEl+s28JPN3pF2SzSMZXQ5/Yxpd3Aj2DEVlMzjwF7d46Jvv6RmYToZQZc9aWWhsbTm2SFVr6s17eKBHXrOkbvlElg2k7NlrbpMRebhHzETjdJYu3bHKAaGigvCHTfm5cuZX6MzGSYvfiBpCioH0kk+9rn+5Ai9rE+/tlZ/uzO1uXE3Ir0USCUZ2ISlhxAQfQ+zNGVHXpOuz6g==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.4.0
Release Details
UpdatedJune 11, 2026, 5:02 p.m.
Changelog

Großes UI-Redesign über alle Ansichten („v4-Konzept") plus neue Detail- und Foto-Funktionen.

Added

  • Dashboard-Redesign — Bestand-Hero mit Farb-Verteilung, „Bald trinken"-Vorschläge anhand des Trinkfensters, „Top & Flop" (beste/schlechteste Bewertung pro Wein × Jahrgang) und Aktivitäts-Feed (Fixes #94, #99, #91)
  • Bestand komplett neu — fünf flache Sub-Tabs (Flaschen · Weingüter · Weine · Käufe), v4-Kartentabellen mit Bewertungs-Spalte und Weingut-Filter (Fixes #111, #113, #114, #115)
  • Wein × Jahrgang — der Weine-Tab zeigt Weine gruppiert mit ihren Jahrgängen und einer farbigen Trinkfenster-Pille; der separate Jahrgänge-Tab entfällt (Fixes #132)
  • Käufe in den Stammdaten editier- und löschbar (CRUD-Konsistenz) (Fixes #116)
  • Flaschen-Detail-Modal mit fünf Reitern (Flasche · Weingut · Wein · Jahrgang · Kauf) und Vor/Zurück-Navigation samt Tastatursteuerung (Fixes #131)
  • Etiketten-Fotos — direkt beim Einlegen ins Regal aufnehmen, als Hintergrund im Regal-Slot anzeigen, jahrgangsweit geteilt mit Zuschnitt (Fixes #117, #118, #127, #128)
  • Verkostungen-Redesign — Vier-KPI-Reihe und Bewertungs-Balken in der Tabelle (Fixes #97)
  • Weinkeller/Regal-Redesign — links angeheftete Parkzone und gedämpfte Slot-Farben (Fixes #96)
  • Kauf-Wizard: Händler-Autocomplete aus bestehenden Käufen (Fixes #86)
  • Fächer werden beim Löschen automatisch neu durchnummeriert (Fixes #105)

Changed

  • Kauf-Wizard: Notiz-/Beschreibungsfelder klarer beschriftet (Cuvée vs. Jahrgang) (Fixes #87)
  • App-Store-Screenshots auf den neuen v4-Stand aktualisiert

Fixed

  • Verkostungs-Datum erlaubt keine Zukunft mehr (Fixes #85)
  • Tabellenkopf im Bestand bleibt korrekt sticky (Fixes #112)
  • Foto rendert nicht (CSRF) plus zwei Layout-Bugs im Detail-Panel (Fixes #126)
  • Diverse Review-Fixes: CSV-Export gegen Formel-Injection abgesichert, durchgängige UTC-Zeitzonen-Behandlung, vollständige englische l10n

Removed

  • Eigenständige Weine-View — in den Bestand als Stammdaten-Tab gefaltet (Fixes #95)
  • Jahrgänge-Tab — in den Wein × Jahrgang-View integriert (Fixes #132)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureqkG5mJT1X8Beech72w5aeHZmuMJEk2cFFVjtlJ7jAHjNqrKz5VBsY8fDxlH9BzmtYYyJiHfD8A+MzsG2wHhYqWkH1LCwjaBHSkAuTTc9yenTzoAYpcF7b5DVBGLWDd6Ge2MKGztAKYYz/hUbAEvx2/MFeGb44pVW1nzx6z0+AVi1lSaNvi78d1aNmCnvx6CJjDFmcbVGofR1NMHz6i+DP6SZ8xq75/QY1OOEhVPLmEEcjkvrs+qB2hOweCB7gg84bD55pXq5uaRqeFOdxcJ0dB5MfgWD02GyMCVZFZotsI3h/Wd3uQ5bhZUjEByuN0Bw04XpgFOnRhpbRIUEZdRwdg==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.3.0
Release Details
UpdatedMay 20, 2026, 12:20 p.m.
Changelog

Added

  • Flaschen verschenken und als verloren markieren — Verschenken erfasst Empfänger (mit Autosuggest aus früheren Empfängern), Datum und Anlass; Verloren erfasst Datum und Grund. Buttons im Regal-Detail und im Bestand (nur bei Flaschen im Bestand); beide geben den Slot frei. Dashboard um Zähler „Verschenkt" und „Verloren" erweitert (Fixes #66)
  • Regal-Kopfbereich als sticky Tab-Leiste — Regale als Tabs (immer sichtbar), Regal per Klick auf den Tab umbenennen, ✕ mit Bestätigungsdialog, „+"-Tab zum Anlegen eines neuen Regals. Der Kopfbereich (inkl. Parkzone) bleibt beim Scrollen langer Regale sichtbar (Fixes #64, #70)
  • Fächer umbenennen per Inline-Edit (Klick auf den Fach-Titel) (Fixes #73)
  • Sticky Header/Filter/Tabellenkopf in der Bestands-Ansicht — bei langen Listen bleiben Überschrift, Filter und Spaltenköpfe sichtbar (Fixes #65)

Changed

  • Kauf-Wizard persistiert erst beim Abschluss — „Weiter" legt nichts mehr vorzeitig an, Vor/Zurück lässt alle Felder editierbar, „Abbrechen" hinterlässt keine Geister-Daten. Producer/Wein/Jahrgang/Kauf werden am Ende in einer Transaktion erstellt (Fixes #68)
  • Bestands-Aktionen kompakt: gefüllter „Entkorken"-Button + ⋮-Menü für Verschenken/Verloren statt drei gestapelter Buttons
  • formatDate in eine gemeinsame Utility ausgelagert (statt in vier Komponenten dupliziert)

Fixed

  • Datumsanzeige im deutschen Format dd.mm.yyyy statt US-Format MM/DD/YYYY (Fixes #67)
  • PHPUnit-Suite an aktuelle Code-Signaturen angepasst — volle Suite wieder grün (Fixes #72)
  • Backend-Status-Validierung für Verschenken/Verloren (nur Flaschen im Bestand, sonst HTTP 400)
  • Diverse Robustheits-Fixes aus Code-Reviews: Race-Condition beim Click-to-Move im Regal, Dateigrößen-Prüfung vor Foto-Upload, Regalname auf DB-Limit (255) begrenzt, Event-Felder in der Bottle-Detail-Response, sichtbares Fehler-Feedback beim Zurücksetzen
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureuuQYRj3gjlbyTj7E6lnyC82tMSMEdVxfTOJdp49xqI6kbpaiWMbvqLnbCYjwJYSQC/FKGJALX/WYgVi8puxt/5snzR4D+ecg70fpfkL92MX3/1XTZc0mQ1eZGf2OaSvaGL51c+Cs2vXsm42jg3WDcW+D30vU8BJEFztDc5fD6x38On4jbPTBA7CVEt7XakJVgM//A64fT5lnMDRYqIE8gzlZm4DOZnkTCFOgwMdLGgLd4M5JDPrI+8t9yZ36dkvGsDVjh/IoY1JWm4mcjMMwDrLYRSRibQH06JUc42doPc6xvT25vmy4e9uYvoF0q7LjlCe4URFoEcm/2PDkq3wuDw==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.2.0
Release Details
UpdatedMay 19, 2026, 8:59 p.m.
Changelog

Added

  • Fächer eines Regals lassen sich nachträglich hinzufügen und löschen — „+ Fach hinzufügen"-Button am Ende eines Regals, ✕-Button pro Fach mit Bestätigungsdialog; Flaschen aus gelöschten Fächern landen in der Parkzone (Fixes #49)
  • Cellar-View: Parkzone ist jetzt unabhängig vom Cellar immer sichtbar; das letzte Regal lässt sich löschen — die View fällt dann auf einen schlanken Empty-State zurück (Fixes #48)

Changed

  • Native Browser-confirm()-Dialoge ersetzt durch NC-styled ConfirmDialog (knallroter Delete-Button, NC-Look) — durchgängig in Wine-Picker, Bottle-Move, Shelf-Delete, Compartment-Delete (Fixes #50)
  • NcButton-Migration typevariant an 21 Stellen: Primary-Buttons sind jetzt wieder NC-blau, Tertiary transparent — die visuelle Hierarchie war zuvor verloren gegangen (Fixes #55)
  • Bessere Fehlermeldungen im TastingDialog und beim Bottle-Picker bei API-Fehlern statt stiller Fehlschläge (Fixes #41)
  • App-Beschreibung in info.xml gestrafft

Fixed

  • TastingService::consumeWithTasting() ist jetzt atomar — Flasche und Verkostung werden in einer DB-Transaktion erstellt; schlägt die Verkostung fehl, wird der Flaschen-Status zurückgerollt (Fixes #36)
  • DoesNotExistException in den neuen Compartment-Endpoints wird jetzt korrekt zu HTTP 404 statt 500

Removed

  • Toter Code: consumeBottle() aus API und Store entfernt (Fixes #37)
  • Toter Code: ungenutzter Frontend-Wrapper createDefaultCellar() aus api/cellar.ts
  • Standard-Regal-Button im Empty-State entfernt — Anlegepfad ist jetzt einheitlich der „+ Neues Regal"-Wizard

Refactored

  • cssColorFor in src/utils/wineColors.ts extrahiert (6 Aufrufer statt zuvor 2 dupliziert) (Fixes #39)
  • restoreBottle als Store-Action ergänzt (Fixes #40)

Compliance

  • Apache-2.0-Attribution für mdi-grapes in THIRD_PARTY_NOTICES.md ergänzt (Fixes #38)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignatureNPwU40rhD1C6vL+MBWzsgJo+OWOJFr8SEkaGQNebPMvf20saNa7rP5FxdfiQ/4DUKTRgJE+088PBLeSL2UdzYmTjzVFr0MLAvwvSNBB8qUsqQNOyXL/jazq3UIiTlo4AcqDcxUpgj70M9ZHZYuN99yBTWAsdjjd5rxlKU7qCxnRvMpso29L9/OhbgqwoaQjLwr5jPcYXbVF1umhCazOZDDfbZFLDZVp5beC8w2KgFo5DcV/+1y/rKjlibKqtvx9wIPTDqTU3DwwFc07QFCNI8xyxKm6995H48uP2E8zit4ovoLOqs6DpRJEw1BnH2J/oyz3S1wNm3dfIyIkeldyEzQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.2
Release Details
UpdatedMay 18, 2026, 5:42 p.m.
Changelog

Added

  • App Store Screenshots (Dashboard, Wines, Inventory, Tasting-Detail, Tastings)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturehkhxxeKp/qxcQIGp2bRTUjO1iwK8W7X7bShRF85w9Vb3xvkc6CxS/t0CCiFdSZHD6HRkqkVKAeb9wlJKaWhQt/SaFDBJOw6xK5eX1GDVGr9y+Yi3Rrz9whjgQxTKDlZdEzZyIOphTdM7BZwwzuKpm9Sixxej0Bts8gIiy2JMlDdPaYINJObPZ6GQ5CCPVx1gjlGZbqtE9RO9uVEHRxtsPTEXTiXXINC6R/IA4LotR02LUgNz/cv7O34aAc/LpGLtEP/Ft8eTIfI0NPZKfoskgvwpX9HXst6Fm/m+CiBZIdoOZ5kWWGQBlDjuxLbkl74BFGQ4Ymv1YB9PfHgpR4WaHQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.1
Release Details
UpdatedMay 18, 2026, 12:57 p.m.
Changelog

Fixed

  • l10n: JSON-Dateien hatten keinen translations-Wrapper → HTTP 500 für Nutzer mit EN-Locale
  • l10n: ASCII-Anführungszeichen " statt typografischem " in l10n-Keys → JS-Syntaxfehler beim Laden
  • NcModal: name-Prop in TastingDialog, TastingDetailModal, EntityEditModal und PurchaseWizardModal ergänzt (Accessibility)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturejZ4bYSjrgI5OtRUgR5l1OswIygA23KIIh4dCJawWzAyoT+F+ebyMZA45lTfLqfhen8rDs+fSIyYSVsfRLqNdu5BOW8gECIzN14OzkgB80NALiv0Yi9J/69Es4DOskW09uOu85iDMOprOeXcxpRWmBikLbJSeAcfhvXR4tnF056MdcZyX9gVhtclwsYJByPfWZBCQUjXOXmoyuyfzh0iuIEF7tcHzK3EgICUGMznnQAdPQkvDHFfkhyekvr9Fzut5NNjrNtKI6iEGge79yYodoBoZYvXwG6nA3quIYHUfTvc7N5bUg/a++hcWqwpVYNQizRv7CqehzbVmaMXw4U0B+A==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0
Vinarium 0.1.0
Release Details
UpdatedMay 18, 2026, 6:49 a.m.
Changelog

Erste offizielle Veröffentlichung — Weinverwaltung End-to-End.

Added

Datenbank + Backend - 10 DB-Tabellen via Migration (Cellar, Shelf, Compartment, Slot, Producer, Wine, Vintage, Purchase, Bottle, Tasting) - 10 Entities + 10 QBMapper-Subklassen mit Owner-Queries - CellarService: Default-Regal (234 Slots), Reconfigure mit Parkzonen-Migration - ProducerService, WineService, VintageService: CRUD mit Ownership-Checks - PurchaseService: CRUD + Bottle-Size-Validation - BottleService: Bulk-Insert, Move (409 SlotOccupied), Swap, Consume, Restore, Filter (4-Table JOIN) - TastingService: Create, Update, ConsumeWithTasting, List (denormalisiert), Detail-View - DashboardService: Stats-Aggregation (Bestand, Farb-Verteilung, Bald-Trinken) - ExportService: CSV-Export (UTF-8 BOM, Semikolon, denormalisiert) - PhotoService: Foto-Upload in NC-Files (IRootFolder), Thumbnail via NC Preview API - Foto-Upload für Flaschen (1 Foto) und Verkostungen (mehrere Fotos)

REST-API - 40+ Endpoints unter /api/v1/ (Producer, Wine, Vintage, Purchase, Bottle, Tasting, Cellar, Dashboard, Export, Photo) - DataResponse mit HTTP-Status-Mapping (404/403/400/409/201/204) - CSRF-Schutz auf allen mutierenden Endpoints

Frontend - Vue 3 + TypeScript + Vite + Pinia - PurchaseWizardModal: 4-Step-Wizard (Weingut → Wein → Jahrgang → Kauf) - Single-Action-Flow (Weiter = speichert + advanced) - Form zeigt Daten bei Auswahl eines bestehenden Eintrags - Deutsche Farblabels (Rot/Weiß/Rosé/Schaumwein/Dessertwein/Likörwein) - WinesView: 4 Tabs (Weingüter/Weine/Jahrgänge/Käufe) mit Edit/Delete - InventoryView: Flaschen-Tabelle mit Filter (Farbe/Status/Jahrgang), Foto-Upload, Flasche zurücksetzen - SimpleShelfView: Regal-Ansicht mit HTML5 Drag & Drop + Bottle-Swap, Detail-Panel mit Split-View - Slots mit 2-Zeilen-Weinname + Jahrgang - Parkzone mit Wein-Labels - Slot-Labels menschenlesbar (Fach/Ebene/Platz) - Regal-Einstellungen: Ebenen/Spalten/Versatz konfigurieren - TastingDialog: Bewertungs-Slider (0.5–10), Notizen, Anlass, Begleitung, Foto-Upload (mehrere) - TastingsView: Chronologische Tabelle mit Foto-Badge, Entkorken direkt aus Liste - TastingDetailModal: Detail-Ansicht mit Foto-Strip, Lightbox-Vollbild, verwandte Verkostungen - DashboardView: 4 Stat-Widgets, Farb-Verteilung, Bald-Trinken, letzte Verkostungen, CSV-Export - Entkorken-Funktion: Flasche öffnen + Verkostung in einem Schritt - Weingut standalone erfassen (ohne Wizard) - App-Icon: Weintraube (MDI mdi-grapes)

Internationalisierung - Vollständige Zweisprachigkeit DE + EN

Infrastruktur - Vue 3.5 + Composition API + TypeScript 5.7 + Vite 7.3 - @nextcloud/vue 9.6, @nextcloud/axios, @nextcloud/router - Pinia Stores mit Optimistic Updates + Rollback - 88 PHPUnit-Tests + 24 Vitest-Tests (112 gesamt) - Pre-Commit-Hook für OCP-only API-Enforcement

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIDAzCCAesCAhNBMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTEzMTQwODIwWhcNMzYwODE4MTQwODIwWjATMREwDwYD
VQQDDAh2aW5hcml1bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUy
Uf45nxsw9A85lkErb0KHGlESd4xVFuXULhPxrfu0468oXo+FAFGR66OcZd7Dz0ju
cwIrI2S+wwD5Un6NbK/AIw1SeUIZ2iOtpyPu1Rfefp3QDXrHWSVeirwBAynhR3Xu
auyE/SVSX19cSU3cxomVZpI6/fD5A1rYsfV13jKfJSVqk8GgJpob28sAOJPGz5wf
cTUILWh/fBJLWHE8PhowV2r2AnlQCeMScOgIZ5Okg3GX5P1VWMgohr8MafIAgeib
hl9fiUrHdSb445ph/9SGuLwZ7achJN0Yk27+SjqpvDLDT965yqHMqe9hqZRwWqSY
ErR46cHuDKqEUQHBtLcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAU6RQMAMbEMoj
hwEQ34AYwy7sYrSOYYhRxy5HrZ8cZGHwDbNIRNhglMs1UDe+GqDFRhibNVA4Dmou
pvVWqRTihM/hRs+dUKrqgQ3owf/3KbA9VSD5/nEE8MiehZVvMA0ecJ26JqTbrekF
eAVFzcZul1wJkH0hO5wlM3h7RHNKUDViOi3hUsYiDJot4BWN3ndlTuAqgrsAonPm
x28mIRLs8XPn023C9IY/D9VRnw/6Fc3aMyB/vkUe5FWwYAuoo9ntnkeA8v5AxLlH
Os1dIxl+8sW8SJtfZ6BDqnnpK9/J11ZLvQFoWHVqK5Z/kN+ZLTaUtCVKCgC2LNB1
BoFrOxGkfQ==
-----END CERTIFICATE-----
SignaturekRhu1SmG7i9VmNtsp1dMId19I1oCjMwkQ5d0ZY8g3BCo/IlAg2hJvUmiFyYroa/NLtTkGm6o31SissX8NrfNZku2A6csuiTBBdnsy9lTWIYXPgxZaoA+Ne6zGYEna7QxVOb7+Zi1UceD3Jj6T97kBCBaA8NzZ/1WUkKi7nwwq202N4Nmk6cMsF6UAK7u+GLHa8SapoeGZF0QkZURxOTViJqp1RZGGtJbFGPiUxbdTZXZVIVBL3O2VPKugmw2AvH3npgqcIQeso62ONhpgQk/MBTCdLvR6Uyy55v/YRlGPwCZxwMRVnaxqool0PgbXq1BdWcNdhIA8Vq5ayNErYapzQ==
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0