Inspiration

It always happens the same way. Someone pays for the table, and then for the next week they're the one sending reminder texts, doing tax and tip math in their head, and eventually just eating the five bucks nobody paid back because chasing it felt worse than losing it. We've all been that person. Venmo and Cash App exist, but they still mean typing a receipt into a calculator, finding everyone's username, and waiting a day or two (or paying a fee) for the money to actually move. We wanted the whole thing, snap the receipt to money in your account, to take about as long as it takes to pay for the meal in the first place. And we didn't want it limited to meals either. Ski trip rentals, concert tickets, a group Airbnb, any shared tab works the same way.

What it does

The host takes a photo of the receipt. Gemini reads it and turns it into line items, tax, and tip in a couple seconds, and the host can fix anything it misread before sharing. That bill shows up on the host's screen with a QR code. Everyone at the table scans it, types their name, and taps whatever was theirs, shared items split evenly between whoever claimed them, and tax and tip get divided proportionally so nobody does math by hand. Then each person pays their share with Solana Pay, which settles in about a second for a fraction of a cent, and the host's screen stamps each name "Paid" the moment it confirms, live.

There's also Tabby AI, a chat you can talk to instead of photographing anything, typed or spoken, that builds the bill from a plain description. And once you've hosted a few tabs, a history page shows every one of them with who still owes what, an AI-written summary of your spending in plain language, and a monthly trends chart that sorts your tabs into categories like food, travel, and entertainment based on what was actually bought, not just the title.

How we built it

Next.js on the frontend and for the API routes, Supabase (Postgres) holding bills, items, and payments. Gemini reads receipt photos against a structured JSON schema so we get back real line items instead of a wall of text we'd have to parse ourselves, and it does the same structured-output trick for categorizing tabs and summarizing spending. For payments we used Solana Pay: each person's share gets a one-time reference address, and when their wallet sends the payment, our server finds that exact transaction on chain and checks it actually paid the right amount to the right wallet before marking it paid. No payment processor sitting in the middle, no smart contract to write. Voice input and the "paid" announcements run through ElevenLabs.

Three of us split this up by layer pretty naturally: the Solana payment and verification pipeline, the wallet and host UI, and the receipt and bill flow with Gemini.

Challenges we ran into

Getting Solana Pay actually verifying correctly took a while, telling the difference between "nobody's paid yet" and "payment sent but not confirmed yet" and "wrong amount sent" all needed separate handling, and we only had devnet to test against, which meant constantly refilling test wallets through a faucet that's itself rate limited.

The QR code was its own small nightmare. It encodes whatever URL the host's screen is actually on, so running the app locally during dev means the QR points at an address nobody's phone can reach, it just fails silently with no useful error. We burned real time on that before realizing it wasn't a bug, it was just localhost not being a real address, and even once we moved to testing over the local network, campus wifi turned out to block phones from reaching each other anyway. Deploying to Vercel made it work immediately.

Google also quietly deprecated the Gemini model name sitting in one of our env files partway through the weekend, which broke the AI chat with a generic error and no obvious cause until we traced it back to a 404 from Google's own API telling us exactly which model to switch to.

Accomplishments that we're proud of

Getting a payment to actually confirm on chain, in real time, in front of people watching the screen, and seeing their name stamp "Paid" a second later, never stopped being satisfying. We also like that a guest never has to download anything or make an account to claim their items, they scan, they tap, they're done.

What we learned

The part that sounds easy, "just split a bill," has a surprising number of edge cases: shared items, unclaimed items, someone the host forgot to charge, rounding so the parts always add back up to the real total.

We also learned the honest limits of what we built. Both sides, the host receiving money and the guest paying it, need an actual Solana wallet with funded SOL right now. That's a real barrier for anyone who isn't already in crypto, and it's a bigger ask than "do you have Venmo." We're not pretending otherwise, it's the most significant piece missing before this works for a general audience and not just people who already have a wallet.

What's next for Tabby

The honest next step is embedded wallets, letting someone join with just their name or email and get a wallet created for them behind the scenes, fundable by card, so "no app needed" actually extends to the payment step and not just claiming items. Beyond that: netting out who-owes-who across multiple tabs with the same recurring group of friends, and support for stablecoins so what people see as "what they owe" isn't denominated in a volatile token.

Built With

Share this project:

Updates

Submission history