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.
Dulypaid keeps a creator's brand deals, GST invoices, payments, TDS and tax deadlines in one ledger, and reminds you before anything slips.
FinanceTypeScript · PythonGitHub @Karanjoshi128OnlineOwner 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 ↗The business back-office for Indian creators and their managers. It covers brand deals, the real money math (agency fee, TDS, GST), GST invoices, payments, TDS reconciliation, tax deadlines, reminders, affiliate links and a public media kit.
| App | Next.js 16 (App Router, Server Components, Server Actions), React 19, TypeScript strict |
| UI | Tailwind v4, shadcn on Base UI (render prop, not asChild), framer-motion, lucide, sonner, cmdk |
| Data | Postgres on Supabase, Prisma 6, tables in the private app schema |
| Auth | Supabase Auth: email one-time code (+ optional Google). src/proxy.ts refreshes the session |
Resend REST API (src/lib/server/email.ts) | |
@react-pdf/renderer with bundled Noto Sans (has the ₹ glyph) in src/assets/fonts | |
| Files | Backblaze B2 (any S3-compatible store) or Supabase Storage; private bucket, signed URLs (src/lib/server/storage.ts) |
| Jobs | Vercel Cron → /api/cron/daily (reminders + digests + keep-alive) |
| Billing | Razorpay Subscriptions + signed webhook |
| AI | AI SDK 7 + Vercel AI Gateway, structured output (brief import) |
src/lib/ Pure domain logic (unit-tested, no I/O)
finance.ts Deal breakdown: agency fee → TDS → net; GST split; TDS presets
status.ts Invoice/deal payment status
reminders.ts The reminders engine: snapshot in, keyed reminders out
tax-calendar.ts GSTR-1/3B (monthly + QRMP), PMT-06, advance tax, ITR, TDS visibility
money.ts dates.ts Paise and IST calendar-day helpers, Indian number formatting, FY
gst.ts msme.ts State codes, GSTIN checksum, supply type; MSMED s.16 interest
src/lib/server/ Server-only: Prisma queries, notifications sync, invoices, PDF, email, billing
src/app/(app)/ The signed-in app (one folder per section, each with its actions.ts)
src/app/c/[handle] Public media kit + inquiry form
src/app/l/[slug] Tracked short-link redirect
src/app/api/ Cron, PDFs, exports, files, billing webhook
prisma/schema.prisma Data model; prisma/seed.ts builds a demo workspace
Int). Percentages are basis points. Inputs are capped at ₹2 crore.@db.Date, handled as "YYYY-MM-DD" strings, and "today" is computed in Asia/Kolkata
(todayISO()). Never use new Date() for a due date.workspaceId. Server Actions go through runAction(capability, fn), which
resolves the member and checks the role. Expected failures throw UserError and come back as readable
ActionResults.InvoiceCounter (gapless per FY).
Issued invoices are immutable: cancel, don't edit.syncNotifications() upserts by stable key and resolves what
no longer applies. It runs daily and lazily on page load.pnpm install
cp .env.example .env.local # or use the provided .env.local
pnpm db:push
pnpm dev
Without Supabase keys, pnpm dev shows a dev-only sign-in that accepts any email. It is disabled in production builds.
Checks: pnpm check runs the typecheck, ESLint and unit tests (Vitest). The business rules live in
src/lib/__tests__, including the reel's ₹1 lakh → ₹72,000 / ₹86,400 example.
UI audits: scripts/qa/ holds Playwright audits that load every screen in light and dark at five widths,
open every dialog and menu, and submit every form empty. They check layout, focus, contrast (axe-core) and
that nothing is written. See scripts/qa/README.md; run them after any UI change.