Roomies Ledger 🏠💸
A modern expense-splitting app for roommates — track shared purchases, split bills (equal/custom/%), and settle up fast.
Built for hackathons, dorms, apartments, and anyone tired of “who owes who?” texts.
Inspiration
Roommates split groceries, utilities, random Target runs, and it always turns into:
- “Did you Venmo me?”
- “I paid last time”
- “Wait how much do I owe?”
Roomies Ledger makes shared spending easy to track and easy to settle.
What it does
Roomies Ledger lets you:
- Sign up / log in and get an auto-created profile
- Create or join a household using an invite code
- Add expenses with:
- title + date + optional place
- who paid
- split type: equal, custom amounts, percent split
- optional receipt upload
- optional recurring flag (daily/weekly/biweekly/monthly/yearly)
- View a clean transaction feed with drill-down details
- See net balances and who should pay whom to settle up
How we built it
- Frontend: Next.js (App Router) + React + TypeScript
- UI: Tailwind CSS + shadcn/ui + lucide-react
- State: Central store (
useStore) for group context, members, transactions, and UI flows - Backend: Supabase (Postgres + Auth + RLS)
- Auth + Profiles: a trigger creates a
profilesrow on signup (handle_new_user) - Groups + Membership:
groups+group_membersconnects users to households and permissions - Transactions: stored per group with split metadata (equal/exact/percent)
- RPCs: SQL functions for creating groups and joining by invite code
- Security: RLS policies restrict reads/writes to members of a group
- Auth + Profiles: a trigger creates a
- Demo mode:
/api/seedcreates sample users + households for quick judging
Key features
Groups + invite codes
Create a household, share the code, and roommates join in seconds.
3-step transaction flow
A guided add-expense flow: details → amount → split. Keeps the UX fast on mobile.
Multiple split modes
- Equal split
- Exact custom amounts
- Percent split
Optional multi-currency input
Enter an expense in a different currency, store original amount/currency + exchange rate, normalize into the household currency so balances stay consistent.
Recurring expenses
Tag something like rent or utilities as recurring with a simple frequency setting.
Real security (RLS)
Members only see and modify data inside households they belong to.
Challenges we ran into
- Getting split logic correct across equal/exact/percent
- Keeping balances consistent when optional multi-currency metadata is present
- Designing strict RLS policies that still allow smooth group creation/join flows
Accomplishments we’re proud of
- Clean mobile-first UX with a fast, guided expense flow
- Solid database design with normalized amounts + optional original currency fields
- RLS across core tables so data access stays scoped to households
- One-click demo seeding for judges
What we learned
- RLS is powerful, but you have to design schemas and RPCs around it
- Split logic is easy to get “mostly right” and hard to get fully correct
- A step-based UI reduces user error for multi-input forms
What’s next
- “Settle up” flow to generate optimal payment suggestions
- Push notifications for new expenses and settle reminders
- Receipt OCR to auto-fill amount and merchant
- Offline-first support for spotty hackathon Wi-Fi
Tech stack
- Next.js
- React
- TypeScript
- Supabase (Auth + Postgres + RLS + RPC)
- Tailwind CSS
- shadcn/ui
- date-fns
- lucide-react
Log in or sign up for Devpost to join the conversation.