Skip to main content

Uni-Verein 1.5.0 – Receipt Management with OCR Scanning and Analytics πŸ§ΎπŸ“Š

Β· 3 min read
RenΓ© Herrmann
Senior developer

Published on August 14, 2026

Uni-Verein 1.5.0 brings one of the biggest new features since launch: receipt management. Receipts and invoices can now be submitted directly in Uni-Verein, automatically read via on-device OCR, and visualized by month, category, and year in a brand-new receipt analytics dashboard.

Highlights​

  • 🧾 Receipt management: Members submit receipts or invoices as a photo or PDF, while admins and finance managers stay on top of them with filters, payment status, and ZIP export
  • πŸ€– On-device OCR scan: Amount and receipt date are read straight from the photo in the browser, no server request required
  • πŸ“Š Receipt analytics: Expenses by month and category as bar and pie charts, plus a year-over-year comparison
  • πŸ’Ύ Full backup with receipts: Backups can now optionally include all uploaded receipt files as a ZIP

New Features​

  • πŸ“Ž Receipt management: A new "Receipts" section where regular users see their own submissions, while admins and finance managers see all submitted receipts including who submitted them. The list can be filtered by period, category, and status (open/paid)
  • πŸ€– OCR scan on submission: When uploading a photo or PDF, the receipt is scanned directly in the browser using on-device OCR and automatically fills in the amount and receipt date, without overwriting fields that are already filled in. Merchant, category, payment method, and description can be added manually as well, payment method can only be set by admins and finance managers
  • πŸ“Έ Direct camera button: When the app is installed, submitting a receipt offers a dedicated camera button in addition to the regular file upload
  • βœ… Mark as paid: Admins and finance managers confirm receipts as paid, an action that can't be undone afterwards. Regular users can only edit or delete their own, still-open receipt within 15 minutes of submitting it
  • πŸ—‘οΈ Delete & restore: Deleted receipts are soft-deleted first (trash-can principle). Admins can show deleted receipts in the list, restore them, or permanently delete them along with all attached files
  • πŸ“€ Export as ZIP: Admins and finance managers can export the currently filtered receipt list as a ZIP containing a CSV overview and all attached files
  • πŸ“Š Receipt analytics: A new analytics area for admins and finance managers with a bar chart of expenses per month (stacked by category), a pie chart per category with the year's total in the middle, and an overview comparing total expenses across years
  • 🏷️ Manage receipt categories: A new setting for creating custom categories such as office supplies, travel expenses, or catering, a category can only be deleted once no receipt is assigned to it anymore

Improvements​

  • πŸ’Ύ Backup with receipts: In addition to the regular database backup, a full backup including all uploaded receipt files is now available as a ZIP download. When restoring, Uni-Verein automatically detects whether a plain SQL file or a full ZIP backup was selected, both can be restored via "Select backup file"

Why These Updates Matter​

Receipt and expense management has been one of the most-requested features from club treasurers: instead of collecting receipts and entering them into a spreadsheet by hand, members now submit them directly in Uni-Verein, with the OCR scan taking care of most of the typing. For the board and finance managers, the new receipt analytics dashboard provides instant visibility into spending, no separate spreadsheet required.

What's Next?​

Receipt management is a first step toward more comprehensive financial features, real-world feedback is, as always, very welcome via GitHub Issues. Check back here again soon!

Uni-Verein 1.4.0 – Dark Mode and the Switch to PostgreSQL πŸŒ“πŸ˜

Β· 3 min read
RenΓ© Herrmann
Senior developer

Published on July 28, 2026

Uni-Verein 1.4.0 is here – with a long-requested dark mode and a bigger change under the hood: the database engine switches from MariaDB to PostgreSQL. Existing installations are migrated automatically and safely by the updater.

Highlights​

  • πŸŒ“ Dark mode: the app now follows your OS/browser color scheme by default, with a manual toggle next to the language switcher
  • 🐘 PostgreSQL instead of MariaDB: the database engine has been switched to PostgreSQL. Existing installations are migrated automatically and safely by the updater (see Important Upgrade Notes below)

⚠️ Important Upgrade Notes (Breaking Change)​

This release changes the database engine from MariaDB to PostgreSQL. Always update using the official updater never set VERSION in .env by hand or swap in a newer docker-compose-prod-image.yml yourself, as that skips the required database migration and will break your 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
  • Before continuing, create a manual backup (database backup and member export, both under Settings β†’ Backup) – the updater asks you to confirm this before it proceeds
  • Installations still on MariaDB are updated to v1.3.1 first, if they aren't already there. From v1.3.1, the next update run migrates your database to PostgreSQL and switches the whole stack over. This adds downtime proportional to your database size
  • Migration safety net: the cutover runs against an isolated, temporary PostgreSQL instance while your live MariaDB container keeps serving, so nothing is touched until the copy is verified. On success, the old MariaDB container is stopped and its data volume is kept (not deleted) reclaim the space later with docker volume rm <project>_db_data once you've confirmed everything works. On failure, the migration is cleaned up automatically and your MariaDB installation is left completely untouched
  • Coming from an older version? The updater only advances one step per run (< v1.3.1 β†’ v1.3.1 β†’ v1.4.0 β†’ latest). If you're updating from before v1.3.1, run the command above repeatedly until it reports "Already up to date"

New Features​

  • πŸŒ“ Dark mode: follows prefers-color-scheme by default, or set it manually via a toggle next to the language switcher. The choice is remembered across reloads. Every previously light-only surface (main background, table headers, Backup/Email/SendProgress panels, top bar, login page) is now theme-aware
  • πŸ› οΈ UniVerein.DbMigrator: a new tool that performs the MariaDB β†’ PostgreSQL migration described above, copies every table (including soft-deleted rows) in foreign-key-safe order and verifies row counts

Improvements​

  • 🐘 Replaced MariaDB with PostgreSQL (postgres:17-alpine) across the whole stack: Docker images, the backend's database provider, and the backup/restore tooling
  • πŸ”„ The updater (docker-compose-update.yml) now understands the MariaDB β†’ PostgreSQL cutover described above and handles it automatically

Bug Fixes​

  • πŸ› The demo-mode login dialog could appear even when the app wasn't configured as a demo instance, due to how the demo flag was evaluated

Why These Updates Matter​

Dark mode has been one of the most-requested quality-of-life features, a noticeable difference during evening board meetings, for one. The switch to PostgreSQL, on the other hand, is a strategic decision: it provides a more robust foundation for future features and better data integrity. Since a database engine change is inherently delicate for existing installations, particular care was taken to make the migration safe, automated, and reversible on failure.

What's Next?​

Please plan a short maintenance window for the update, and reach out via GitHub Issues if you run into any problems during the migration. Thanks to everyone who provided feedback for this release. Check back here again soon!

Uni-Verein 1.3.1 – Faster Load Times and an Important Security Fix ⚑

Β· 2 min read
RenΓ© Herrmann
Senior developer

Published on July 26, 2026

Just one day after 1.3.0, Uni-Verein 1.3.1 follows with a clear focus: noticeably better frontend performance and an important security fix.

Improvements​

  • πŸš€ Lazy loading of frontend routes: Page components (Mail, Members, SEPA, Contributions, user/link/contribution-plan/email/creditor/general/member-category configuration, Audit, Backup) are now loaded on demand instead of being bundled into the initial payload, the main bundle shrinks from about 1.4 MB to about 577 kB
  • πŸ–ΌοΈ The icon picker ("Select icon") now caps the number of rendered icon tiles at 250 and prompts for a more specific search beyond that, instead of mounting all ~8,600 icons at once, this previously froze the UI for over a second every time the dialog was reopened
  • ⏳ The icon picker now waits for icons to be fully loaded/cached before revealing the grid, showing a loading spinner in the meantime instead of an empty or partially populated dialog
  • 🧹 IconPickerDialog.tsx no longer redundantly dynamically imports muiIcons for loadIconNames when it's already imported statically elsewhere, resolving a Vite build warning and allowing the module to be chunked correctly
  • βš™οΈ The enforce-source-branch CI job from 1.3.0 now also runs for pull requests targeting development, so merging main back into development isn't blocked by a status check that previously only evaluated PRs targeting main

Bug Fixes​

  • πŸ› Vite's chunk-size warning for the @mui/icons-material barrel (loaded on demand by the icon picker) is now suppressed via chunkSizeWarningLimit, since that chunk is expected to be large and is never part of the initial page load

Security​

  • πŸ” Bumped the brace-expansion npm override to ^5.0.8 to close a high-severity ReDoS advisory (exponential-time expansion of consecutive non-expanding {} groups); the previous override version had drifted out of sync with the lockfile and a duplicate vulnerable copy remained nested under filelist

Why These Updates Matter​

The icon picker in particular had felt noticeably sluggish, thanks to lazy loading and capping the number of rendered icons, the UI now responds much more smoothly. The smaller main bundle also means Uni-Verein loads faster, especially on mobile connections. The ReDoS fix additionally closes a high-severity vulnerability in a transitive dependency.

What's Next?​

This performance work pays off directly in the user experience. Bigger feature additions are up next. Check back soon!

Uni-Verein 1.3.0 – Name Search for Newsletter Recipients and a More Stable Infrastructure πŸ”

Β· 2 min read
RenΓ© Herrmann
Senior developer

Published on July 25, 2026

Uni-Verein 1.3.0 brings a handy new search feature for sending newsletters, along with a number of under-the-hood improvements that make deployments and CI runs more reliable.

New Features​

  • πŸ” Name search in the Broadcast email "Recipient" tab: Recipients can now be filtered by first or last name (fuzzy, Jaro-Winkler similarity), in addition to the existing member category filter
  • ❀️ /health endpoint: A new unauthenticated GET /health endpoint plus Docker HEALTHCHECKs for backend and frontend

Improvements​

  • 🩺 backend, frontend, and proxy now have proper health checks (previously only the database did), and each service waits for its dependencies to be actually ready (service_healthy) instead of just started, across all docker-compose*.yml files
  • 🚦 CI now fails immediately with container logs attached when the stack doesn't become healthy in time, instead of silently continuing on to the Playwright tests and failing there with no diagnostics
  • ⏱️ Increased the database health check's retry budget to tolerate occasional slow first-time initialization on CI runners
  • πŸ“ .env.example now lists BACKUP_PATH, matching every value docker-compose-ini.yml generates
  • πŸ”’ CI now enforces that PRs into main may only come from development (new enforce-source-branch job)

Bug Fixes​

  • πŸ› The newsletter recipient category dropdown showed the raw translation key instead of the category name for custom (non-default) member categories
  • πŸ› The proxy container could stay unhealthy indefinitely because its health check resolved localhost to IPv6 while nginx.conf only listens on IPv4
  • πŸ› The backend Docker image build occasionally failed due to transient package-mirror errors during apt-get install

Security​

  • πŸ” Pinned sharp to ^0.35.3 via npm overrides to pull in a fixed version instead of the vulnerable transitive one

Why These Updates Matter​

The name search saves a lot of time for larger organizations that need to quickly find individual newsletter recipients. Just as important are the health check improvements: they make deployments start up more reliably and surface CI problems immediately with meaningful logs, instead of only showing up late and without context.

What's Next?​

Work on performance and infrastructure continues, the next release already focuses on noticeably faster load times.

Uni-Verein 1.2.0 – Progressive Web App and Mobile View πŸ“±

Β· 2 min read
RenΓ© Herrmann
Senior developer

Published on July 22, 2026

Uni-Verein 1.2.0 closes one of the biggest gaps from the project's early days: the software was previously optimized for desktop and tablet only starting now, Uni-Verein also works on smartphones and can even be installed like an app.

New Features​

  • πŸ“² Progressive Web App (PWA): Uni-Verein can now be installed to the home screen
  • πŸ“± Mobile-optimized layout: On smartphones, a hamburger menu with bottom navigation replaces the desktop sidebar, tables collapse into cards or a single-column view, dialogs open full-screen, and filter bars stack vertically
  • πŸ“‘ Offline indicator on the login screen: Shows "You're offline" whenever there's no connection or the server can't be reached, clearing automatically once reachability returns

Improvements​

  • 🧩 Larger frontend refactorings: mobile-specific views (audit log, member list) and the sidebar navigation were extracted into dedicated, reusable components
  • πŸ—‚οΈ The create/edit dialogs (contribution plans, users, member categories, links, import errors, confirm, icon picker, member form) were moved into standalone components under src/components/dialogs
  • πŸ“„ A shared ResponsiveTablePagination component is now used by every paginated table (Members, Mail recipients, SEPA, Contributions, Audit)
  • ✨ Consistent Prettier formatting applied across the frontend codebase
  • βš™οΈ The "Update Third-Party Notices" workflow now runs on feature branches instead of main
  • 🐳 docker-compose-ini.yml now fetches the current version from the latest GitHub release automatically instead of requiring it to be maintained manually in .env

Bug Fixes​

  • πŸ› The language switch button sometimes required two clicks before the language actually changed on first use
  • πŸ› The init script (docker-compose-ini.yml) left duplicate VERSION lines in .env because sed -i failed silently against the single-file bind mount

Why These Updates Matter​

Mobile support has been one of the most requested features since the very first release, and it now makes Uni-Verein practical for board work on the go whether checking members in at an event or glancing at the member list between lectures. Thanks to PWA support, the web app also feels almost like a native app, including offline access to already-loaded data.

What's Next?​

This closes an important milestone from the original roadmap. Next up are further performance and infrastructure improvements, be sure to check back here again soon.

Uni-Verein 1.1.0 – Automatic Update Checks and Important Bug Fixes πŸ””

Β· 2 min read
RenΓ© Herrmann
Senior developer

Published on July 16, 2026

Uni-Verein 1.1.0 brings the first major feature update since the initial release. This time the focus is on automatic update notifications, along with a few important bug fixes for everyday member management.

New Features​

  • πŸ”” Automatic update check: Uni-Verein now automatically compares the installed version against the latest GitHub release
  • πŸ“§ Admin email notifications: Administrators are automatically notified by email as soon as a new version becomes available
  • πŸ”” Notification bell in the frontend: A new bell icon in the frontend shows at a glance whether an update is available

Improvements​

  • πŸ—‚οΈ The backend Data folder was renamed to Models for a cleaner project structure
  • βš™οΈ Adjustments to the CI configuration

Bug Fixes​

  • πŸ› Fixed an issue where new members could sometimes be assigned duplicate member numbers

Why These Updates Matter​

The automatic update check ensures organizations always know when a new version of Uni-Verein is available, no more manually checking GitHub. Combined with the fix for member number assignment, everyday work with Uni-Verein becomes even more reliable.

What's Next?​

Thank you to everyone who contributed feedback and bug reports for this release! Work on new features like mobile view and an event calendar continues, so be sure to check back here again soon.

Uni-Verein 1.0.1 – Security Update for the Frontend πŸ”’

Β· One min read
RenΓ© Herrmann
Senior developer

Published on July 12, 2026

Just a few days after the big release of the first version, the first update has already arrived: Uni-Verein 1.0.1 is here. This time it's a small but important security update.

What Changed?​

A security vulnerability (CVE-2026-33630) was identified in the frontend's Docker image. This update adjusts the underlying Dockerfile to close the vulnerability.

  • πŸ”’ Security fix: Updated the frontend Dockerfile to resolve CVE-2026-33630

Why Does This Matter?​

Since Uni-Verein is used by organizations with sensitive member data, the security of the software is a top priority for me. Security updates like this one are therefore rolled out as quickly as possible whenever known vulnerabilities are identified.

Uni-Verein Goes Live. The First Version Is Here! πŸš€

Β· 3 min read
RenΓ© Herrmann
Senior developer

Published on July 6, 2026

It's here: After an intensive development period, I'm excited to introduce the first version of Uni-Verein, an open source software specifically designed for student organizations, student councils, and university groups.

The Idea Behind Uni-Verein​

Anyone who has been active in a university organization knows the typical challenges: member lists in Excel spreadsheets that are never quite up to date. Emails sent manually and individually. A patchwork of different tools that don't really work well together.

This is exactly where Uni-Verein comes in. The goal was to create a central, simple, and above all free solution tailored to the needs of student organizations, without unnecessary bells and whistles, but with the features that are actually needed in everyday club management.

Special thanks go to WiChem Kiel e.V., which, as a cooperation partner, contributed valuable real-world feedback from the very beginning and actively shaped the development.

What's in the First Version?​

With today's release, the following core features are already available:

  • Central member management: all relevant data in one clearly organized place
  • Email communication directly from the system: no more external tools needed to keep members informed
  • Open source & free: the code is freely accessible, anyone can contribute or use the software for their own organization

Important Note About the Current Version​

Since this is an early release, the software is currently optimized for tablet and desktop use. A mobile view is already planned and will follow in a future update.

Also on the roadmap are additional practical features, including:

  • πŸ“„ Document management: for easier accounting and expense tracking within the organization
  • πŸ“… Event calendar: for clearly planning and communicating club events

Uni-Verein is therefore a project that will continue to grow and evolve always with the goal of making everyday life in university organizations a little bit easier.

Feedback is Warmly Welcome!​

As an open source project, Uni-Verein lives from the community. That's why I'm happy to hear all kinds of feedback:

  • Are you using the software in your organization? Share your experiences with me!
  • Do you have technical feedback on the code or architecture?
  • Is there a specific feature missing that would make everyday club life easier?

Anyone who wants to actively support the project as a contributor is also warmly invited to get in touch.

What's Next?​

This is only the beginning. In the coming weeks and months, I will continue working on new features and improving the software based on your feedback. Stay tuned and feel free to check back here on the blog regularly to stay updated on the latest developments.

Thank you to everyone who has supported this project so far above all WiChem Kiel e.V. for the great collaboration!