Personal and organization-aware finance dashboard for tracking subscription spend, recurring income, and projected net balance.
This project is built as a production-style frontend + backend application, not just a UI demo.
- Multi-tenant data model: supports both personal and organization contexts.
- Secure-by-default backend: Supabase + Row Level Security policies.
- Strong user flow: authentication, protected routes, onboarding/setup checks.
- Business-ready metrics: monthly/annual expense, income, and net projections.
- Modern DX: strict typing, linting, tests, and clean component architecture.
- Create, edit, and remove subscriptions with billing cycles.
- Create, edit, and remove incomes with configurable frequencies.
- Toggle active/inactive entries without losing historical records.
- Monthly and annual projections from recurring data.
- Net monthly and annual balance cards.
- Spend-by-category chart for subscription cost analysis.
- Personal dashboard mode.
- Organization dashboard mode.
- Context-aware filtering for subscriptions and incomes.
- Email/password authentication.
- OAuth sign-in with Google and Discord.
- Password reset flow.
- Protected routes and session persistence.
- 2FA verification support via TOTP utility flow.
React (Vite + TypeScript)
-> UI: Tailwind + shadcn/ui + Radix primitives
-> State/Server Sync: React Context + TanStack Query
-> Auth + Data: Supabase (Postgres + Auth + RLS)
- Context separation:
AuthContext,AppContext, andAppearanceContextisolate concerns. - Type-driven modeling: shared domain types in
src/lib/types.ts. - Database-first app logic: app state is loaded and synced via Supabase tables.
- Safety gate: app displays setup requirements when Supabase env vars are missing.
- Frontend: React 18, TypeScript, Vite
- UI: Tailwind CSS, shadcn/ui, Radix UI, Lucide icons
- Data & Auth: Supabase (
@supabase/supabase-js) - Charts: Recharts
- Validation & Forms: Zod, React Hook Form
- Testing: Vitest, Testing Library, jsdom
- Linting: ESLint 9
- Node.js 18+
- npm
- Supabase project
npm installCreate a .env file in the project root:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
VITE_AUTH_REDIRECT_URL=http://localhost:5173Run supabase-schema-fixed.sql in your Supabase SQL Editor.
If you encounter RLS recursion issues, review DATABASE_README.md for the migration/fix details.
npm run devOpen the app in your browser at the Vite URL shown in terminal.
npm run dev # start local dev server
npm run build # production build
npm run preview # preview production build
npm run lint # run ESLint
npm run lint:fix # auto-fix lint issues
npm run type-check # TypeScript checks (no emit)
npm run test # run Vitest suite once
npm run test:watch # run tests in watch mode- Uses Supabase Auth for identity and session management.
- Uses Postgres Row Level Security to enforce data isolation.
- Distinguishes personal and organization data paths at both UI and DB layers.
- Product thinking: clear user roles, contexts, and financial workflows.
- Engineering quality: modular architecture and typed domain modeling.
- Full-stack integration: frontend behavior driven by real backend policies.
- UX execution: responsive dashboard patterns and actionable visual analytics.
- Member invitation and organization collaboration workflow.
- Budget goals and overspend alerting.
- CSV import/export and data portability.
- Notification/reminder engine for billing and income events.
This repository currently has no explicit open-source license file.