A warm, friendly personal finance web app for tracking your net worth over time. Built with Next.js, Prisma, Supabase, and NextAuth.
- 🔐 Google OAuth sign-in (no passwords)
- 📊 Net worth dashboard with charts
- 📸 Immutable financial snapshots
- 🗂 Custom asset & liability categories
- 📈 Historical net worth tracking
- 📥 CSV data export
- 📱 Responsive design
| Layer | Choice |
|---|---|
| Frontend | Next.js 14 (App Router) |
| Backend | Next.js API Routes |
| ORM | Prisma |
| Database | PostgreSQL (Supabase) |
| Auth | NextAuth.js (Google OAuth) |
| Charts | Recharts |
| Styling | Tailwind CSS |
| Deployment | Vercel |
- Docker & Docker Compose
- Google OAuth credentials (see below)
git clone <repo-url>
cd networth-tracker
cp .env.example .envEdit .env and fill in:
NEXTAUTH_SECRET=<run: openssl rand -base64 32>
GOOGLE_CLIENT_ID=<your-google-client-id>
GOOGLE_CLIENT_SECRET=<your-google-client-secret>- Go to Google Cloud Console
- Create a new OAuth 2.0 Client ID (Web application)
- Add authorized redirect URI:
http://localhost:3000/api/auth/callback/google - Copy the Client ID and Secret into your
.env
docker compose upThis will:
- Start a PostgreSQL database
- Push the Prisma schema to the database
- Start the Next.js dev server with hot reloading
- Create a project at supabase.com
- Go to Settings → Database and copy the connection string
- Set it as
DATABASE_URLin your environment variables
DATABASE_URL=<your-supabase-url> npx prisma db push- Push to GitHub
- Import the repo in Vercel
- Add all environment variables from
.env.example - Update
NEXTAUTH_URLto your Vercel deployment URL - Add
https://your-app.vercel.app/api/auth/callback/googleto Google OAuth
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
NEXTAUTH_SECRET |
Secret for session signing (openssl rand -base64 32) |
NEXTAUTH_URL |
Your app URL (e.g. http://localhost:3000) |
GOOGLE_CLIENT_ID |
Google OAuth Client ID |
GOOGLE_CLIENT_SECRET |
Google OAuth Client Secret |
# Push schema changes (no migration history)
npm run db:push
# Create a new migration
npm run db:migrate
# Open Prisma Studio
npm run db:studio