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 profiles row on signup (handle_new_user)
    • Groups + Membership: groups + group_members connects 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
  • Demo mode: /api/seed creates 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

Built With

Share this project:

Updates