The time has come...
⚠️ READ BEFORE UPDATING!
This release includes major database schema changes. Please follow the migration guide carefully.
I'm excited to announce the release of SplitPro 2.0! This release brings long-awaited features like recurring transactions, currency conversions, and bank transaction integration, along with a fundamental architectural change to how balances are computed.
Your feedback is invaluable! As I am mostly one person running a small instance for friends, I can't catch all the bugs, so I encourage you to test thoroughly and report any issues you encounter. Bug reports and UX feedback—especially on the new features—help me improve SplitPro for everyone.
Please check out the new docs, especially: https://github.com/oss-apps/split-pro/blob/main/docs/MIGRATING_FROM_V1.md
New Features
💱 Currency Conversions
Convert expenses and group balances between currencies with ease! We support three exchange rate providers:
- Frankfurter — Completely free, covers ~30 major currencies
- Open Exchange Rates — 1000 requests/day free tier, extensive currency support
- NBP — Polish National Bank, no API key required, but some rates may be out of date and I'm not sure about rate limits
Rates are cached in the database to minimize API calls. Configure your preferred provider(s) via environment variables.
Features:
- Convert individual expenses between currencies
- Convert group balances on-the-fly directly from the balance view
- Edit existing conversion transactions
screenrecording-2025-12-31_22-23-59.mp4
screenrecording-2025-11-30_17-57-46.mp4
🔄 Recurring Transactions
Set up automatic recurring expenses with cron-based scheduling powered by pg_cron. Perfect for rent, subscriptions, or any regular shared expense.
How it works:
- When creating an expense, you can set a recurrence schedule using a cron rule
- The recurrence creates derived expenses from the template expense, which can then be manually adjusted or deleted independently
- Editing the template updates the schedule for all future expenses, but does not affect existing derived expenses
- Deleting the template removes the recurrence rule but preserves all derived expenses
- Confirmation dialogs clearly explain the impact of each action
Note:
pg_cronsupports a subset of standard cron syntax. Features like ranges (1-5) or multiple values (1,15) are not supported. See the pg_cron documentation for details.
Recurrence Management Page:
A dedicated page (accessible via the Activity tab) lets you manage all recurring expenses in one place:
- View all active recurrences
- Edit recurrence schedules without navigating to individual expenses
- Delete recurrence rules while keeping the original expense intact
screenrecording-2025-12-31_22-26-52.mp4
screenrecording-2025-10-07_21-47-50.mp4
🏦 Bank Transaction Integration
Import transactions directly from your bank account! Connect via Plaid to fetch transactions and convert them into SplitPro expenses.
Note: GoCardless integration is deprecated as they have closed new signups. Existing GoCardless users can continue using it, but we recommend migrating to Plaid.
Features:
- Connect your bank from the Account page
- Browse and select transactions when adding expenses
- Multi-add — add multiple transactions as expenses at once
- Duplicate detection prevents adding the same transaction twice
To get started, create a free account on Plaid, obtain your API keys, and add them to your environment variables. See README_BANKTRANSACTIONS.md for details.
Nov-08-2025.15-13-501.mp4
UI/UX Improvements
Month Headers in Expense Lists
Long expense lists are now organized with month headers, making it easier to navigate your transaction history.
Debug Info Dialog
New diagnostic dialog in Account settings shows version info, git hash (in dev), and checks for available updates.
screenrecording-2025-10-20_22-02-04.mp4
Improved Category Picker
Redesigned layout with responsive grid and proper text wrapping for localized category names.
Enhanced Expense Details
- Links to people and groups directly from expense details
- Indicator icon shows if a group has debt simplification enabled
- Only relevant amounts shown in friend expense lists (your actual debt/credit, not total expense)
Other UI Improvements
- Fixed calendar to always show 6 weeks (no more size fluctuations)
- "No providers configured" message on signin page when OAuth isn't set up
- Responsive icon buttons across the app
- Fixed avatar sizing issues on Safari
- Improved settle-up flow: editing a settlement reopens the amount dialog instead of expense edit
Breaking Changes
Database-Computed Balances
We've migrated from manually-maintained balance tables to PostgreSQL views. This fundamental change:
- Treats expenses as the source of truth — balances are computed, not stored
- Eliminates balance inconsistency bugs — no more stale or incorrect balances
- Enables recurring transactions — which couldn't work with the old table-based approach
- Performs well at scale — benchmarked on large datasets with no noticeable performance impact
The old "Recalculate Balances" button in groups is no longer needed and has been removed.
Expense ID Migration
Expense IDs have been migrated from CUID to native PostgreSQL UUID. This is required for pg_cron to insert recurring expenses via SQL procedures.
PostgreSQL Image Requirement
The ossapps/postgres image with pg_cron extension is now required. See the Migration Guide above.
Infrastructure & Developer Experience
- Keycloak OIDC Provider — Added support for Keycloak authentication (#395)
- Improved Healthcheck — Now verifies database readiness, not just container health (#363)
- Automatic Cache Cleaning — Currency rate cache and other caches are cleaned via configurable
pg_cronjobs - TypeScript Go — Faster type checking in development and CI
- PostgreSQL 17+ Support — Updated Docker compose paths for newer PostgreSQL versions
- **
New Locales
Thanks to our amazing community translators, SplitPro now supports:
- 🇫🇷 French (fr)
- 🇳🇱 Dutch (nl)
- 🇧🇷 Portuguese - Brazil (pt-BR)
- 🇲🇽 Spanish - Mexico (es-MX)
- 🇦🇷 Spanish - Argentina (es-AR)
- 🇭🇺 Hungarian (hu)
🌍 Help Us Translate!
This release adds many new translation keys for currency conversions, recurring transactions, and bank integration. We need your help to keep all languages up to date!
Contribute translations on Weblate →
Contributors
Thank you to everyone who contributed to this release! 🎉
- @FriesischScott — Database balance views implementation and performance benchmarks
- @alexanderwassbjer — Bank transaction integration with GoCardless/Plaid
- @BhaskarKulshrestha — Negative numbers fix
- @davidhernandeze — Spanish locale variants (Mexico, Argentina)
- @ahmedsalah52 — Month headers feature
- @lx4r — German locale corrections
- @beposec — Keycloak provider
- @vabatta — Italian translations
- @avargaskun — PWA install translations
- @MaximilianHausen — fixing GitLab OIDC
- @pchampio - fixes around bank transactions
- @samwiseg0 - Postgres volume fix
- And all our Weblate translators for keeping SplitPro accessible worldwide!
Feedback Welcome!
This is a big release and we want to hear from you:
- 🐛 Found a bug? Open an issue or comment in the discussion below
- 💡 Have a suggestion? Start a discussion
- ⭐ Enjoying SplitPro? Give us a star!
We're especially interested in feedback on:
- The new recurring transactions feature and cron scheduling UX
- Currency conversion workflow and provider reliability
- Bank transaction import experience
- Any balance calculation discrepancies
Full Changelog: v1.5.7...v2.0.0
