Work that shipped and scaled.
Four deep-dives into systems I architected from scratch — with the real constraints, tradeoffs, and lessons learned along the way.
EPOS Retail Platform
Enterprise-scale offline-first EPOS platform supporting 500+ retailers with a custom SQLite sync engine, Adyen payment integration, Kitchen Display System, and native hardware modules — achieving 99.9% system reliability.
The Story
Beginning — The stakes
A global retail client needed a point-of-sale system that could run in brick-and-mortar stores with unreliable internet. Any downtime meant lost sales and frustrated staff. The stakes: 500+ live retail locations depending on a single mobile app to process every transaction.
Middle — The constraints
React Native's SQLite ecosystem wasn't ready for the scale we needed out of the box. We needed offline queueing, conflict resolution, and atomic transaction handling — all while maintaining a UI that felt instantly responsive regardless of connectivity state.
Climax — The tradeoff
The key tradeoff: build a custom sync engine on WatermelonDB vs. use a third-party sync service. I chose custom — because the sync logic needed to understand our business rules (partial order completion, split payments) in ways no generic service could. Six weeks of architecture. Worth every day.
End — The outcome
99.9% system reliability in production. Transaction success rate improved 60% in low-connectivity environments. Adyen and Stripe integrations reduced payment processing time by 30%. Custom Kotlin/Swift native modules for terminal hardware improved efficiency by 40%.
Takeaway — The lesson
Offline-first is a UX philosophy, not just a technical feature. Every state transition needs to work without assuming connectivity. The user should never feel the network.
Interactive Demo
→ Embed from appetize.io
Arcade Live — IoT Gaming
Cross-platform gaming platform enabling real-time remote control of physical arcade machines via video streaming, IoT device management, and in-app purchases — driving 20% revenue growth.
The Story
Beginning — The stakes
A gaming startup wanted to let users play real, physical arcade machines remotely — via smartphone. The stakes were unusual: a control input with 200ms latency feels broken. The entire product's value rests on sub-100ms responsiveness.
Middle — The constraints
IoT device management at scale is a distributed systems problem wearing a mobile app costume. We needed real-time video streaming, bidirectional control signals, IAP revenue flows, and a UI elegant enough that grandma could figure it out.
Climax — The tradeoff
WebSocket vs. WebRTC for the control channel. WebSockets were simpler, but WebRTC's peer-to-peer reduced server load and latency. The tradeoff was implementation complexity — but with 25K users, the server cost delta justified it.
End — The outcome
25,000+ active users on launch. Platform revenue up 20% from IAP. Control latency consistently under 100ms. The app runs on iOS, Android, and web via React Native Web — a single codebase serving three surfaces.
Takeaway — The lesson
In real-time systems, latency is UX. Every millisecond you shave is a user who doesn't get frustrated and quit. Architect for the latency budget before you write the first component.
Interactive Demo
→ Embed from snack.expo.dev
Secret World Travel Guide
Subscription-based travel guide with Mapbox navigation, Stripe and IAP dual-payment rails, and Redux Toolkit state architecture — serving 10,000+ active users with 15% faster load times post-optimization.
The Story
Beginning — The stakes
A travel startup needed a subscription app to compete with established players in the travel guide space. The key differentiator: curated, local-expert content behind a paywall, with offline map access. The stakes: churn is brutal in subscription apps. Every slow screen is a cancellation.
Middle — The constraints
Managing subscription state across Stripe (web purchases) and Apple/Google IAP (mobile purchases) — with different refund policies, different entitlement timing, and different webhook behaviors — is a hidden complexity that trips up most implementations.
Climax — The tradeoff
We needed a unified subscription state machine that treated Stripe and IAP as two different input channels to the same entitlement logic. The architecture: a backend entitlement service that both SDKs wrote to, and the app read from. One source of truth.
End — The outcome
10,000+ active users. 15% load time improvement through Redux Toolkit normalization. Zero subscription state bugs in 8 months of production. Mapbox offline caching worked seamlessly even in remote hiking areas.
Takeaway — The lesson
Payments are where complexity hides. Design your entitlement model before your payment integration. The payment provider is an input; entitlement is the business logic. Keep them separate.
Interactive Demo
Remote Examination Platform
Secure remote exam platform with real-time face detection, screen capture, and audio proctoring — covering 2,000+ students and reducing administrative workload by 30% through automation.
The Story
Beginning — The stakes
An education institution needed a lockdown exam system that could run on varied hardware (student's own laptops), with real-time proctoring, secure question distribution, and zero-cheat guarantees. The stakes: academic integrity for 2,000+ students.
Middle — The constraints
Running a React Native app on desktop via Electron, while preventing screen capture, recording audio, and running ML-based face detection — all without freezing the exam UI — required careful threading and platform-specific native bridging.
Climax — The tradeoff
Face detection on-device vs. server-side. On-device protected privacy and worked offline, but added CPU load to student machines. We chose on-device with adaptive quality settings — reducing CPU impact by 40% when an exam was in progress.
End — The outcome
2,000+ students examined without incident. 30% reduction in administrative workload via automated scheduling. The platform became a template for 3 subsequent client deployments.
Takeaway — The lesson
Security engineering is UX engineering. Every security feature is a constraint on the user experience. The goal is to make the constraint invisible — not absent.