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.
Budgets, expenses, pools, and reports for personal and team finance in the Noirly ecosystem.
FinanceTypeScript · JavaScriptGitHub @aneesh-pissayOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Personal and shared finance for the Noirly ecosystem: accounts, budgets, bills and goals for individuals, and shared budget pools with approvals and reimbursements for households and teams. Built for India: lakh and crore numbering, an April–March financial year, GST and UPI.
Ledger records money; it never moves it or connects to a bank. Payments happen in your bank or UPI app, and Ledger records them, reminds you and reports on them.
The in-app Docs at /docs (public, no sign-in needed) explain every feature step by step. What's next is in docs/ROADMAP.md.
Next.js (App Router) and React, TypeScript, MongoDB with Mongoose, Auth.js signing in through Noirly Identity (OpenID Connect), TanStack Query, Tailwind with @noirly-dev/ui, @noirly-dev/realtime-client for live pool balances and approvals, and @noirly-dev/webhooks for outgoing webhooks. Receipts go to Cloudflare R2 (or data/receipts locally). Tests: Vitest and Playwright.
You need Node 20+, pnpm, MongoDB, and Noirly Identity running on port 3000.
Register Ledger with Identity (a real confidential client, not db:seed):
cd ../noirly-identity
npm run client:register -- --client-id=noirly-ledger --name=NoirlyLedger --redirect-uri=http://localhost:3003/api/auth/callback/noirly
Configure. Copy the example and paste the printed client_secret into AUTH_NOIRLY_CLIENT_SECRET:
cp .env.example .env.local
Install. The @noirly-dev/* packages come from GitHub Packages, so GITHUB_TOKEN must be set to a token that can read them (see .npmrc):
pnpm install
Run at http://localhost:3003:
pnpm dev
Realtime (noirly-realtime, port 4001), Noirly Flow, emailed receipts, SMTP and R2 are optional; each feature hides or falls back when its settings are unset.
.env.example lists every setting with a comment. The ones to know:
| Variable | What it does |
|---|---|
MONGODB_URI | The database (same host as Identity, its own database name) |
AUTH_SECRET | Auth.js session secret, 32+ characters |
AUTH_NOIRLY_ISSUER, AUTH_NOIRLY_CLIENT_ID, AUTH_NOIRLY_CLIENT_SECRET | Noirly Identity and Ledger's client there |
LEDGER_SECRET_KEY | Encrypts account numbers, notes and Flow tokens. Falls back to AUTH_SECRET. Set it in production once and never change it: data sealed under one key can't be read with another. Back it up with the database |
CRON_SECRET | 32+ characters; protects the daily job below. Unset, the job answers 404 |
NOIRLY_FLOW_URL | Noirly Flow, for bills as Flow tasks |
INBOUND_EMAIL_DOMAIN, INBOUND_EMAIL_SECRET | Emailed receipts and bills (docs/INBOUND-EMAIL.md) |
SMTP_URL, SMTP_FROM | Email for notifications, reminders and scheduled reports |
R2_* | Receipt storage in Cloudflare R2 |
REALTIME_*, NEXT_PUBLIC_REALTIME_WS_URL | Live updates through noirly-realtime |
Recurring transactions, reminders and everything scheduled run from one endpoint, /api/cron/recurring (GET or POST), authorized with Bearer $CRON_SECRET. On Vercel, vercel.json schedules it daily at 00:30 UTC (06:00 IST), and Vercel sends the secret itself once CRON_SECRET is set in the project's environment variables. Elsewhere, call it once a day from any scheduler. Locally:
pnpm recurring:run
In order, it: fetches exchange rates, posts recurring transactions, sends bill and price-rise reminders, escalates late approvals, sends scheduled reports, runs automations, syncs Flow tasks, retries webhooks, encrypts notes saved before encryption, applies retention, and takes due backups.
pnpm test
Unit tests (Vitest), including the Docs content.
pnpm test:e2e
End-to-end tests (Playwright). They build and start an isolated server on port 3103 against the noirly-ledger-e2e database (wiped first), with test-only sessions and stand-ins for Identity, Flow and email, so they need MongoDB but not Identity. Set E2E_MONGODB_URI to use another database.
pnpm lint
pnpm docs:scan
Compares the code with the in-app Docs and lists what changed or isn't covered (docs/DOCS-SYSTEM.md).
The NoirlyLedger Android app is a separate repository and uses the same API.