← Bryan Lee01 / 05

Tally

01 / 05 · Live · Since Aug 2026

Split a bill the way people think.

Pin what one friend pays, like $25 for a salad. Everyone else rebalances, and the total stays exact to the penny.

Open Tally →
Made for
Whoever paid the bill
My role
Idea, design, and code
Built with
Next.js, Supabase, Resend
Status
Live · Open it
The Tally home page on a phone
One share pinned at $14.00 while the other three rebalance
Ten shares, each with a chip that shows how far it moved
Pin one share, and every other share moves.Real screens from the public demo.
The storyAug 2026

A dinner for ten came to $1,959. One friend owed exactly $275. One owed $25, and two owed $72 each. One owed an even share plus $100. Everyone else split the rest.

Most bill apps think in shares and percents. Nobody at a table talks that way, so this bill needed a spreadsheet on the side.

So in Tally, you tap a person and set what they pay. Everyone else rebalances at once, and the total stays exact to the penny. Friends open a link, tap what they had, and see one number.

I wrote the plan in July 2026 and landed the first working version in one big commit on August 12. The live app is at 104 commits now.

The idea
Nobody at dinner says "put me down for 12%." They say "I’ll pay $25." So you pin that, and one equation splits the rest.
What makes it good05 ideas
01

Pin a share, and the rest rebalances

Tap a person and pick a rule. Pin an exact amount, add or take off a flat amount, or pay a percent more or less than an even share. Everyone you haven’t pinned moves at once.

Five kinds of rules fold into one equation, so one change moves everyone in a single step. The $1,959 dinner from the story is a named test in the engine.

Maya pinned at $14.00, the other three rebalanced
The sheet for one person: four plain choices and a meal, tax, and tip breakdown
02

Exact to the penny

Every split adds up to the bill in whole cents. Each person’s meal, tax, and tip add up to their share, too.

Money is stored as whole cents, so there are no decimals to drift. Leftover pennies go to the shares that lost the most in rounding. That’s why one friend pays $233.34 while four pay $233.33. Every test run throws 10,000 random bills at the engine.

splitwithtally.com
Ten shares on a laptop, beside the locked total of $1,959.00
03

A chip that says what moved

After an edit, a small chip beside each amount shows how far it moved. The person you changed gets +$15.00, and each person who absorbed it gets −$2.50.

It answers "why did my number change?" before anyone asks. Chips wait until you tap Done, and they sit in a slot that’s always there, so the numbers don’t shift. They’re plum because an earlier coral version looked like debt.

Ten shares after one edit, each with its change chip
04

Scan the receipt, then check the math

Snap a photo of the receipt, and an AI model reads each line. Tally adds the lines up and checks them against the printed subtotal. Until they match, it holds the bill and tells you how far off it is.

If the AI misreads one price, somebody pays the wrong amount. Plain arithmetic catches that before anyone sees a bill. It also handles receipts that only print a total, and it knows "6 Jam Doughnuts" is one item, not six.

A demo receipt that matches its $121.00 subtotal
05

Claim your items from a link

The host shares a link. A friend types a name, taps what they had, and sees their share. Anything nobody claims splits evenly, and the host locks the final split.

Friends don’t need an account or an app. Taps show at once, and if two people grab the same item, the app says so in plain words: "Someone claimed this first."

The demo guest page: one share, split into meal, tax, and tip
The look06 colors
  • Ink#1e1c24
  • Paper#f2eff9
  • Plum#7c4dbd
  • Lavender#ece7f6
  • Green#20744f
  • Mint#d9f0e1

DM Sans for the interface, Instrument Serif for the italic accents, and tabular numbers everywhere.

Plum runs the interface. Green only shows up when the numbers add up. The main text colors all clear a 4.5 to 1 contrast ratio.

Try itA working demo · made-up data

Tap a rule to pin a share.

Every other share moves, and a chip shows by how much. The total stays exactly $186.40.

TallyTap a rule
The small stuff06 details
  • Numbers stay put

    The chip column is always there, even when it’s empty, so amounts don’t shift when a chip appears.

  • No lag on a tap

    Claim taps show at once and sync with the server after. A test fires eight fast taps and checks that every frame along the way is right.

  • Honest progress

    The receipt scan shows three real steps and a seconds counter. At 20 seconds, a line tells you it’s still working.

  • Errors in plain words

    Database errors become sentences like "This bill is locked." You never see raw error text.

  • No rewriting history

    Group debts can’t be edited. Reopening a locked bill cancels the old entries with new ones, the way an accountant would.

  • Made for thumbs

    The bill sheet rides above the phone keyboard, tap targets are 44 px, and money fields open the number pad.

Under the hoodNext.js, Supabase, Resend
  • One repo, three parts: the Next.js app, a money engine in pure TypeScript with no dependencies, and the ledger logic. Supabase runs Postgres and sign-in, and Resend sends the email.
  • Every split calls one function, solveBill. Even the demo card on the home page runs the real engine. Cents are whole numbers, percents are parts per million, and shared items are exact fractions.
  • Postgres enforces the rules. All 17 tables use row-level security, and triggers freeze locked bills and the ledger, so a buggy screen can’t change them. A guest link’s token is stored only as a hash.
  • Receipt photos shrink in the browser first. A vision model reads them through OpenRouter with a strict answer format, and code checks the total before anyone can claim.
  • Tally never moves money. Settling up hands off to a Venmo link.
  • I write my shortcuts down in the code. Claiming checks for changes every 4 seconds instead of holding a live connection, and a note says how to switch later.
Started
Aug 2026
Commits
104
Tests
288
Lines of code
19,260
Random bills per test run
10,000
Test coverage of the money math
100%