Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
Scan a receipt, tap who had what, and PayNow your friends.
FinanceGitHub @joshhlimOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Scan a receipt, split the bill, PayNow your friends
Loading the full README.
Read the full README ↗Singapore bill splitter: scan a receipt, tap who had what, settle with PayNow. Live at wesplit-sg.vercel.app.
/b/[id]) shows each person's amount and QR, follows paid status, and can be revoked. Receipt photos stay on the owner's device and in private storage.ai, @ai-sdk/google) calling Gemini@supabase/supabase-js, @supabase/ssr)qrcode for PayNow QRsThe split math and PayNow payload live in lib/split.mjs. npm test runs the unit tests there.
The UI is one client page. Bills are written to the device first. A scan posts the photo to a route handler, which asks Gemini for structured line items and then discards the image. Accounts, sync, and public links go through Supabase when those environment variables are set.
flowchart LR
phone[Browser]
app[Next.js app]
scan["/api/scan"]
gemini[Gemini]
device[localStorage and IndexedDB]
supa[Supabase]
share["/b/id"]
phone --> app
app -->|photo| scan
scan --> gemini
app --> device
app -.->|signed in| supa
share --> supa
/api/scan checks the request origin, a short proof of work, and per-IP limits, then returns the merchant, items, discounts, and totals. PayNow QRs are built in the browser (EMVCo SGQR). Signed-in users sync bills, friends, and the PayNow profile to Postgres, and a compressed receipt photo to a private Storage bucket. Creating a share link stores a snapshot through a Supabase function; /b/[id] reads that snapshot.
Node.js 22.
npm install
npm run dev
Open http://localhost:3000.
npm test
npm run build
npm start
Names only. Put them in .env.local, which is gitignored. Scanning and splitting need the Gemini key. Accounts, sync, and share links need both Supabase variables.
| Name | Role |
|---|---|
GOOGLE_GENERATIVE_AI_API_KEY | Gemini API key. Required to scan. Read by @ai-sdk/google. |
ASK_MODEL | Optional model id. Defaults to gemini-3.5-flash-lite. |
NEXT_PUBLIC_SUPABASE_URL | Supabase project URL. Accounts, sync, and share links. |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase publishable key. Same features as the URL. |
MIT © 2026 Josh Lim