Personal finance dashboard
Atlas is a personal finance dashboard I built to replace the 4+ years of Google Sheet I was tracking my finances in. It tracks four kinds of asset
Access is invite-only: a whitelist gates both sign-up and every subsequent login.
A single Next.js deployment on Vercel, where server actions replace the REST layer entirely and everything lives in one Postgres database.
I add old transactions months after the fact, and the balance chart still has to be correct.
Each account gets a day-by-day running total, and the whole curve is then shifted so it passes through the balance I know the account started at. Shifting instead of cutting off at that date is what makes late entries safe: a transaction dated before it was already inside the starting balance, so it gets subtracted back out rather than counted twice.
Moving money between my own accounts changes two balances, but every query assumes a row belongs to one.
A transfer is two rows sharing a group id, with the outgoing leg stored as a negative amount. Balance queries can then treat it exactly like income and the negative leg subtracts itself, so there is no special case anywhere. The two legs carry their own amounts rather than mirrored ones, so a wire fee or a conversion still leaves both accounts at their real balance.
Pasting an image URL asks my server to go fetch it, and my server can reach things the internet can't.
The address is checked after it resolves, not just the hostname, and anything internal — private ranges, loopback, cloud metadata — is refused before the request leaves. Redirects are followed one hop at a time and re-checked each time, since an allowed host can still point somewhere private.
Replaced a hand-maintained Google Sheet with a standalone product.
Google Sheets Atlas Months as columns, a Cashflow tab of Type→Category rows, dates split across Month/Day columns with the year implicit, and no year-over-year view.
One single place to track all personal (and business) finances, where balances, net worth, cashflow and portfolio value are all derived at read time.