A small collaborative personal finance tracker built with Next.js 14, TypeScript, Tailwind CSS, and PostgreSQL (via Prisma). Made for my own use.
- Google SSO sign-in via NextAuth.js
- Groups - share finances with family or roommates
- Folders - single-level grouping of items with custom icons & colors
- Items - Bills, Incomes, Credit Cards, Checking Accounts
- Recurrence - one-time, N months, or forever
- Pay / Receive - mark items as paid, optionally updating account balances
- Due date tracking - "Due today", "Due tomorrow", "Expired 2 days ago"
- Monthly navigation - clean month selector
| Layer | Tech |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS + Outfit font |
| Database | PostgreSQL via Prisma ORM |
| Auth | NextAuth.js (Google OAuth) |
git clone <this-repo>
cd planifik
npm installcp .env.example .envFill in:
DATABASE_URL- your PostgreSQL connection stringNEXTAUTH_SECRET- generate withopenssl rand -base64 32NEXTAUTH_URL-http://localhost:3000for local devGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET- from Google Cloud Console
# Run migrations
npx prisma migrate deploy
# Or for dev (creates migration if schema changed)
npx prisma db push
# Generate Prisma client
npx prisma generatenpm run devOpen http://localhost:3000.
- Go to Google Cloud Console
- Create a project -> APIs & Services -> Credentials
- Create OAuth 2.0 Client ID (Web application)
- Add Authorized redirect URIs:
http://localhost:3000/api/auth/callback/google(dev)https://yourdomain.com/api/auth/callback/google(prod)
- Copy Client ID and Secret to
.env
npm run dev # Start development server
npm run build # Production build
npm run start # Start production server
npm run db:migrate # Apply pending migrations
npm run db:generate # Regenerate Prisma client
npm run db:studio # Open Prisma Studio (DB GUI)
npm run db:push # Push schema changes (dev only)Make sure to set:
DATABASE_URLpointing to your production Postgres instanceNEXTAUTH_URLpointing to your production domainNEXTAUTH_SECRET(a strong random secret)- Google OAuth credentials with the production redirect URI