Wallet: Building a Full-Stack Expense Tracker with React Native & Express
Project Overview
After my first React Native project, I wanted to push further past a front-end-only app and into something that felt genuinely production-ready. Wallet is the result: a full-stack mobile expense tracker with real authentication, a cloud-hosted database, rate limiting, and a deployment-ready backend behind it. Why This Project A lot of portfolio apps stop at the UI layer pretty screens backed by mock data or local storage. I wanted to build the whole system: an API that handles real users, a database that persists real transactions, and the kind of infrastructure decisions (auth, rate limiting, cloud deployment) that separate a demo from something you could actually ship. Wallet is built to run on both iOS and Android, on simulator or a real device, with a backend that's ready to go live. What It Does Authentication Email-based auth handled through Clerk Six-digit email verification codes for signup Secure signup and login flows, with logout support Wallet Functionality View current balance at a glance Track income and expenses separately Add new transactions Delete transactions, with the balance recalculating automatically Pull-to-refresh, implemented from scratch rather than pulled from a library Mobile Experience Built with React Native and Expo Navigation handled through React Navigation State managed with custom hooks rather than a heavy external library UI tuned to feel native on both Android and iOS Backend & Cloud An Express.js REST API PostgreSQL via Neon for cloud-hosted, serverless-friendly data storage Redis-based rate limiting (via Upstash) to protect the API from abuse Clerk auth middleware and webhooks securing every relevant route An architecture that's ready to deploy, not just run locally The Tech Stack Frontend (Mobile) React Native Expo React Navigation Clerk (Authentication) Axios TypeScript / JavaScript Backend Node.js Express.js PostgreSQL (Neon) Redis (Upstash) Clerk Webhooks & Auth Middleware Rate Limiting What I Learned This project forced me to think like a backend engineer as much as a mobile developer. Wiring up Clerk's auth middleware and webhooks meant understanding how tokens flow between the client, the API, and a third-party auth provider not just calling a login function and trusting it works. Adding Redis-based rate limiting was my first real exposure to protecting an API against abuse rather than just handling the happy path. On the mobile side, implementing pull-to-refresh from scratch instead of reaching for a pre-built component taught me more about React Native's gesture and scroll handling than any tutorial. And keeping the balance in sync every time a transaction was added or deleted meant being deliberate about where state lived and how it updated, rather than letting the UI drift out of sync with the database. Overall, Wallet felt like the first project where I was building a system, not just a screen and that shift in thinking is something I'll carry into everything I build next. Wallet is a full-stack, production-oriented project authentication, database, rate limiting, and deployment-ready architecture, all wired up end to end.