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.
- โ
Auth + Profiles (Supabase Auth +
profilestable + auto-profile trigger) - ๐๏ธ Multi-household groups with invite codes
- ๐งพ Add transactions with:
- โ Equal split
- ๐งฎ Custom amounts
- ๐ Percent split
- ๐ฑ Optional multi-currency input + stored exchange rate
- ๐ Recurring expense flag
- ๐ Row-Level Security (RLS) across tables
- ๐งช Demo mode: seed 3 users + 3 households via
/api/seed
- Inspiration
- What it does
- How it works
- Key features
- Architecture
- Tech stack
- Database schema
- Security (RLS)
- Quick start
- Environment variables
- Migrations + RPCs
- Demo seeding
- Usage
- Project structure
- Troubleshooting
- Roadmap
- Credits
- License
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 it dead simple to track shared spending and settle up.
Roomies Ledger lets you:
- Create or join a household using an invite code
- Add an expense with:
- amount + date + optional place
- payer selection
- split type: equal / custom amounts / percentages
- View transactions in a clean feed + drill into details
- See net balances and who should pay whom to settle
- Auth: Supabase Auth signs users in/out.
- Profile: A trigger creates a
profilesrow on signup (handle_new_user). - Groups: Users can create a group (with an invite code) or join an existing one by code.
- Members:
group_membersties users โ groups and stores permissions. - Transactions: Stored per group, always normalized to group currency (with optional original currency metadata).
- UI: Transaction creation is a 3-step sheet: details โ amount โ split.
- Create a household โ invite roommates with a short code
- Join household with code โ instant access to the groupโs transactions
- Step 1: Title, date, place, payer
- Step 2: Amount + currency + optional receipt + recurring toggle
- Step 3: Split equal / exact / percentage
- Input expense in a different currency than the group
- Store:
originalCurrencyoriginalAmountexchangeRate
- Normalize to group currency so balances stay consistent
- Tag expenses as recurring with:
- daily / weekly / biweekly / monthly / yearly
/api/seedcreates demo users + groups so judges can try it instantly
Frontend
- Next.js + React + TypeScript
- UI: shadcn/ui + Tailwind
- State:
useStore()(central store)
Backend
- Supabase:
- Postgres tables + RLS policies
- Auth + profiles trigger
- SQL RPCs for group creation + join by invite code
- Next.js
- React
- TypeScript
- Supabase (Auth + Postgres + RLS + RPC)
- Tailwind CSS
- shadcn/ui
- date-fns
- lucide-react
Stores display name + avatar color for each auth user.
Households (name, currency, invite code, creator).
Members tied to a group. Also holds permissions for actions like adding/deleting transactions.
Expenses per group:
- normalized
amountin group currency - optional original currency metadata
- split metadata (equal/exact/percent)
- optional recurring + receipt URL
Row-level security is enabled for core tables. Policies ensure:
- users only see groups they belong to (and creators always see their own groups)
- members can only access transactions for groups theyโre in
- write permissions are constrained by membership/ownership rules
npm install

