A personal expense tracker for Lebanon with dual LBP/USD currency, monthly + yearly reports, charts, editable categories, and optional add-by-WhatsApp.
Multi-user: everyone who signs in gets their own private data, isolated by
Supabase Row Level Security. Sign-in is passwordless magic link or Google.
Amounts are stored in LBP and shown in both currencies using an editable, per-user
conversion rate (default 89,500 LBP = $1).
Full step-by-step instructions live in docs/. The short
version:
- Supabase — create a project, run
supabase-schema.sql. → docs/01 - Auth — enable Google, set redirect URLs. → docs/02
- Config — put
SUPABASE_URL+SUPABASE_ANON_KEYin theCONFIGblock of bothindex.htmlandapp.html. → docs/03 - Deploy —
vercel, then set env vars. → docs/04 - WhatsApp (optional) — wire the Meta webhook. → docs/05
.
├── index.html ← marketing landing + auth (served at /)
├── app.html ← the tracker, gated behind sign-in (served at /app)
├── api/whatsapp.mjs ← Vercel serverless function (WhatsApp webhook)
├── supabase-schema.sql ← run once in the Supabase SQL editor
├── vercel.json ← cleanUrls (serves app.html at /app)
└── docs/ ← setup & usage guides
- Landing page — hero, feature grid, how-it-works, WhatsApp demo, auth modal.
- Auth — magic link + Google, session-gated app, sign-out, per-user data.
- Monthly view — month selector, income/expenses/savings, expense table, per-category doughnut, add-expense modal (LBP/USD toggle), inline rate + income editing, delete.
- Reports view — year selector, per-month table with expandable breakdowns, expenses bar chart with income line overlay.
- Editable categories — add/rename/recolour/delete from Settings; renames cascade to past expenses. → docs/06
- WhatsApp — per-user routing via a one-time link code; messages parse, convert and log to the right account. → docs/05
- Light/dark mode, Nexus design system, responsive.