Monie
Mobile & Backend Engineer (solo)
Mobile · Since 2025 · In development
Monie is a personal finance app built with React Native and Expo, shipped from one codebase to both iOS and Android. The design constraint that shaped everything: people log expenses standing at a counter, not sitting at a desk. That means the app has to be fast to open, fast to enter, and completely functional without a network.
The problem
Budgeting apps fail because logging an expense is friction at exactly the wrong moment. If it takes more than a few seconds, or needs a connection, people stop doing it, and a budget with gaps is worse than no budget.
Architecture
- Client
- React Native with Expo, one codebase across iOS and Android. Entry flow reduced to amount, category, done, all reachable from the app's cold start.
- State
- Local-first state that reads from device storage, so the interface never waits on the network to render.
- API
- REST endpoints for sync and multi-device reconciliation; the app remains fully usable if they are unreachable.
- Data
- On-device store as the source of truth, with a sync layer that reconciles against the server when a connection returns.
- Auth
- Token-based authentication with secure on-device storage.
Decisions
Offline is the default case, not the error case
Treating the network as optional rather than as a failure to handle changed the architecture: writes go to the device first and sync afterwards. It removes every spinner from the entry path, which is the only path that matters for whether someone keeps using the app.
Sync conflicts are a product decision before they are a technical one
Two devices editing the same budget will diverge. Rather than a generic merge strategy, conflicts resolve per entity type according to what a user would expect, which is only decidable by knowing what the data means.
One codebase, two platforms, no compromise on feel
React Native and Expo were chosen so a solo developer could ship both stores. Where platform conventions genuinely differ (navigation gestures, date pickers, haptics), the app follows the platform rather than forcing a shared abstraction.
Outcomes
- Expense entry fully functional with no network connection
- Single codebase targeting both iOS and Android
- Entry flow reduced to three interactions from cold start
Built with
- React Native
- Expo
- TypeScript
- On-device storage
- Node.js
- REST