Problem
Communities of practice were stitching themselves together across WhatsApp groups, Instagram comments and ad-hoc EFT payments — with no shared identity, no buyer protection and no way to host a structured live conversation without bouncing into a third app. Trust was the bottleneck: people would not transact with strangers without an intermediary holding the funds.
Approach
I built Tribaal as a single Expo app on top of an Express + MongoDB backend with Socket.IO for real-time and Agora for live rooms.
- Feed and marketplace in one navigation surface — listings appear inline with social posts so discovery is conversational.
- Wallet + escrow built as a state machine: funds move from buyer wallet → escrow → seller wallet only on confirmed delivery, with explicit dispute and refund transitions. Every state change emits a notification through both Socket.IO (in-app) and Expo push (background).
- Live rooms via React Native Agora with role-based permissions (host, speaker, listener) and Firebase-backed presence.
- Notifications are persisted server-side with read/unread state, so a user opening the app on a new device sees the same inbox.
- Auth is JWT with refresh tokens, plus Google OAuth via Passport for low-friction onboarding.
The codebase is structured around a typed services layer on the client and a controller-per-domain layout on the server, with a dedicated socket namespace per feature (chat, wallet, marketplace) so room-based broadcasting stays scoped.
Outcome
- End-to-end escrow flow with automated state transitions, dispute handling and full audit trail.
- Live audio/video rooms running natively on iOS and Android through Agora.
- Real-time notification system with both in-app and push delivery, persisted across devices.
- A single app that replaced three for its target community: WhatsApp for chat, Instagram for discovery, manual EFT for payments.