Subhaprasad.com – FIFA World Cup UpdatesAll match times shown in IST (UTC+5:30)
All case studies

Mobile Application

Cross-Platform Personal Finance Mobile App

A secure React Native finance app unifying transaction insights, budgets, savings goals, and offline-friendly account access securely across iOS and Android.

Three personal finance mobile app screens showing spending, savings goals, budgets, and biometric sign-in

Project overview

This mobile application helped customers understand everyday spending, set category budgets, and work toward savings goals without opening several banking products. I led the cross-platform implementation in React Native, collaborating on product flows, API contracts, security, offline behavior, analytics, and store-readiness for iOS and Android.

The design emphasized calm, useful feedback. It avoided turning every expense into an alarm and instead showed changes, trends, and achievable next actions.

Problem statement

Early research found that customers could view transactions in existing bank apps but struggled to answer broader questions: How much is safe to spend? Which categories changed? Am I on track for a goal? Connectivity was inconsistent for commuters, and a finance app that appeared empty offline immediately lost trust.

The app needed fast startup, secure local storage, reliable synchronization, accessible charts, and notification controls that were helpful without exposing financial details on a lock screen.

Mobile and backend solution

React Native and Expo provided a shared TypeScript codebase with platform-specific components where interaction conventions differed. Navigation loaded the account overview quickly from an encrypted local cache, then refreshed data in the background. Sensitive tokens were stored in the operating system keychain rather than general application storage.

Node.js APIs normalized transaction data and calculated budget and goal progress. MongoDB stored user rules, category corrections, goals, and synchronization cursors; Redis cached short-lived summaries. The sync protocol requested changes after the last confirmed cursor and applied mutations idempotently:

const changes = await api.sync({ after: cursor });
await database.transaction(async () => {
  await upsertTransactions(changes.transactions);
  await saveCursor(changes.nextCursor);
});

Optimistic updates made category corrections and budget changes feel immediate. A conflict rule favored server-confirmed financial records but retained the user's latest classification. Biometric authentication unlocked an existing secure session; it never replaced server-side authorization.

Experience and security details

  • Spending overview with monthly comparison and accessible category summaries.
  • Searchable transaction history with editable categories and merchant rules.
  • Budget progress, overspend context, and adjustable rollover behavior.
  • Savings goals with target dates and realistic contribution suggestions.
  • Offline read access and queued non-financial preference changes.
  • Notification previews that hid amounts unless the customer opted in.
  • Screen-reader labels, dynamic type, large touch targets, and reduced motion.

Analytics intentionally avoided raw transaction descriptions and amounts. Events described feature use and sync health, while crash reports redacted request payloads. Device registration and remote session revocation protected lost-device scenarios.

Outcomes

Pilot users rated the experience 4.7 out of 5, and weekly active engagement increased by 36% compared with the previous mobile web flow. Production monitoring recorded 99.7% crash-free sessions during the measured period. Cached startup made the overview usable in under 1.2 seconds on representative mid-range devices, and cursor-based sync reduced transferred transaction data by 63%.

Qualitative feedback also improved: users described goals and budgets as understandable rather than judgmental. The shared codebase enabled coordinated releases while retaining native authentication, notification, and accessibility behavior.

Key engineering decisions

Financial source records were read-only in the mobile database. User categories and notes were stored as overlays, which prevented an interface edit from altering the imported transaction. Amounts used integer minor units plus an explicit currency, and charts never combined currencies without a selected conversion context. Budget calculations ran on the server for consistency but kept the latest confirmed summary locally for offline viewing.

The team resisted adding bank credentials directly to the app. Account connections used provider-hosted authorization, short-lived access tokens, and server-side refresh handling. Screenshots were blocked on the most sensitive Android views, and the app switcher used a privacy cover on both platforms. Feature flags separated store release from backend activation, allowing staged rollout and rapid disablement without forcing an emergency binary review. These decisions reduced novelty but improved customer trust and operational control.

Related engineering work

For the authentication and least-privilege approach, see the secure coding guide. The API and product architecture relate to the future of full-stack development, while the delivery process follows DevOps automation tools for modern delivery.