SplitPro is a self-hosted alternative to Splitwise designed for individuals and groups who want full control over their expense data. It solves the frustration of proprietary expense apps that charge for core features like adding expenses or viewing balances. Built with TypeScript, Next.js, and Tailwind CSS, it offers a modern, mobile-first experience with full data ownership.
The app runs via Docker Compose using PostgreSQL and supports advanced features like recurring expenses via pg_cron, bank transaction imports via Plaid, and multi-currency conversions. Authentication is handled via NextAuth with email magic links, Google OAuth, and OIDC providers. All financial data is stored as BigInt to prevent rounding errors, and receipts are stored locally on persistent volumes.
What You Get
- Advanced Expense Splitting - Split expenses by equal share, percentage, exact amounts, shares, or adjustments with support for negative expenses (refunds) and deterministic leftover penny distribution.
- Multi-Currency Support - Track expenses in different currencies with real-time conversion using configurable rate providers, and view consolidated balances in a single currency.
- PWA with Push Notifications - Install as a Progressive Web App on mobile or desktop with real-time push notifications for new expenses, settlements, and group updates.
- Bank Transaction Integration - Import expenses directly from Plaid-supported banks to auto-create transactions, reducing manual entry and improving accuracy.
- Splitwise Import Tool - Partially import friends and groups from Splitwise to migrate your network without manual re-entry (expenses not yet supported).
- Recurring Expenses via pg_cron - Automate recurring bills (rent, subscriptions) using PostgreSQL’s pg_cron extension with prebuilt Docker images provided for seamless setup.
Common Use Cases
- Running a shared apartment rent system - Roommates use SplitPro to track rent, utilities, and groceries across multiple currencies, with automatic balance summaries and receipt uploads for transparency.
- Managing group travel expenses - A travel group splits flight, accommodation, and meal costs across 10+ people in different currencies, using SplitPro’s exact split and conversion features to avoid disputes.
- Self-hosting financial data for privacy - A privacy-conscious user deploys SplitPro on their home server to avoid cloud-based expense trackers that monetize user data or require subscriptions.
- Automating recurring household bills - A family uses SplitPro’s pg_cron-powered recurring expenses to auto-track monthly payments for Netflix, internet, and insurance without manual input.
Under The Hood
Architecture
- Clear separation of concerns through Next.js app directory structure, with server-side API routers using tRPC to isolate business logic from UI components
- Dependency injection via tRPC context enables consistent database and authentication access across all procedures
- Domain-driven design with modular services for expenses, currency rates, and data access, ensuring single-responsibility and testability
- React components follow composition patterns using reusable UI primitives and hooks that encapsulate state and internationalization logic
- Environment validation with Zod schemas enforces strict boundaries between server and client configurations
- End-to-end type safety achieved through TypeScript, path aliases, and tRPC-generated clients
Tech Stack
- Modern SSR/SSG frontend built on Next.js, React, and TypeScript with strict type enforcement
- Prisma ORM with PostgreSQL for type-safe database interactions and migrations
- tRPC integrated with React Query for type-safe client-server communication and state management
- Tailwind CSS with shadcn/ui and class-variance-authority for themable, utility-first components
- Dockerized production deployment using Node.js and pnpm for optimized, environment-aware execution
- Comprehensive testing and code quality tooling including Jest, oxlint, and husky
Code Quality
- Extensive test coverage spanning unit, integration, and edge cases with detailed assertions for financial logic
- Strong type safety enforced across the stack via Zod, Prisma-generated types, and TypeScript interfaces
- Robust error handling with custom boundaries and graceful degradation in UI components
- Clean, component-driven architecture with atomic primitives, Zustand state stores, and clear layer separation
- Automated validation pipelines prevent misconfigurations through environment schemas and timezone-aware transformations
- Comprehensive linting and pre-commit hooks maintain code consistency and reduce regressions
What Makes It Unique
- Native multi-currency balance reconciliation using SQL windowing and recursive aggregation, avoiding external accounting dependencies
- Dynamic currency conversion with real-time rate fetching and user preference persistence
- Timezone-aware cron transformer that adjusts scheduled tasks without external services
- Custom OAuth2 adapter system handling non-standard identity provider fields via Prisma extensions
- Client-side balance visualization with intelligent currency aggregation and fallback mechanisms
- Unified financial workflow integrating authentication, banking, and payment systems with zero third-party billing dependencies