Cross-platform language-learning app
Lessons, real-time chat, voice and video calls, push notifications and subscriptions in one React Native app, backed by a Node.js API on PostgreSQL, Redis and AWS that I designed and built end to end.
- Type
- Mobile app and backend, iOS and Android
- Where
- Freelance, remote
- When
- Sep 2025 – Present
- Technologies
- React Native, TypeScript, Reanimated 4, Zustand, Node.js, Express, PostgreSQL, Redis, Socket.IO, LiveKit, BullMQ, AWS S3, AWS SES, Firebase, RevenueCat
- interface performance target
- 60 FPS
- platforms from one codebase
- 2
Overview
The product mixes self-paced lessons with live conversation. Chat and calls have to behave like native phone features on both platforms, long chat and lesson histories must scroll smoothly on mid-range devices, and the backend has to scale out without a rewrite.
What I built
- React Native New Architecture with TypeScript, i18next localization and a custom scanner that keeps translation keys in sync across every locale.
- Socket.IO for chat and LiveKit (WebRTC) for calls, wired into iOS CallKit, Android ConnectionService and VoIP push so calls ring even when the app is closed.
- Reanimated 4 worklets, gesture-driven bottom sheets and virtualized lists (FlashList, Legend List) to hold a 60 FPS target; HTML5 Canvas for interactive exercises.
- Express + PostgreSQL API with hand-written SQL and a custom CLI for migrations, rollbacks and seeding; Socket.IO Redis adapter and emitter for horizontal scaling; BullMQ and node-cron for background work.
- Presigned multipart uploads to AWS S3, transactional email through AWS SES and Resend, RevenueCat subscriptions, AdMob, FCM with Notifee, Analytics and Crashlytics.
- Security and observability built in: JWT, bcrypt, Joi validation, Helmet, distributed rate limiting, profanity filtering, Prometheus metrics and Pino structured logs.
Results
- One TypeScript codebase ships to iOS and Android, with automated development and production builds (APK, AAB and iOS).
- Incoming calls reach users through the system call screen even when the app is not running.
- Real-time traffic scales across instances, and heavy jobs run off the request path.
- Large media files upload straight to storage instead of passing through the API.