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.
Manage shared household expenses
Translation pending
FinanceTypeScript · PLpgSQLGitHub @AyoubBenlaidiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
home budget tracker
Translation pending
Loading the full README.
Read the full README ↗Production-grade web application for managing shared household expenses.
# Install dependencies
npm install
# Create .env.local
cp .env.example .env.local
# Configure your environment variables
# - DATABASE_URL: PostgreSQL connection string
# - NEXT_PUBLIC_SUPABASE_URL: Your Supabase URL
# - NEXT_PUBLIC_SUPABASE_ANON_KEY: Your Supabase anon key
# - SUPABASE_SERVICE_ROLE_KEY: Your Supabase service role key
# Generate initial migration from schema
npm run db:generate
# Apply migrations
npm run db:migrate
# Optional: Open Drizzle Studio to inspect the database
npm run db:studio
# Start development server
npm run dev
Open http://localhost:3000 to see the application.
src/
├── app/ # Next.js pages and layouts
│ ├── (auth)/ # Authentication routes
│ ├── (dashboard)/ # Protected routes
│ └── page.tsx # Home page
├── components/ # Reusable UI components
│ ├── forms/ # Form components
│ ├── layout/ # Layout components
│ └── ui/ # Basic UI components
├── modules/ # Business logic (services)
│ ├── households/ # Household management
│ ├── expenses/ # Expense and balance logic
│ └── ...
├── actions/ # Server Actions (mutations)
│ ├── households/ # Household actions
│ └── expenses/ # Expense actions
├── db/ # Database layer
│ ├── schema/ # Drizzle ORM schema
│ ├── queries/ # Database queries
│ └── migrations/ # Generated migrations
├── lib/ # Utilities and helpers
│ ├── db.ts # Database client
│ ├── supabase/ # Supabase client
│ └── utils/ # Helper functions
└── types/ # TypeScript types
The application strictly follows the HBT Data Model (HBT-MDD.md):
Core Tables:
users: Application usershouseholds: Shared expense groupshousehold_members: User-household relationshipsexpenses: Financial eventsexpense_payers: Who paidexpense_splits: Who owesKey Principle:
balance = total_paid - total_owed
For every expense: SUM(payers) = SUM(splits)
const householdId = await createHousehold("My House", userId);
const expenseId = await createExpense(
householdId,
userId,
"Groceries",
"50.00",
"2024-01-15",
[payerMemberId],
[member1Id, member2Id], // participants
);
const transferId = await createTransfer(
householdId,
userId,
fromMemberId,
toMemberId,
"20.00",
"2024-01-16",
"Reimbursement for coffee"
);
const balance = await calculateHouseholdBalance(householdId);
// Returns: { memberBalances: [...], totalExpenses: "..." }
any typesdeleted_at fieldnpm run dev
# Navigate to http://localhost:3000/auth/login to test auth flow
npm run build
npm run start
Deploy to Vercel:
vercel deploy
Environment variables must be configured in Vercel dashboard.
MIT