Technology
The stack and architecture
A React Native client, a NestJS API described by an OpenAPI contract, and a double-entry ledger in PostgreSQL.
Architecture
How the pieces fit
A React Native client, a NestJS API described by an OpenAPI contract, and PostgreSQL behind Prisma.
Tech stack
Built with proven tools
Backend
- NestJS 11
- Prisma
- PostgreSQL
- Double-entry ledger
- Swagger / OpenAPI docs
Mobile
- React Native 0.88 (bare, New Architecture)
- TypeScript
- React Navigation 7
- SQLite + SQLCipher, Drizzle ORM
- Animated UI
Services
- Firebase phone sign-in
- Cloudinary receipt uploads
Contract
- OpenAPI specification shared between backend and app
Practices
How we keep it reliable
One API contract
The backend publishes an OpenAPI specification with Swagger docs, and the mobile app is built against the same contract.
Architecture enforced by tests
The mobile app's layering rules (layer direction, feature boundaries, no circular imports, no financial data in AsyncStorage) are checked by an automated test.
Typed end to end
TypeScript on the NestJS backend and the React Native app, with Prisma generating typed database access.
History is never erased
Corrections post reversing entries instead of editing the past, which keeps a clear audit trail.