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.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
home budget tracker
翻訳待ち
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