Case study · Web + iPhone · My own product
My own. I get paid fortnightly and every budgeting app thought in months. The one number I needed — what’s left after everything committed, before next payday — was never on screen.
Decisions that mattered · 01
- Put the remaining number first. Every screen answers “what’s left?” before anything else. Spending history is secondary.
- Import, don’t connect. No bank-login integration. You export a statement and import it. Slower for the user, but it means Budgeteer never holds banking credentials — and it removed an entire category of security risk and compliance cost.
- Web first, then native. The web app proved the model. The iPhone app was built once the data model had settled — native SwiftUI, sharing the same API, not a wrapped website.
- Free core, paid extras. The budget is free forever. Reports, tax summary and receipt scanning are the subscription. The iPhone app respects App Store guideline 3.1.1: subscribed features show for subscribers, a locked panel for everyone else, no outward purchase link.
Stack
PHP 8 backend, MySQL, a custom ‘Ghost Ledger’ design system (CSS tokens, vanilla JS, no framework) on the web. Swift and SwiftUI for the iPhone and iPad app, targeting iOS 26 with Liquid Glass. PHPUnit for the API. GitHub Actions deploy.
Outcome
Live at thebudgeteer.app. iPhone app submitted to the App Store, September 2026.
Screens · 02




