Zum Hauptinhalt springen

Uni-Verein 1.8.4 – Kein weißer Bildschirm mehr, Mail läuft wieder am iPhone 📱🛟

· 2 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 3. Oktober 2026

Noch am selben Tag wie 1.8.3 folgt Uni-Verein 1.8.4, ein kleines Fehlerbehebungs-Release: Der Mailversand funktioniert am iPhone wieder, und wenn eine Seite einmal nicht lädt, bleibt die App ab jetzt bedienbar.

Highlights​

  • 📱 Mail läuft wieder am iPhone: Beim Öffnen von "Mail" erscheint kein weißer Bildschirm mehr
  • 🛟 Keine leeren Seiten mehr nach Fehlern: Wenn eine Seite nicht geladen werden kann, siehst du jetzt eine Fehlermeldung mit Neu-laden-Button. Die Navigation bleibt nutzbar, sodass du zu einer anderen Seite wechseln kannst
  • 🔄 Reibungslosere Updates: Ist die App geöffnet, während eine neue Version bereitgestellt wird, lädt sie einmal selbstständig neu, statt eine Seite nicht mehr öffnen zu können

Fehlerbehebungen​

  • 📱 Mail am iPhone (UV-51): Das Öffnen von "Mail" auf dem iPhone zeigt keinen weißen Bildschirm mehr. Auf den Mail-Editor wurde zugegriffen, nachdem er bereits geschlossen worden war, und der daraus folgende Fehler riss die gesamte App mit
  • 🛟 Fehlermeldung statt leerer Seite: Läuft eine Seite in einen Fehler, erscheint im Inhaltsbereich jetzt eine Fehlermeldung ("Hier ist etwas schiefgelaufen") mit den Buttons "Erneut versuchen" und "Neu laden". Seitenleiste und mobile Navigation bleiben bedienbar, und der Wechsel auf eine andere Seite blendet die Meldung wieder aus
  • 🔄 Fehlende Seitendateien nach einem Update: War die App noch aus der vorherigen Version geöffnet und eine Seitendatei dieser Version existiert nicht mehr, lädt die App jetzt einmal neu und holt die aktuelle Version. Fehlt die Datei danach immer noch, erscheint die Fehlermeldung, statt wieder und wieder neu zu laden

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es ist keine Datenbank-Migration nötig
  • An deinen Einstellungen oder der API ist nichts zu ändern

Warum diese Updates wichtig sind​

Ein weißer Bildschirm ist für Nutzer die schlechteste Rückmeldung, denn man weiß weder, was passiert ist, noch, wie es weitergeht. Mit der Fehlermeldung und der weiterhin nutzbaren Navigation kommen alle auch bei einem unerwarteten Fehler weiter, und der automatische Neuladen-Schritt nach Updates verhindert viele solcher Fälle schon im Vorfeld.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.3 – SEPA-Export fit für November 2026 🏦✅

· 4 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 3. Oktober 2026

Uni-Verein 1.8.3 bereitet den SEPA-Export auf die Änderungen ab dem 15. November 2026 vor: Die Lastschriftdatei (pain.008.001.08) folgt den EPC-Regeln für SDD Core 2025 und verwendet strukturierte Adressen. Außerdem werden Prüfungen strenger, damit keine Datei entsteht, die die Bank ablehnen würde, und die mobile Ansicht wurde aufgeräumt.

Highlights​

  • 🏦 SEPA-Export bereit für November 2026: Die Lastschriftdatei folgt den EPC-Regeln für SDD Core 2025 und den neuen Regeln für strukturierte Adressen, die ab dem 15. November 2026 gelten
  • ✅ Zuverlässigere SEPA-Dateien: IBANs und Gläubiger-Identifikationsnummer werden inklusive Prüfziffern geprüft, Text wird in den SEPA-Zeichensatz umgewandelt (z. B. ä → ae) und jede Transaktion bekommt eine eigene eindeutige ID
  • 💳 Mitglieder ohne BIC werden nicht mehr übersprungen: Sie werden, wie von SEPA erlaubt, mit NOTPROVIDED exportiert
  • 📱 Bessere mobile Ansicht: Die Icons der unteren Navigation sind wieder ausgerichtet, und die Benutzerverwaltung läuft nicht mehr über den Bildschirmrand

Fehlerbehebungen​

  • 🏦 SEPA-Export nach aktuellen Regeln (UV-50): Der Export (pain.008.001.08) folgt den EPC-Regeln für SDD Core 2025 und den Adressregeln ab dem 15. November 2026:
    • Adressen sind vollständig strukturiert (Straße, Postleitzahl, Ort, Land) statt einer einzelnen Freitext-Adresszeile
    • Text verwendet den SEPA-Zeichensatz (z. B. ä → ae)
    • Jede Transaktion erhält eine eindeutige ID, sodass mehrere offene Beiträge desselben Mitglieds nicht mehr kollidieren
    • Mitglieder ohne BIC werden als NOTPROVIDED exportiert, statt übersprungen zu werden
    • BIC des Vereins, IBANs und Gläubiger-Identifikationsnummer werden inklusive Prüfziffern kontrolliert. Beiträge mit ungültiger IBAN werden nicht in die Datei aufgenommen
    • Ein Export ohne einziehbare Beiträge zeigt eine Meldung, statt eine leere Datei zu erzeugen
    • Gelöschte Exporte erscheinen nicht mehr im Exportverlauf
  • 📱 Navigation am Handy (UV-48): Die Icons der unteren Navigation sind wieder ausgerichtet. Inaktive Tabs hatten ihre Beschriftung nur optisch versteckt, wodurch "SEPA Export" auf zwei Zeilen umbrach und das Bank-Icon nach oben schob. Alle Tabs zeigen jetzt ein kurzes, einzeiliges Label (z. B. "SEPA", "Mail", "Auswertung"), und der aktive Tab verschiebt sich nicht mehr
  • 📱 Benutzerverwaltung am Handy (UV-49): Die Benutzerverwaltung läuft auf dem Handy nicht mehr über den Bildschirm. Die lange Tab-Beschriftung "Benachrichtigungseinstellungen" hatte die ganze Seite verbreitert. Sie ist jetzt zu "Benachrichtigungen" gekürzt, die Tabs scrollen bei Platzmangel, und der Tab-Indikator bleibt innerhalb der abgerundeten Ecken

Verbesserungen​

  • 🐳 Das Frontend-Docker-Image wird mit Node 24 statt Node 20 gebaut, da Node 20 seit April 2026 nicht mehr unterstützt wird. Das Laufzeit-Image (nginx) bleibt unverändert
  • 📦 Aktualisierte Abhängigkeiten: MailKit 4.18.1 und der Tiptap-Mail-Editor 3.31.4, dazu mehrere Entwicklungswerkzeuge

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es ist keine Datenbank-Migration nötig
  • SEPA-Einstellungen vor dem nächsten Export prüfen: Straße und Postleitzahl des Vereins werden jetzt als strukturierte Adresse geschrieben, sie müssen also ausgefüllt sein. Die Gläubiger-Identifikationsnummer wird jetzt inklusive Prüfziffern kontrolliert, sodass eine falsch eingegebene den Export mit einer Fehlermeldung stoppt, statt eine Datei zu erzeugen, die die Bank ablehnen würde
  • Mitglieder ohne BIC sind jetzt im Export enthalten. Vorher wurden sie stillschweigend ausgelassen. Wer sich darauf verlassen hat, sollte den Export vor dem Hochladen bei der Bank prüfen
  • Gibt es keine einziehbaren Beiträge, erscheint jetzt eine Meldung statt einer leeren Datei

Warum diese Updates wichtig sind​

Ab dem 15. November 2026 gelten neue Regeln für strukturierte Adressen in SEPA-Dateien. Banken lehnen Dateien ab, die nicht dazu passen, und das gerade dann, wenn Beiträge eingezogen werden sollen. Durch die strengeren Prüfungen vorab merkt man Fehler jetzt direkt im Export und nicht erst nach der Ablehnung durch die Bank. Die Korrekturen an der mobilen Ansicht machen die Bedienung am Handy außerdem wieder angenehmer.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.2 – Sicherere Mails, maskierte IBANs und Vereinslogo 🛡️✉️

· 4 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 30. September 2026

Uni-Verein 1.8.2 setzt die Sicherheitsarbeit aus 1.8.1 fort: Mail-Inhalte werden serverseitig bereinigt, IBANs sind für reguläre User maskiert und der Passwortwechsel verlangt das aktuelle Passwort. Dazu kommen ein eigener Absendername für Mails und das Vereinslogo in der Seitenleiste.

Highlights​

  • 🛡️ Sicherere Mails: Mail-Inhalte werden auf dem Server bereinigt. Es bleibt nur die Formatierung erhalten, die der Mail-Editor erzeugen kann, Skripte, Event-Handler, javascript:-Links, Formulare und iframes werden entfernt
  • 🔒 IBANs für reguläre User maskiert: Nur ADMIN und FINANCIAL_MANAGER sehen vollständige IBANs, die Rolle USER sieht sie bis auf die letzten 6 Zeichen maskiert
  • 🔑 Passwortwechsel nur mit aktuellem Passwort: Falsche Eingaben zählen zur Login-Sperre
  • ✉️ Absendername für Mails: Neues Feld "Absendername" in den Mail-Einstellungen, damit Mails z. B. als Vorstand <vorstand@verein.de> erscheinen
  • 🖼️ Vereinslogo in der Seitenleiste: Die Seitenleiste zeigt das Logo aus den allgemeinen Einstellungen

Neue Funktionen​

  • ✉️ Absendername (UV-47): Die Mail-Einstellungen haben ein neues optionales Feld "Absendername", das Empfänger als Absender sehen. Bisher wurde "Absender Email (From)" gleichzeitig als Name und Adresse verwendet, sodass die Eingabe eines Namens dort den Mailversand scheitern ließ. Das Feld für die Absender-E-Mail akzeptiert jetzt nur noch eine gültige Adresse
  • 🖼️ Vereinslogo in der Seitenleiste (UV-24): Das Logo aus den allgemeinen Einstellungen erscheint oben links in der Seitenleiste, sowohl aufgeklappt als auch eingeklappt. Ist kein Logo hochgeladen, wird weiterhin der erste Buchstabe des Vereinsnamens angezeigt

Sicherheit​

  • 🛡️ Mail-Inhalte bereinigen (UV-17): Der Text von Mails, die über /mail/send verschickt werden, wird serverseitig mit HtmlSanitizer bereinigt. Erhalten bleiben Text, Überschriften, Listen, Links, Bilder, Farben und Ausrichtung. Skripte, Event-Handler, javascript:-Links, Formulare und iframes werden entfernt, data:-URLs sind nur für Inline-Bilder erlaubt (kein SVG). Markdown-Release-Notes in Firmware-Update-Mails rendern außerdem kein rohes HTML mehr
  • 🔒 IBANs maskieren (UV-26): Vollständige IBANs der Mitglieder erhalten nur ADMIN und FINANCIAL_MANAGER. Die Rolle USER bekommt sie bis auf die letzten 6 Zeichen maskiert (Mitgliederliste, Antworten beim Anlegen/Ändern von Mitgliedern und die Warteschlange "Ausstehende Mitglieder"). So lässt sich eine IBAN weiterhin prüfen und durch eine neue ersetzen. Eine maskierte IBAN, die zurück an die API geschickt wird, gilt als unverändert und wird nie gespeichert
  • 🔑 Aktuelles Passwort erforderlich (UV-30): Wer sein eigenes Passwort ändert, muss das aktuelle eingeben, sowohl in den Profileinstellungen als auch, wenn ein Admin in der Benutzerverwaltung seinen eigenen Account bearbeitet. Falsche Versuche zählen zur Login-Sperre. Admins können die Passwörter anderer Benutzer weiterhin ohne das alte Passwort zurücksetzen
  • 🧰 Die transitive Build-Abhängigkeit serialize-javascript wurde auf 7.1.2 angehoben, um GHSA-gfhx-hw2g-v5hg zu beheben (XSS durch nicht maskiertes </script> in serialisierten Funktionskörpern, Schweregrad niedrig)

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Die Datenbank-Migration (AddMailFromName) läuft beim Start automatisch. Bestehende Mail-Einstellungen funktionieren weiter, der neue Absendername ist zunächst leer
  • Wer als Workaround einen Namen in "Absender Email (From)" eingetragen hatte, sollte ihn in das neue Feld "Absendername" verschieben. Das Feld für die Absender-E-Mail akzeptiert nur noch eine gültige Adresse

Warum diese Updates wichtig sind​

Mails sind ein sensibler Weg: Wer Inhalte aus dem Editor versendet, soll sich darauf verlassen können, dass dabei kein aktiver Code mitreist. Maskierte IBANs sorgen dafür, dass Bankdaten nur diejenigen vollständig sehen, die sie wirklich brauchen, und die Abfrage des aktuellen Passworts schützt Accounts auch dann, wenn jemand kurz an einem entsperrten Rechner sitzt. Absendername und Logo machen den Verein zudem im Postfach und in der Oberfläche besser erkennbar.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.1 – HTTPS inklusive und umfassende Sicherheitshärtung 🔐🛡️

· 5 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 26. September 2026

Uni-Verein 1.8.1 ist ein Sicherheits-Release: Die Installation bekommt HTTPS direkt ab Werk, der Login wird deutlich robuster gegen Angriffe, Uploads werden strenger geprüft und alle Container laufen ohne Root-Rechte.

Highlights​

  • 🔐 HTTPS ab Werk: Eine neue docker-compose-tls.yml samt Caddyfile stellt Caddy vor den Stack und holt automatisch ein Let's-Encrypt-Zertifikat. Das ist jetzt der empfohlene Installationsweg
  • 🛡️ Gehärteter Login: Rate-Limiting pro IP, keine Rückschlüsse mehr darauf, ob ein Benutzername existiert, und Sperren dauern höchstens 15 statt bis zu 24 Stunden
  • 🔑 Kein Standard-Admin-Passwort mehr im Einsatz: Wer sich mit admin123 anmeldet, muss zuerst ein neues Passwort setzen
  • 📦 Sicherere Uploads und Container: Belegdateien werden anhand ihres tatsächlichen Inhalts geprüft, Upload-Größen sind begrenzt, alle Container laufen als Nicht-Root-User

Neue Funktionen​

  • 🔐 HTTPS mit Let's Encrypt (UV-27): docker-compose-tls.yml und Caddyfile richten automatisches HTTPS ein (erfordert einen DNS-Eintrag sowie die Ports 80 und 443). Der Selbst-Update-Ablauf erkennt und unterstützt beide Varianten und aktualisiert auch das Caddyfile. nginx ermittelt die echte Client-IP hinter Caddy, damit Rate-Limiting und Audit-Logs weiter funktionieren
  • 🚦 Rate-Limiter für den Login (UV-31): /auth/login ist pro IP-Adresse begrenzt (Standard 20 Anfragen pro Zeitfenster, konfigurierbar über RateLimiting:AuthLogin:PermitLimit)
  • 🔑 Passwortwechsel erzwungen (UV-25): Beim Login mit dem Standardpasswort admin123 erscheint ein Dialog, der sich erst nach dem Setzen eines neuen Passworts schließen lässt
  • 🔍 Automatische Abhängigkeitsprüfung (UV-42): npm audit --audit-level=high läuft in der CI, dazu kommt Dependabot (ein gebündelter wöchentlicher PR, keine Major-Updates)

Verbesserungen​

  • 🔒 Authentifizierung als Standard (UV-41): Alle Endpunkte erfordern jetzt standardmäßig eine Anmeldung. Bewusst öffentliche Endpunkte (Login, Selbstregistrierung, öffentliche Seitenkonfiguration, /health) sind ausdrücklich freigegeben
  • ⏱️ Fairere Sperren (UV-45): Fehlversuche beim Login verfallen nach 15 Minuten, und die Sperre ist auf maximal 15 Minuten begrenzt (vorher bis zu 24 Stunden)
  • 👤 Admin-Schutz (UV-25): Der Standard-Admin wird nur noch angelegt, wenn noch gar kein Benutzer existiert. Admins können sich nicht mehr selbst löschen oder ihre eigene Rolle ändern
  • 🧾 Uploads nach Inhalt prüfen (UV-32): Belegdateien werden anhand der Magic Bytes (PNG, JPEG, GIF, WebP, PDF) validiert statt anhand des vom Browser gemeldeten Typs. SVG und unbekannte Formate werden abgelehnt. Downloads senden X-Content-Type-Options: nosniff und Content-Disposition: attachment
  • 📏 Upload-Limits (UV-43): Das globale Request-Limit sinkt von 10 GB auf 100 MB, nur die Backup-Wiederherstellung behält 10 GB. Belegdateien und der CSV-Import der Mitglieder sind auf 10 MB pro Datei begrenzt, zu große PDFs werden schon im Browser abgelehnt
  • 🧱 Security-Header (UV-33): Beide nginx-Konfigurationen senden CSP, X-Frame-Options, nosniff, Referrer-Policy und Permissions-Policy
  • 🌐 CORS (UV-28): Erlaubte Origins werden über Cors:AllowedOrigins konfiguriert (in Produktion leer), statt jeden localhost-Origin zuzulassen
  • 🔗 Sichere Bestätigungslinks (UV-35): Die Links der Selbstregistrierung nutzen eine gespeicherte PublicBaseUrl statt des Host-Headers der Anfrage, sodass keine Phishing-Links über gefälschte Hosts möglich sind
  • 📦 Container ohne Root (UV-37): Alle Container laufen als Nicht-Root-User, mit cap_drop: [ALL] und no-new-privileges, wo es möglich ist
  • 🗝️ Geheimnisse (UV-38, UV-39): Das Init-Skript erzeugt zufällige Datenbank-Passwörter und gibt nur noch die Namen der .env-Schlüssel aus, nicht deren Werte. .env.example enthält nur Platzhalter statt echter Schlüssel
  • 🧰 Abhängigkeiten (UV-40): Serilog.Sinks.File ist auf die stabile Version 7.0.0 festgelegt, das ungenutzte BCrypt.Net-Next wurde entfernt, dazu Minor-/Patch-Updates für Backend und Frontend

Fehlerbehebungen​

  • 🖥️ Weißer Bildschirm nach dem Login (UV-18): Nach einem Update konnten veraltete, nachgeladene Programmteile einen leeren Bildschirm verursachen. Die App lädt jetzt automatisch neu, sobald ein neuer Service Worker übernimmt
  • 🔔 Firmware-Hinweis (UV-46): Der Hinweis auf ein Firmware-Update vergleicht jetzt echte Versionsnummern und erscheint nur, wenn tatsächlich eine neuere Version existiert
  • 🕵️ Benutzernamen-Enumeration (UV-44): Die Antwortzeit beim Login verrät nicht mehr, ob ein Benutzername existiert. Rohe Benutzernamen werden nicht mehr ins Log geschrieben
  • 🌍 Gefälschte IP-Header (UV-34): X-Real-IP wird nur noch aus privaten bzw. internen Netzen akzeptiert, damit sich IP-basierte Limits nicht mit einem gefälschten Header umgehen lassen

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben. Proxy und Frontend lauschen im Container jetzt auf Port 8080 (der Host-Port bleibt 80), daher müssen nginx.conf und die Compose-Datei gemeinsam ersetzt werden. Das Update-Skript erledigt das für dich
  • logs/ und receipts/ müssen für das Nicht-Root-Backend (UID 1654) beschreibbar sein. Das Update-Skript kümmert sich über docker-compose-ini.yml darum. Bei einer manuellen Installation: chown -R 1654:1654 logs receipts
  • Wer die Selbstregistrierung nutzt: War sie schon vor dem Update aktiviert, muss ein Admin einmal die allgemeinen Einstellungen öffnen und speichern. Dabei wird die öffentliche URL für die Bestätigungslinks hinterlegt. Bis dahin schlagen neue Anmeldungen fehl
  • Die Datenbank-Migration (AddLastFailedLoginAttemptAndPublicBaseUrl) läuft beim Start automatisch

Warum diese Updates wichtig sind​

Ein Vereinssystem verwaltet Namen, Adressen und Bankdaten und sollte daher so sicher betrieben werden wie möglich. Mit HTTPS ab Werk, einem robusteren Login und strengeren Prüfungen bei Uploads und Netzwerkzugriffen schließt 1.8.1 gleich eine ganze Reihe möglicher Angriffsflächen. Dass die Container jetzt ohne Root-Rechte laufen, begrenzt zudem den Schaden, falls doch einmal etwas schiefgeht.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.0 – Selbstregistrierung für den Dauereinsatz 📝✅

· 3 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 20. September 2026

Uni-Verein 1.8.0 macht die Selbstregistrierung (bisher gedacht für den kurzzeitigen Einsatz z. B. am Messestand) fit für den dauerhaften Betrieb: Anmeldungen legen jetzt erst nach bestätigter E-Mail-Adresse und Prüfung durch eine eingeloggte Person ein Mitglied an, statt sofort. Dazu kommt eine neue Opt-in-Benachrichtigung für neue Anmeldungen und ein Sicherheits-Fix bei bereits bezahlten Belegen.

Highlights​

  • 📝 Gehärtete Selbstregistrierung: E-Mail-Bestätigung (48h) plus Prüf-Warteschlange statt direkter Mitgliedsanlage
  • 🔔 Opt-in-Benachrichtigung: Jede eingeloggte Person kann sich per Mail über neue Anmeldungen informieren lassen
  • 🔒 Beleg-Fix: Bereits bezahlte Belege können von regulären Usern nicht mehr gelöscht werden

Neue Funktionen​

  • 📝 Selbstregistrierung: Das öffentliche Formular erstellt kein Mitglied mehr direkt, sondern verlangt zunächst eine Bestätigung der angegebenen E-Mail-Adresse über einen 48 Stunden gültigen Link. Erst danach landet die Anmeldung im Tab "Ausstehende Mitglieder" der Mitgliederverwaltung, sichtbar für alle eingeloggten Rollen, die sie dort genehmigen oder ablehnen können
  • ✍️ Motivation statt Kategorie: Interessierte geben stattdessen eine kurze Motivation sowie verpflichtend IBAN und BIC an, eine Mitgliederkategorie wird erst von der prüfenden Person beim Genehmigen vergeben
  • 🛡️ Härtung fürs Tagesgeschäft: Rate-Limiting pro IP-Adresse, strengere E-Mail-Validierung, eine Voraussetzung, dass Mail-Einstellungen konfiguriert sind, bevor die Selbstregistrierung aktiviert werden kann, sowie eine mobil-freundliche Ansicht für die Warteschlange
  • 🔔 Benachrichtigung bei neuer Anmeldung: Jede eingeloggte Person kann sich unabhängig von ihrer Rolle über einen neuen Schalter in den Benachrichtigungseinstellungen für eine E-Mail bei jeder neu bestätigten Anmeldung eintragen, standardmäßig deaktiviert

Fehlerbehebungen​

  • 🔒 Beleg-Löschen nach Bezahlung: Ein regulärer User konnte einen eigenen Beleg auch dann noch löschen, wenn er von Admin oder Finanzverwalter bereits als bezahlt markiert worden war, da die Löschprüfung nur den Beleg-Besitzer, nicht aber den Bezahlt-Status berücksichtigte. Das Löschen eines bezahlten Belegs durch reguläre User liefert jetzt einen Fehler, der Löschen-Button wird dafür ausgeblendet. Admin und Finanzverwalter können bezahlte Belege weiterhin löschen

Warum diese Updates wichtig sind​

Die ursprüngliche Selbstregistrierung war für den kurzzeitigen Einsatz gedacht, etwa um bei einer Veranstaltung schnell neue Mitglieder zu gewinnen. Für den dauerhaften Einsatz auf der Vereinswebsite braucht es mehr Absicherung: Die E-Mail-Bestätigung verhindert Anmeldungen mit falschen oder fremden Adressen, die Prüf-Warteschlange gibt dem Vorstand die Kontrolle über jede neue Aufnahme, und die Opt-in-Benachrichtigung sorgt dafür, dass niemand manuell nachschauen muss, ob etwas Neues wartet.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.7.0 – Selbstregistrierung für neue Mitglieder 📝

· 2 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 5. September 2026

Uni-Verein 1.7.0 macht die Mitgliederaufnahme einfacher: Interessierte können sich ab sofort über ein öffentliches Formular selbst anmelden, ganz ohne eigenen Account. Dazu bringt dieses Release wichtige Sicherheitsupdates für einige Abhängigkeiten.

Neue Funktionen​

  • 📝 Selbstregistrierung: Ein neues, öffentlich erreichbares Formular erlaubt es Interessierten, sich selbst als Mitglied anzumelden (ganz ohne eigenen Account)
  • 🔒 Serverseitig geschützte Felder: Daten, die nur der Nutzer setzen darf oder die automatisch vergeben werden (Aufgabe im Verein, Datumsfelder, SEPA-Zustimmung), sind im öffentlichen Formular ausgeblendet und werden serverseitig erzwungen
  • 🚫 Duplikatsprüfung: E-Mail-Adresse und IBAN werden wie beim Anlegen durch einen User auf Duplikate geprüft und im Fall eines Treffers abgelehnt
  • 🔗 "Selbstregistrierung"-Schalter: Neue Einstellung in den allgemeinen Vereinseinstellungen, die das öffentliche Formular ein- oder ausschaltet, inklusive Button zum direkten Teilen des Links

Verbesserungen​

  • 🧩 Die Logik zum Anlegen von Mitgliedern wurde in einem gemeinsamen MemberService.CreateMemberAsync gebündelt, statt dupliziert für Nutzer-Erstellung und Selbstregistrierung vorzuliegen
  • 🧩 Wiederkehrende EF-Core-Abfragen wurden hinter einem neuen ReferenceDataService vereinheitlicht
  • 🌐 frontend/nginx.conf liefert die SPA jetzt mit einem try_files-Fallback auf index.html aus

Sicherheit​

  • 🔐 Die Abhängigkeiten fast-uri und @tiptap/* wurden aktualisiert. Damit werden vier Sicherheitslücken mit hohem Schweregrad (SSRF/Host-Confusion) sowie eine mit mittlerem Schweregrad (Prototype-Pollution zu XSS) geschlossen

Warum diese Updates wichtig sind​

Die Selbstregistrierung nimmt Vorständen viel manuelle Arbeit ab: Statt jedes neue Mitglied einzeln anzulegen, teilt man einfach den Link zum Formular, Interessierte tragen sich selbst ein. Serverseitig geschützte Felder und die Duplikatsprüfung sorgen dabei dafür, dass die Datenqualität dieselbe bleibt wie bei einer Anmeldung durcheinen Nutzer. Die Sicherheitsupdates schließen zudem bekannte Schwachstellen in verwendeten Abhängigkeiten.

Wie geht es weiter?​

Wie immer freue ich mich über Feedback und Wünsche, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.6.0 – E-Mail-Benachrichtigungen für Finanzverwalter 🔔🧾

· 2 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 25. August 2026

Uni-Verein 1.6.0 bringt eine kleine, aber im Vereinsalltag spürbare Verbesserung: Finanzverwalter werden ab sofort per E-Mail benachrichtigt, sobald ein neuer Beleg eingereicht wird (niemand muss mehr manuell auf der Belege-Seite nachschauen).

Neue Funktionen​

  • 🔔 Beleg-Benachrichtigungen: Finanzverwalter bekommen ab sofort eine E-Mail, sobald ein neuer Beleg eingereicht wird (egal ob von einem regulären User oder einem Admin). Reicht ein Finanzverwalter selbst einen Beleg ein, bleibt die Benachrichtigung an ihn aus
  • ⚙️ Benachrichtigungseinstellungen: Neuer Tab "Benachrichtigungseinstellungen" in den eigenen Kontoeinstellungen. Er ist für alle Rollen sichtbar (als Platzhalter für künftige Einstellungen), der Schalter für Beleg-Benachrichtigungen erscheint aber nur für Finanzverwalter. Die Funktion ist standardmäßig aktiviert, lässt sich aber jederzeit deaktivieren

Unter der Haube​

  • 🧱 Eine neue, generische Tabelle für benutzerbezogene Einstellungen (Typ + Aktiv-Flag) legt die Grundlage, um künftig weitere Benachrichtigungs- und Präferenztypen zu ergänzen, ohne dafür erneut das Datenbankschema anzupassen

Warum dieses Update wichtig ist​

Bisher mussten Finanzverwalter aktiv auf der Belege-Seite nachsehen, ob etwas Neues eingereicht wurde. Mit der automatischen Benachrichtigung entfällt das – Belege werden schneller bearbeitet, ohne dass dafür ein zusätzlicher Kontrollgang nötig ist.

Wie geht es weiter?​

Die neue Einstellungen-Tabelle ist bewusst generisch gehalten, weitere Benachrichtigungstypen werden folgen. Feedback und Wünsche gerne wie immer über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.5.0 – Belegverwaltung mit OCR-Scan und Auswertung 🧾📊

· 3 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 14. August 2026

Uni-Verein 1.5.0 bringt eine der größten neuen Funktionen seit dem Start: die Belegverwaltung. Kassenbons und Rechnungen lassen sich ab sofort direkt in Uni-Verein einreichen, per On-Device-OCR automatisch auswerten und in einer neuen Belegauswertung nach Monat, Kategorie und Jahr visualisieren.

Neue Funktionen​

  • 📎 Belegverwaltung: Neuer Bereich "Belege", in dem reguläre User ihre eigenen, Admin und Finanzverwalter alle eingereichten Belege inklusive einreichender Person sehen. Die Liste lässt sich nach Zeitraum, Kategorie und Status (Offen/Bezahlt) filtern
  • 🤖 OCR-Scan beim Einreichen: Beim Hochladen eines Fotos oder PDFs wird der Beleg direkt im Browser per On-Device-OCR gescannt und füllt Betrag sowie Belegdatum automatisch aus, bereits ausgefüllte Felder werden dabei nicht überschrieben. Händler, Kategorie, Zahlungsart und Beschreibung lassen sich zusätzlich manuell ergänzen, die Zahlungsart können nur Admin und Finanzverwalter setzen
  • 📸 Direkter Kamera-Button: Bei installierter App steht beim Einreichen eines Belegs zusätzlich zum Datei-Upload ein direkter Kamera-Button zur Verfügung
  • ✅ Als bezahlt markieren: Admin und Finanzverwalter bestätigen Belege als bezahlt, danach nicht mehr rückgängig zu machen. Reguläre User können einen eigenen, noch offenen Beleg nur innerhalb von 15 Minuten nach dem Einreichen selbst bearbeiten oder löschen
  • 🗑️ Löschen & Wiederherstellen: Gelöschte Belege werden zunächst nur soft-deleted (Papierkorb-Prinzip). Admin kann sie in der Liste einblenden, wiederherstellen oder endgültig inklusive aller angehängten Dateien löschen
  • 📤 Export als ZIP: Admin und Finanzverwalter können die aktuell gefilterte Belegliste als ZIP mit CSV-Übersicht und allen angehängten Dateien exportieren
  • 📊 Belegauswertung: Neuer Auswertungsbereich für Admin und Finanzverwalter mit Balkendiagramm der Ausgaben je Monat (gestapelt nach Kategorie), Kreisdiagramm je Kategorie mit Jahresgesamtsumme und einer Übersicht der Gesamtausgaben im Jahresvergleich
  • 🏷️ Belegkategorien verwalten: Neue Einstellung, um eigene Kategorien wie Büromaterial, Reisekosten oder Verpflegung anzulegen, eine Kategorie lässt sich erst löschen, wenn ihr kein Beleg mehr zugeordnet ist

Verbesserungen​

  • 💾 Backup mit Belegen: Neben dem normalen Datenbank-Backup steht jetzt ein Vollbackup inklusive aller hochgeladenen Belegdateien als ZIP zum Download bereit. Beim Wiedereinspielen erkennt Uni-Verein automatisch, ob eine reine SQL-Datei oder ein ZIP-Vollbackup ausgewählt wurde, beide lassen sich über "Backup-Datei auswählen" einspielen

Warum diese Updates wichtig sind​

Die Beleg- und Spesenverwaltung war eines der meistgewünschten Features aus der Vereinsarbeit: Statt Kassenbons zu sammeln und manuell in einer Tabelle zu erfassen, reichen Mitglieder sie jetzt direkt in Uni-Verein ein, der OCR-Scan übernimmt dabei einen Großteil der Tipparbeit. Für Vorstand und Finanzverwaltung schafft die neue Belegauswertung sofortige Transparenz über Ausgaben, ganz ohne separate Tabellenkalkulation.

Wie geht es weiter?​

Die Belegverwaltung ist ein erster Schritt in Richtung umfassenderer Finanzfunktionen, weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.4.0 – Dark Mode und Umstieg auf PostgreSQL 🌓🐘

· 3 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 28. Juli 2026

Uni-Verein 1.4.0 ist da! Mit einem lang gewünschten Dark Mode und einer größeren technischen Umstellung unter der Haube: Die Datenbank wechselt von MariaDB zu PostgreSQL. Bestehende Installationen werden dabei automatisch und sicher vom Updater migriert.

Highlights​

  • 🌓 Dark Mode: Die App folgt jetzt standardmäßig dem Farbschema von Betriebssystem/Browser, mit einem manuellen Umschalter neben dem Sprachumschalter
  • 🐘 PostgreSQL statt MariaDB: Die Datenbank-Engine wurde umgestellt. Bestehende Installationen werden vom Updater automatisch und sicher migriert (siehe Wichtiger Hinweis zum Upgrade unten)

⚠️ Wichtiger Hinweis zum Upgrade (Breaking Change)​

Dieses Release wechselt die Datenbank-Engine von MariaDB zu PostgreSQL. Aktualisiert deshalb ausschließlich über den offiziellen Updater und setzt niemals VERSION in der .env von Hand oder tauscht selbstständig eine neuere docker-compose-prod-image.yml ein, das überspringt die notwendige Datenbankmigration und beschädigt eure Installation!

curl -O https://raw.githubusercontent.com/uni-verein/uni-verein/main/docker-compose-update.yml
docker compose -f docker-compose-update.yml run --rm update
  • Erstellt vor dem Fortfahren ein manuelles Backup (Datenbank-Backup und Mitgliederexport, beides unter Backup) der Updater fragt vor der Migration explizit danach, ob dies erledigt wurde
  • Installationen, die noch auf MariaDB laufen, werden zunächst auf v1.3.1 aktualisiert, falls sie das nicht schon sind. Ab v1.3.1 migriert der nächste Update-Lauf die Datenbank nach PostgreSQL und stellt den gesamten Stack um. Das bringt eine Ausfallzeit mit sich, die proportional zur Datenbankgröße ist
  • Sicherheitsnetz bei der Migration: Die Umstellung läuft gegen eine isolierte, temporäre PostgreSQL-Instanz, während der laufende MariaDB-Container weiterhin bedient, es wird also erst etwas verändert, nachdem die Kopie verifiziert wurde. Bei Erfolg wird der alte MariaDB-Container gestoppt, sein Datenvolume aber nicht gelöscht (späteres Freigeben mit docker volume rm <project>_db_data, sobald alles bestätigt funktioniert). Bei einem Fehlschlag wird die Migration automatisch bereinigt und die MariaDB-Installation bleibt vollständig unangetastet
  • Kommt ihr von einer älteren Version? Der Updater geht pro Lauf nur einen Schritt weiter (< v1.3.1 → v1.3.1 → v1.4.0 → aktuellste Version). Wer von vor v1.3.1 aktualisiert, führt den obigen Befehl einfach mehrfach hintereinander aus, bis "Already up to date" gemeldet wird

Neue Funktionen​

  • 🌓 Dark Mode: folgt standardmäßig prefers-color-scheme oder lässt sich manuell über einen Umschalter neben dem Sprachumschalter setzen, die Wahl wird über Reloads hinweg gespeichert. Jede bisher nur helle Oberfläche (Hauptbereich, Tabellenköpfe, Backup-/E-Mail-/Sendefortschritt-Panels, Kopfleiste, Login-Seite) ist jetzt theme-fähig
  • 🛠️ UniVerein.DbMigrator: ein neues Tool, das die oben beschriebene MariaDB-zu-PostgreSQL-Migration durchführt, kopiert jede Tabelle (inklusive soft-gelöschter Zeilen) in fremdschlüsselsicherer Reihenfolge und verifiziert die Zeilenanzahlen

Verbesserungen​

  • 🐘 MariaDB wurde im gesamten Stack durch PostgreSQL (postgres:17-alpine) ersetzt: Docker-Images, der Datenbank-Provider im Backend sowie das Backup-/Restore-Tooling
  • 🔄 Der Updater (docker-compose-update.yml) wurde so angepasst das er die oben beschriebene MariaDB-zu-PostgreSQL-Umstellung automatisch durchführt

Fehlerbehebungen​

  • 🐛 Der Login-Dialog für den Demo-Modus konnte fälschlicherweise auch dann erscheinen, wenn die App gar nicht als Demo-Instanz konfiguriert war

Warum diese Updates wichtig sind​

Der Dark Mode war eine der meistgefragten Komfortfunktionen, gerade bei abendlichen Vorstandssitzungen ein spürbarer Unterschied. Der Wechsel zu PostgreSQL ist dagegen eine strategische Entscheidung: PostgreSQL bietet eine robustere Grundlage für zukünftige Funktionen und bessere Datenintegrität. Da ein Datenbankwechsel für bestehende Installationen naturgemäß heikel ist, wurde besonderer Wert auf eine sichere, automatisierte Migration mit Rückfallebene gelegt.

Wie geht es weiter?​

Bitte plant für das Update ein kurzes Wartungsfenster ein und meldet euch bei Problemen während der Migration gerne über GitHub Issues. Vielen Dank an alle, die dieses Release mit Feedback begleitet haben. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.3.1 – Schnellere Ladezeiten und wichtige Sicherheitslücke geschlossen ⚡

· 2 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 26. Juli 2026

Nur einen Tag nach 1.3.0 folgt bereits Uni-Verein 1.3.1 mit einem klaren Fokus: spürbar bessere Performance im Frontend sowie ein wichtiger Sicherheitsfix.

Verbesserungen​

  • 🚀 Lazy Loading der Frontend-Routen: Die Seiten-Komponenten (Mail, Mitglieder, SEPA, Beiträge, Nutzer-/Link-/Beitragsplan-/E-Mail-/Gläubiger-/Allgemein-/Mitgliedskategorie-Konfiguration, Audit, Backup) werden jetzt erst bei Bedarf nachgeladen, statt beim ersten Aufruf komplett mitzuladen, das Haupt-Bundle schrumpft dadurch von ca. 1,4 MB auf ca. 577 kB
  • 🖼️ Die Icon-Auswahl ("Symbol auswählen") zeigt jetzt maximal 250 Icons gleichzeitig an und bittet bei mehr Treffern um eine genauere Suche, statt alle ca. 8.600 Icons auf einmal zu rendern. Bisher fror die Oberfläche dadurch bei jedem Öffnen des Dialogs für über eine Sekunde ein
  • ⏳ Die Icon-Auswahl wartet jetzt, bis alle Icons vollständig geladen bzw. gecacht sind, und zeigt in der Zwischenzeit einen Ladeindikator statt eines leeren oder unvollständigen Dialogs
  • 🧹 IconPickerDialog.tsx importiert muiIcons für loadIconNames nicht mehr redundant dynamisch, da es an anderer Stelle bereits statisch importiert wird. Das behebt eine Vite-Build-Warnung und erlaubt korrektes Chunking des Moduls
  • ⚙️ Der enforce-source-branch-CI-Job aus 1.3.0 läuft jetzt auch für Pull Requests nach development, sodass das Zurückführen von main nach development nicht mehr an einem Status-Check scheitert, der bisher nur für PRs nach main ausgewertet wurde

Fehlerbehebungen​

  • 🐛 Vites Chunk-Größen-Warnung für das @mui/icons-material-Barrel (das die Icon-Auswahl bei Bedarf nachlädt) wird jetzt über chunkSizeWarningLimit unterdrückt, da dieser Chunk erwartungsgemäß groß ist und nie Teil des initialen Seitenladens ist

Sicherheit​

  • 🔐 Das npm-Override für brace-expansion wurde auf ^5.0.8 angehoben, um eine hochkritische ReDoS-Schwachstelle (exponentielle Laufzeit bei aufeinanderfolgenden, nicht-expandierenden {}-Gruppen) zu schließen. Die vorherige Override-Version war gegenüber der Lockfile in die Jahre gekommen, wodurch zusätzlich eine verwundbare Kopie verschachtelt unter filelist verblieben war

Warum diese Updates wichtig sind​

Gerade die Icon-Auswahl wurde bisher spürbar als träge wahrgenommen, durch das Lazy Loading und die Begrenzung der gerenderten Icons reagiert die Oberfläche jetzt deutlich flüssiger. Das kleinere Haupt-Bundle sorgt zudem dafür, dass Uni-Verein gerade auf mobilen Verbindungen schneller lädt. Der ReDoS-Fix schließt zusätzlich eine hochkritische Sicherheitslücke in einer transitiven Abhängigkeit.

Wie geht es weiter?​

Die Performance-Arbeit zahlt sich direkt auf die Nutzungserfahrung ein, als Nächstes stehen größere Funktionserweiterungen an. Schaut gerne wieder vorbei!