G-Finance
The personal finance app I use every day
The problem
Spreadsheets didn’t answer my everyday questions: how much is already on the credit card bill, how much will be left at the end of the month, and how my balance will evolve over the next years. I also wanted to log an expense in seconds, wherever I was.
What I built
Transactions, categories and accounts, with a dashboard and monthly and yearly reports. Credit card with a provisional statement, updated on every purchase and closed automatically on the 1st. Envelope-style food budget, kept apart from the monthly totals. Balance forecasts from 1 to 40 years with configurable inflation, salary raises and yield, plus “what if” simulation. Comparison with the previous month, proportional to the day of the month. Installable iPhone app (PWA) with push notifications: card statement, food budget and weekly summary. Expenses via Telegram: a bot receives short messages and records the transaction.
Architecture
- Angular PWASignals, light/dark theme, service worker
- TraefikHTTPS (Let’s Encrypt)
- Spring Boot APIJWT, business rules, schedulers
- PostgreSQL 16Flyway, SQL with MyBatis
The Telegram bot arrives through a webhook and uses the same service layer as the web app. Notifications go out via Web Push.
Technical decisions
MyBatis with explicit SQL instead of JPA
Reports and aggregations stay readable and easy to tune with indexes. All SQL is parameterized.
Financial math in one place
Amounts in BigDecimal and NUMERIC(14,2), with HALF_EVEN rounding centralized in a tested FinancialCalculator.
Channel-independent service
The web app and the Telegram bot send the same transaction command, so the rules are written only once.
Short sessions, safe renewal
30-minute JWTs with a rotating refresh token in a 60-day HttpOnly cookie.
PWA instead of an app store app
Instant install on the iPhone, push notifications and a single codebase.
Technologies
Outcome
I use G-Finance every day to manage my household finances. Every push to the main branch is tested and deployed automatically, with a Telegram notification.