Where it started.
This was the third-semester project for Object Oriented Programming with Java, built with a classmate. It was the first time I'd put a real interface on top of a real database. You sign up, log what comes in and what goes out, and the app shows it back to you as charts and running totals.
The question behind it, where does my money actually go, stuck with me. Two years later it became Tyche, which reads bank SMS so nobody has to type anything.
Sign in, log, look.
Captured by running the app again in November 2026 with a demo account and made-up numbers.
MVC, before I knew to call it that.
Two tables do everything.
A users table holds accounts. A single transactions table holds everything else, with a type column that tells the rows apart: 0 is an expense, 1 is income, and 2 is a monthly savings snapshot, labelled with the month and year. That one table feeds every chart and history list in the app, filtered by the signed-in user.
What two more years taught me.
Passwords were stored and compared as is. Today they'd be salted and hashed with something like bcrypt, and never readable.
Amounts were integers, so paise were lost. Money needs a decimal type or integer paise, decided on purpose.
Almost all the UI logic sat in one controller of nearly 900 lines. One controller per screen would have been easier to change.
Running it again also turned up a bug: the monthly savings snapshot was meant to be written on the last day of each month, but that check is commented out, so every sign-in adds another one.
Tyche sidesteps the first one entirely: it has no accounts, so there's no password to store.