I independently designed, built, and deployed the DigiGold App, handling backend services, React Native Expo mobile app, and infrastructure setup. Below is a detailed breakdown of my tech stack choices with cost and scalability considerations.
Currently, online payment integration is in development. We are in discussions with a payment provider, and approval is pending. Once integrated, all scheme transactions will be seamlessly linked with payment records for full auditability.
The DigiGold app supports structured gold saving schemes, designed to handle metals, business rules, rewards, and financial transactions in a scalable way. Below is the conceptual breakdown:
β Result: A domain-driven design that ensures DigiGold schemes are flexible, auditable, and extensible for new metals, business rules, and reward models. This structure provides a strong foundation for compliance, customer trust, and growth.
I chose Serveress over server-based deployments. For ~1000 MAUs, Serverless pay-per-request model ensures cost efficiency, while traditional servers would incur fixed monthly costs even when idle.
For 1,000 MAUs, each using the app ~10 times/month and triggering 5β10 API calls per session, the monthly traffic is 50kβ100k API calls. Below is the cost breakdown for AWS Lambda and AWS Fargate Serverless.
Configuration | AWS Lambda | AWS Fargate Serverless |
---|---|---|
128 MB / 0.25 vCPU + 0.5 GB |
$0 (covered by free tier) 2,500 GB-s, 100k requests < 400k GB-s + 1M requests free |
$0.068 / month
100k Γ (0.25 vCPU + 0.5 GB Γ 0.2s) |
512 MB / 0.5 vCPU + 1 GB |
$0 (covered by free tier) 10,000 GB-s < 400k GB-s free |
$0.137 / month
100k Γ (0.5 vCPU + 1 GB Γ 0.2s) |
β
At 1,000 MAUs (β€100k API calls/month): Lambda runs entirely free, while Fargate Serverless costs just a few cents.
β
Scaling beyond free tier: Lambda costs grow per request + GB-s, while Fargate Serverless charges per vCPU-second + GB-second (predictable for heavier workloads).
β
Why Lambda here? Zero cost at current scale, automatic scaling, minimal ops overhead.
For database, I compared CockroachDB (serverless, distributed SQL) with Aurora. With 50M free Request Units (RUs) on CockroachDB, small-to-medium scale workloads fit entirely in free tier.
For 1,000 MAUs (~100k API calls/month), each request consumes ~ 2 Request Units (RUs). Thatβs ~ 200k RUs/month, plus ~ 5 GB storage for user & transaction data.
Configuration | CockroachDB Serverless | Aurora Serverless v2 |
---|---|---|
Compute / RUs |
200k RUs < 50M free
$0 (well under free quota) |
Billed in ACUs (~$0.06/ACU-hour) For 0.5β1 ACU baseline = ~ $21β$43/month |
Storage (5 GB) | $0 (10 GB free storage) | ~$0.10/GB = $0.50/month |
Scaling | Auto-scales RUs within quota Generous free tier for early stage |
Auto-scales ACUs in fine-grained steps Better for heavier workloads |
β
At 1,000 MAUs: CockroachDB Serverless runs entirely free (200k RUs βͺ 50M free, 5 GB βͺ 10 GB free).
β
Aurora Serverless v2: Always-on baseline capacity (~0.5β1 ACU) costs ~$20β40/month, even at low traffic.
β
Why CockroachDB here? Zero cost at current scale, built-in HA, and no upfront compute billing. Aurora shines at higher scale with enterprise-grade AWS ecosystem integration.
For the DigiGold app, I implemented AWS Cognito with a Custom SMS Sender to deliver OTPs and MFA codes through an existing business SMS provider, ensuring better deliverability, branding, and cost efficiency.
β Result: Seamless multi-factor authentication with secure, branded SMS delivery, leveraging Cognitoβs security while keeping costs predictable with the existing SMS provider.
For the DigiGold app, I built the backend using NestJS with Fastify as the HTTP adapter, and TypeORM for the data access layer. This combination provided high performance, scalability, and a clean developer experience.
Aspect | NestJS + Fastify | NestJS + Express |
---|---|---|
Performance | π 2x faster request handling Lower latency under concurrent load |
Standard performance Slower under high concurrency |
Resource Usage | Lightweight, better memory efficiency Ideal for serverless/Lambda |
Higher memory footprint More overhead for small instances |
Ecosystem | Compatible with NestJS decorators, DI, and middleware Fully supported |
Mature ecosystem, large community Well-known in industry |
TypeORM Integration | First-class support Works seamlessly with Postgres, CockroachDB, Aurora |
Same ORM support But slightly more overhead per query |
β Result: A backend optimized for serverless performance and low cost, paired with a cross-platform mobile app (iOS + Android) for a seamless DigiGold user experience.
While simple JavaScript functions could directly query the database inside AWS Lambda, I chose TypeORM with NestJS for DigiGold. This decision provided strong consistency, maintainability, and scalability for a financial-grade application.
Aspect | Lambda + TypeORM | Lambda + Plain JS Functions |
---|---|---|
Code Organization | β
Entity-driven models, repositories β Reusable services, clean architecture |
β Ad-hoc SQL strings β Harder to maintain and scale |
Database Portability | β
Works seamlessly with Postgres, CockroachDB, Aurora β Easy migration scripts |
β Vendor lock-in (raw queries) β No migration tooling |
Security & Validation | β
Automatic query sanitization β Strong typing with entities |
β Risk of SQL injection β Manual validation required |
Maintainability | β
Standardized patterns β Onboarding-friendly for teams |
β Logic scattered in functions β Harder to debug complex flows |
Performance in Lambda | β‘ Slightly higher cold start due to ORM init But optimized with connection pooling + Fastify |
β‘ Lower cold start overhead But higher dev/ops cost in the long run |
β Why TypeORM? Even though plain JS functions are lighter, TypeORM ensures long-term scalability, security, and developer productivity β all critical for a financial app like DigiGold, where data integrity and maintainability matter more than a few milliseconds of cold-start latency.
For the DigiGold mobile app, I chose React Native with Expo over plain React Native CLI to accelerate development, streamline deployment, and ensure consistent cross-platform behavior.
Aspect | React Native + Expo | Plain React Native CLI |
---|---|---|
Setup & Development Speed | β
Simplified setup β Pre-configured tooling, OTA updates via Expo β Fast iteration with Expo Go app |
β Manual configuration for iOS/Android β Slower iteration without Expo tools |
Cross-Platform Consistency | β
Single build system for iOS & Android β Handles native dependencies internally |
β Separate native project management required β More risk of platform-specific bugs |
Build & Deployment | β
OTA updates without app store resubmission β EAS Build supports staging & production builds |
β Requires Xcode/Android Studio for every build β OTA updates require custom infrastructure |
Performance & Flexibility | β‘ Slightly larger binary and minor performance overhead for managed workflow β‘ Can eject if full native control is needed |
β‘ Leaner binaries β‘ Full native control by default |
β Why Expo? Chose Expo for faster development, OTA updates, cross-platform consistency, and simplified integration with backend (Cognito + TypeORM) and analytics tools (Firebase). Ejected only when deeper native control was required.
β Result: Full-stack monitoring with real-time alerts, actionable analytics, and automated deployment pipelines for faster iteration and reliable production releases.
To ensure the DigiGold app is reliable and production-ready, I built a strong integration testing suite covering backend services, authentication flows, and database interactions.
Current coverage: 90%+ (Target: 99%+)
β Result: Reliable deployments with confidence in backend correctness, reducing production issues and ensuring financial-grade stability.