Multi-stream income tracker for entrepreneurs, freelancers, and side hustlers. Log every dollar from every source. See where you stand.
Live: multidash.vercel.app
- Streams — Create named income sources (freelance, job, side hustle, investments, anything). Each stream gets its own dashboard with goals, charts, and notes.
- Entries — Log income and expenses per stream. Edit or delete at any time.
- Logs — Full statement view across every stream, grouped by month. Filter by stream, see totals, edit inline.
- Dashboard — Monthly totals, goal rings, income heatmap, recent activity.
- Journal — Daily log with day type, wins, losses, mood, and personal habits checklist.
- Goals — Track progress toward financial targets.
- Reminders — Simple to-do list with optional due dates.
- Auth — Sign up, log in, forgot password, change password. All secure.
| Layer | Tech |
|---|---|
| Framework | Next.js 14 (App Router) |
| Auth + DB | Supabase (Postgres + RLS) |
| Styling | Tailwind CSS + custom design system |
| Charts | Recharts |
| Icons | Lucide React |
| Font | Geist (Vercel) |
| Deploy | Vercel |
src/
├── app/
│ ├── (auth)/ # Login, signup, forgot/reset password
│ ├── (dashboard)/ # All protected app pages
│ │ ├── page.tsx # Main dashboard
│ │ ├── streams/ # Stream list + detail pages
│ │ ├── logs/ # Full entry statement
│ │ ├── journal/ # Daily journal
│ │ ├── goals/ # Goal tracking
│ │ ├── reminders/ # Reminders
│ │ └── settings/ # Account + password
│ ├── (marketing)/ # Public landing page (/home)
│ ├── auth/callback/ # Supabase auth redirect handler
│ └── actions.ts # All server actions
├── components/
│ ├── dashboard/ # GoalRing, HeatMap, PnLChart, ActivityFeed, StreamCard
│ ├── journal/ # DayTypeSelector, RulesChecklist, RemindersSection
│ ├── streams/ # AddEntryModal, AddStreamModal
│ ├── settings/ # ChangePasswordForm, SignOutButton
│ ├── layout/ # Sidebar (desktop), MobileNav (mobile bottom bar)
│ └── ui/ # Button, Card, Input, Modal
├── lib/
│ ├── supabase/ # client.ts + server.ts
│ └── utils.ts
└── types/index.ts # TypeScript types + DayType enum
streams — income sources (user-defined, any color/icon/goal)
entries — individual transactions linked to a stream
journal_entries — daily reflections (day_type, notes, wins, losses, mood)
rules — personal daily habits/rules
rule_checks — per-day habit completion log
reminders — to-do items with optional due dates
stream_notes — free-form markdown notes per stream
All tables use Supabase Row-Level Security — users only ever see their own data.
See SETUP.md for full setup instructions.
Quick version:
cp .env.local.example .env.local
# fill in your Supabase URL, anon key, and site URL
npm install
npm run dev| Flow | Route |
|---|---|
| Sign up | /signup |
| Log in | /login |
| Forgot password | /forgot-password → email link → /update-password |
| Change password | /settings (while logged in) |
| Sign out | Settings page or sidebar |
Custom Tailwind theme in tailwind.config.ts:
brand-primary— #6366f1 (indigo)brand-secondary— #06b6d4 (cyan)income— #10b981 (green)expense— #ef4444 (red)brand-border— #e2e6f8 (subtle purple border)brand-bg— #f0f2ff (light purple background)
Shadows: shadow-card, shadow-card-hover, shadow-modal
NEXT_PUBLIC_SUPABASE_URL= # Your Supabase project URL
NEXT_PUBLIC_SUPABASE_ANON_KEY= # Your Supabase anon/public key
NEXT_PUBLIC_SITE_URL= # Your deployed URL (for password reset emails)