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.
Track accounts, income, expenses and savings in Indian Rupees.
Translation pending
FinanceTypeScript · CSSGitHub @Arup3105OnlineOwner 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 ↗A personal finance web app for Indian Rupees. Multiple users can register and independently track bank accounts, cash and cards; record income and expenses as they happen; move money between their own accounts; and see balances, savings, trends and reports. All times are shown in the user's time zone (default Asia/Kolkata).
Designed to run entirely on free tiers: Vercel Hobby + MongoDB Atlas Free.
| Area | Choice |
|---|---|
| Framework | Next.js 16 (App Router, Cache Components, Turbopack), React 19, TypeScript (strict) |
| UI | Tailwind CSS v4, shadcn/ui (Radix), Lucide icons, Recharts, Sonner toasts, next-themes |
| Forms & validation | React Hook Form + Zod 4 (the same schemas run on client and server) |
| Backend | Next.js Route Handlers on the Node.js runtime |
| Database | MongoDB Atlas Free tier via the official mongodb driver (v7) |
| Auth | Better Auth (email + password) with @better-auth/mongo-adapter. Free, open source, self-hosted, and passwords are hashed by the library |
| Tests | Vitest (unit tests + integration tests against a real MongoDB test database) |
src/
app/
(auth)/login, register sign-in / sign-up pages
(app)/dashboard … settings authenticated pages (Server Components)
api/… Route Handlers (all mutations, export, auth)
components/
app/ shell, navigation, user menu, quick add
finance/ forms, dialogs, tables, charts, cards
settings/ settings forms
ui/ shadcn/ui primitives
lib/ client-safe code
money.ts paise parsing/formatting (no floats)
dates.ts time-zone aware periods & buckets
finance/ledger.ts THE ledger rules (+ matching Mongo expressions)
validation/schemas.ts Zod schemas shared by client and server
server/ server-only code
db/ Mongo client singleton, collections, indexes
services/ business logic (accounts, transactions, reports, export…)
http.ts authenticated route wrapper, error mapping, CSRF check
session.ts verified-session helpers
proxy.ts optimistic redirect for signed-out visitors
tests/unit, tests/integration
<Suspense> boundary (required by Cache Components); no user data is cached on the server.authedRoute(), which checks the Origin on mutating requests, gets the user from the verified Better Auth session (never from the request body), and turns errors into safe JSON.userId. Referenced accounts and expense types are loaded with { _id, userId }, so another user's IDs read as 404 Not Found.Better Auth manages user, session, account, verification and rateLimit. The app adds:
| Collection | Key fields |
|---|---|
financialAccounts | userId, name, nameKey (unique per user), type, openingBalancePaise, currency, isArchived, version, timestamps |
transactions (unified ledger) | userId, accountId, type (income · expense · transfer_out · transfer_in · adjustment), amountPaise (positive int), name, categoryId, effectiveAt, createdAt, updatedAt, comment, reference, refundedPaise + refunds[], transferGroupId + counterpartyAccountId, adjustmentDirection + adjustmentReason, isCashWithdrawal, idempotencyKey, version |
expenseTypes | userId, name, nameKey (unique per user), isDefault, isArchived, timestamps |
userSettings | _id = userId, currency, timezone, cashWithdrawalMode |
This is the beginning of the README. Read the rest at the original. Read the full README ↗