SplitPal Splitting expenses without the spreadsheet.
An account-free group expense app, built around cent-safe calculations, shared links, and straightforward settlements.
Personal project · Design, development & deployment
Create a group, share one link, and record expenses. SplitPal calculates what each person owes and suggests transfers to settle the group.
- Next.js UI
- API + validation
- Drizzle ORM
- Turso / libSQL
The problem
A group trip creates a small accounting problem: different people pay, not everyone shares every expense, and the final balances need to remain understandable. The app keeps the workflow focused on a group, its members, expenses, and settlements.
What I built
I built and deployed the app with the Next.js App Router, TypeScript, and a Turso/libSQL database accessed through Drizzle ORM. The interface combines server-rendered group data with client interactions for adding members and expenses.
Beyond equal splitting, the app supports opening and closing trips, trip history, CSV export, and a shared example group. Group creation and expense creation use transactions so related records are written together.
Decisions that keep balances trustworthy
- Store money as integer cents
- Calculations use integer amounts rather than floating-point currency values. Split validation checks that participant shares add up to the recorded expense.
- Validate within the group
- Write endpoints verify that the payer and split members belong to the requested group. Duplicate members and inconsistent totals are rejected.
- Suggest practical settlements
- A greedy algorithm reduces outstanding balances through suggested transfers. It does not claim the globally smallest number of transfers for every balance set.
The shared-link trade-off
Skipping accounts makes it quick to start and share a group. The boundary is equally important: browser identity is not authentication, and anyone with the group link can participate. There are no private accounts or owner roles.
That makes this an appropriate demo or tool for non-sensitive groups. Confidential financial records would require a stronger access model. The example trip is also shared and editable, rather than an isolated sandbox.
Validation and outcome
The published tests cover conversion to cents, payer and participant balances, settlement totals, invalid split totals, duplicate members, and references to members in another group. The repository runs lint, type checking, tests, and the production build in CI.
The result is a deployed app with public source and a working example trip, taking the group-expense workflow from interface design through persistence, validation, testing, and deployment.
Explore the example trip