Full Stack · 2026
Tosm Finance
A full stack personal finance PWA for tracking multi-wallet balances, categorized transactions, budgets, and an investment portfolio ledger, with real reporting.
Overview
What it is, and why it exists
Tosm Finance (TosmFi) is a money-tracking app I built end to end — React/Vite PWA frontend and its own Express/MongoDB API. It covers everyday budgeting (wallets, categories, transactions) alongside an investment ledger that tracks invested vs. current value per account, plus a dedicated reporting layer so the dashboard stays fast without shipping full transaction history to the client.
My Role
Full stack developer — product architecture, REST API design, database modeling, and dashboard/report UI.
Problem
The problem
Most personal-finance trackers are single-user, store data only in local storage, and treat investments as an afterthought (if they support them at all) — there was no lightweight tool that let a household track shared wallets and an investment portfolio side by side, backed by a real API instead of the browser's local storage.
Solution
The solution
I built TosmFi as a full-stack app with its own backend: wallets, categories, and transactions share one atomic ledger — every mutation adjusts wallet balance and category counts inside the same database transaction as the write itself — while a separate investment-transaction ledger tracks each account's invested and current value independently. New accounts register but stay pending until an admin approves them, and five dedicated report endpoints keep the dashboard and charts fast without ever fetching the full transaction history to compute them client-side.
Key Features
What it does
- Multi-wallet balance tracking with drag-to-reorder and a primary wallet
- Income, expense, transfer, and balance-correction transactions with live filtering and search
- Category-scoped monthly budgets as spending reminders
- Investment ledger tracking invested vs. current value per account, with profit/loss entries
- Dedicated report endpoints — summary, wallet usage, top spending, cash flow, monthly trend — exportable to PDF/Excel
- Admin approval flow for new users, plus an admin-only crash/error log
Tech Stack
Built with
Technology choices made to fit the product's real constraints, not novelty.
System architecture
Challenges
Challenges & solutions
Keeping wallet balances and category counts consistent
Every transaction create/edit/delete has to adjust wallet balance and category/subcategory counts atomically, and an edit or delete must reverse the exact prior effect instead of trusting a client-supplied snapshot. I moved this into Mongoose session transactions that reload the existing document server-side, revert its effect, then apply the new one — so a mutation and its side effects always commit or roll back together.
Tracking investment profit/loss without corrupting history
A withdrawal needed to be capped by an account's current market value (not the smaller contributed principal), so a pure gain stays fully cashable, and undoing an entry that a later transaction already depended on would drive the balance negative. Each ledger row stores its exact signed delta at creation time, and an edit/delete that would corrupt a dependent later entry is rejected outright rather than replaying full history to re-derive it.
Gallery
A closer look
Dashboard overview
Transactions & filters
Reports & analytics
Investment tracking
Result
Outcome
- Ships as an installable PWA with an offline-ready shell, light/dark theme, and 3 languages (Indonesian, English, Japanese)
- Report dashboard (summary, wallet usage, top spending, cash flow, monthly trend) loads from 5 dedicated aggregation endpoints instead of shipping full transaction history to the client
- Every balance-affecting mutation runs inside a database transaction, keeping wallet/category/investment totals consistent even under concurrent edits