The problem
Mobile connections disappear. Apps restart. Queue deliveries repeat. A chat interface can look responsive while quietly losing a message or displaying the same event twice. The product needed a consistent experience across those failures.
What I built
I built a React Native client with a persistent SQLite event queue, retry behavior, and content-aware deduplication. On the backend, a staged RabbitMQ pipeline coordinates translation, persistence, and distribution. A PostgreSQL transactional outbox keeps message storage and downstream publishing connected.
A decision that mattered
Sending a message and receiving its acknowledgment are different events. The client keeps a sent message pending until the server confirms it. After a reconnection, outstanding work can resume instead of disappearing with the previous session.
The wider product
The backend also includes a shared billing model for Stripe, Apple, and Google Play. Provider events converge on one idempotent path. If the entitlement cache is unavailable, the system falls back to the database so a cache failure does not silently remove a paying user’s access.
Owning the whole product means a backend decision eventually becomes someone’s experience. I care about making that connection explicit.