BuzzSave
Personal finance platform · Thesis project
Connecting mobile expense capture to dependable finance APIs.
- Java 21
- Spring Boot
- MySQL
- Docker
- AWS
My contribution
- Built Java 21 and Spring Boot REST APIs for expenses, budgets, and portfolios with MySQL.
- Used database transactions, idempotent requests, and stale-data validation for budget updates.
- Implemented on-device receipt OCR and offline expense queues that synchronize after reconnection.
- Deployed APIs on AWS EC2 with RDS and S3, hosted Python classification models on Azure VMs, and created a multi-stage Docker build.
BuzzSaveA recorded expense.
A consistent budget.
The app in front. The engineering behind it.
- Capture & queueOn-device OCR and offline records
- Spring Boot APIsREST synchronization and validation
- MySQLExpense and budget persistence
When a budget request arrives twice
A retry should not create a second plan. A preview should not silently overwrite financial inputs that have changed.
- First apply
- Save the plan, applied result, and request hash in a transaction.
- Identical retry
- Return the saved result for the same recommendation and amounts.
- Inputs changed
- Reject the stale recommendation and require a fresh preview.
Inspect the implementation & test cases
The apply operation locks the user’s budget updates, checks a saved request hash for retries, and revalidates the preview’s financial context before writing.
if (snapshot.getAppliedPlanId() != null) {
if (!requestHash.equals(snapshot.getAppliedRequestHash()))
throw conflict("This recommendation was already applied with different amounts");
return applied(snapshot, recommendation, true);
}
// Later, after loading the current financial context:
if (!json.hash(context).equals(snapshot.getInputHash()))
throw conflict("Financial inputs or the target plan changed; generate a new preview");
Selected excerpt from BudgetPlannerService.apply; surrounding validation omitted for readability.
Integration-test coverage
- Concurrent identical applies return the same plan.
- Changed spending history or target plans produce a conflict.
- Overwrites require confirmation and edited allocations respect constraints.
- Another user cannot access or apply the recommendation.
Cases present in BudgetPlannerApiIntegrationTest.java. This describes test coverage, not a live test run.



