A full-stack personal finance tracker built for Singapore.
WealthWise is a personal finance web application designed specifically for Singapore users. It lets you track income and expenses across multiple bank accounts — DBS, OCBC, cash, credit cards — monitor your stock and ETF portfolio with live prices from both SGX and US markets, and watch your net worth grow over time. Everything is denominated in SGD.
The app is split into three main sections: a Dashboard with a live net worth figure and trend chart, a Money Flow view for transactions and per-account P&L, and a Portfolio section with live ticker prices, unrealised P&L, and a 6-month performance chart.
The frontend is a React 18 + Vite single-page app styled with TailwindCSS and charted with Recharts. State is managed with Zustand — separate stores for auth, transactions/accounts, and investments.
The backend is an Express 4 REST API running on Node.js 22, deployed to Render. It handles all business logic, Finnhub stock price fetching (with a 120ms gap between tickers to respect rate limits), and Firestore writes via the Firebase Admin SDK.
The frontend is deployed to Vercel. All API calls inject a Firebase ID token via Axios interceptors so the backend can verify the caller server-side before touching any data.
The trickiest part was the auto-snapshot system — on the user's
first dashboard visit each month, the app silently records the
previous month's portfolio value so the net worth history chart
fills in automatically without any manual input. Getting this to
fire exactly once per month without race conditions or duplicate
writes took careful Firestore document ID design using
YYYY-MM keys.
Handling SGX vs US market currency differences was also non-trivial — US prices come back in USD while SGX prices are in SGD, so the app needed to handle mixed-currency holdings in a single portfolio view denominated in SGD.