尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Snap the receipt. Everyone pays their part.
Tabby is for the moment after a group dinner, a ski trip, or a shared grocery run, when one person has paid for everyone and now has to collect. The host snaps the receipt (or just says what everyone had), friends scan a QR code, tap what was theirs, and pay their exact share in about a second. Payments settle on Solana, every one carries an on-chain receipt, and the bill stamps itself Settled when the last person pays.
No app to install, no accounts, no math, no chasing.
Live demo: hackknight.vercel.app (Solana devnet, test money only)查看完整 README ↗Snap the receipt. Everyone pays their part.
Tabby is for the moment after a group dinner, a ski trip, or a shared grocery run, when one person has paid for everyone and now has to collect. The host snaps the receipt (or just says what everyone had), friends scan a QR code, tap what was theirs, and pay their exact share in about a second. Payments settle on Solana, every one carries an on-chain receipt, and the bill stamps itself Settled when the last person pays.
No app to install, no accounts, no math, no chasing.
Live demo: hackknight.vercel.app (Solana devnet, test money only)
Built in one weekend at Hack Knight Fall 2026 (Queens College). Submitted to Best Financial Hack, MLH Best Use of Solana, MLH Best Use of Gemini API, and MLH Best Use of ElevenLabs.
Splitting a shared bill is a small payment problem that happens constantly, and it's still awkward. One person fronts the whole check. Then come the screenshots of the receipt, the tax-and-tip math done by hand on a phone calculator, the "who had the guac?" debate, and a week of reminders in the group chat. Often the person who paid quietly eats the difference rather than chase anyone.
The tools people use today make this worse in specific ways. Payment apps don't know what anyone ordered, so someone has to do the math first. Transfers between different apps don't connect. And the person collecting has no single place that shows who has paid and who hasn't.
For the person who paid (the host)
For everyone else
Every repayment is a real token transfer on Solana devnet, from the friend to the host. We use Solana Pay conventions throughout: each payment request gets a unique reference address, and the server finds the transaction carrying that reference and runs Solana Pay's validateTransfer to confirm the right amount reached the right wallet before marking anyone paid. There is no custom smart contract and no database flag a person could flip; "Paid" means the chain says so.
Each payment also carries an on-chain memo such as Tabby: Ana paid Sam back · Weekend ski trip, so the receipt is readable by anyone on Solana Explorer, not just inside our app.
There are three ways to pay, so nobody gets stuck: a one-tap payment that needs no wallet (for the demo, our server funds a one-time wallet with test tokens and signs for it), Pay with Phantom (our server builds the transaction and the guest's wallet signs it), and a standard Solana Pay QR any compatible wallet can scan.
Why Solana for this: shared bills are small, frequent payments between friends. Settlement in about a second at a fraction of a cent means paying back $12.04 is as easy as tapping a button, and the public record removes any "did you get my payment?" back-and-forth.
Gemini does three jobs, all using structured output (a JSON schema) so the app receives data it can check rather than free text:
We never let the model do arithmetic that matters. Gemini reports "8% tax" as a percentage and our code computes the dollars; every price is validated before it's used.
sequenceDiagram
participant H as Host (phone or laptop)
participant T as Tabby (Next.js on Vercel)
participant G as Gemini
participant F as Friend (phone)
participant S as Solana devnet
H->>T: Receipt photo, or "two pizzas at 18..."
T->>G: Image or words + JSON schema
G-->>T: Items, tax, tip
H->>T: Confirm, choose split, share
T-->>H: Live bill with QR code
F->>T: Scan QR, pick items (or say them)
F->>T: Pay my share
T->>S: Transfer + reference + memo
S-->>T: Confirmed (~1 second)
T->>S: Find by reference, validateTransfer
T-->>H: Paid stamp, read aloud
More detail: Architecture · How the split is calculated
You'll need Node 20+, a free Supabase project, a Gemini API key, and (optionally) an ElevenLabs key.
npm install --legacy-peer-deps
cp .env.example .env.local # then fill it in
npm run devnet init # creates the devnet test token
npm run dev
Then run supabase/schema.sql and both files in supabase/migrations/ in the Supabase SQL editor. The full walkthrough, including every environment variable, deploying to Vercel, and funding demo wallets, is in Setup.
| Guide | What's in it |
|---|---|
| Architecture | How the pieces fit, the data model, the three payment paths, how payments are verified, and the security model |
| How the split is calculated | The exact rules for items, shared dishes, tax, tip, leftovers, even splits, and rounding, with a worked example |
| Setup | Local development, database, devnet test money, deployment, and troubleshooting |
| API reference | Every endpoint, what it expects, and what it returns |
| Demo guide | The pitch script, a pre-demo checklist, and backup plans |
app/
page.tsx Home and review screens (host)
bill/[id]/page.tsx Live bill (host)
bill/[id]/claim/page.tsx Guest screen
history/page.tsx Your tabs
settings/page.tsx Profile
components/ Tabby AI chat, guest voice matching, reminder panel, QR, shared hooks
api/ Server routes: receipts, AI, voice, bills, payments
lib/
split.ts All split math (pure functions, no I/O)
solana.ts, transfer.ts Solana Pay URLs, transaction building, on-chain verification
payments.ts Shared logic for every way to pay
assistant.ts Cleans and checks Tabby AI's draft bills
ratelimit.ts, ai.ts Abuse protection and graceful AI fallbacks
supabase/ Schema and migrations
scripts/setup-devnet.mjs Creates and funds the devnet test token
Built by Faizan Khan, Tobiloba Onabanjo, and Mohamed Awad.
Copyright 2026 Faizan Khan, Tobiloba Onabanjo, and Mohamed Awad.
Licensed under the Apache License, Version 2.0. You may use, modify, and share this code, including commercially, as long as you keep the license and copyright notices and note any changes you make. See NOTICE for attribution.