← Selected work

Langu / Product · Mobile · Backend

A language-learning app, from the inside out.

Learning through conversation only works if the conversation itself is dependable. Building Langu meant thinking about the experience on the phone and the chain of services behind every message.

Founder & engineerTypeScript · NestJS · React Native · PostgreSQL · RabbitMQ

The idea in practice

A message should survive a bad connection.

  1. 01Write a message
  2. 02Save on device
  3. 03Translate & persist
  4. 04Deliver & acknowledge

A simplified view of the workflow.

01

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.

02

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.

03

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.

04

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.

Next projectThoughtful AI