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.
Personal expense tracker
Translation pending
FinanceTypeScript · CSSGitHub @daniolskOnlineOwner 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 expense tracker: monthly expenses & income, custom categories, monthly plans, and month/year statistics.
Stack: Next.js 16 (App Router, Cache Components) · shadcn/ui · Tailwind v4 · Better Auth (Google) · Drizzle ORM · Neon Postgres · Recharts
npm install.env.example → .env.local and fill it in (see below).npm run db:migrate to create the tables.npm run dev and open http://localhost:3000In Google Cloud Console → Credentials create an OAuth client ID (type Web application):
http://localhost:3000 (+ your production URL)http://localhost:3000/api/auth/callback/google (+ https://<prod-domain>/api/auth/callback/google)Put the client ID/secret in GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET.
Anyone with a Google account can sign up. Every account gets the default categories on first sign-in, and all queries and actions are scoped to the signed-in user.
src/
app/
(app)/m/[month] month view: transactions, income, statistics (YYYY-MM)
(app)/y/[year] year statistics
(app)/settings categories, opening balance, account
api/auth/[...all] Better Auth handler
db/schema.ts Drizzle schema (auth + app tables)
server/
dal.ts requireUser(): the auth check used by every page & action
queries.ts read model (all queries scoped by userId)
actions.ts server actions (Zod-validated, re-authenticated, ownership-checked)
seed.ts default categories for new users
lib/ money (integer grosze), month helpers, category colors
components/ UI (shadcn in components/ui)
proxy.ts optimistic auth redirect to the landing page
type (expense / income).month_plan).src/db/schema.ts, then npm run db:generate and npm run db:migrate.npm run db:studio to browse data.