Case Study
5 mins

Agora + Expo: Shipping a GDPR-Compliant Real-Time Therapy Platform to iOS and Android

Delivered a GDPR-compliant mobile therapy product with real-time video, live transcription, socket-driven EMDR sessions, and App Store/Play Store release fixes that strengthened my understanding of mobile delivery constraints.

Core Role

Full-Stack / Release Engineer

Tech Stack

Expo, React Native, Agora, Socket.IO, AWS S3, GDPR, iOS, Android

Screens from a therapy platform built with Expo and React Native: Agora carries real-time video between therapist and patient while a transcription agent joins the call, streams multilingual speech-to-text to the dashboard, and stores transcripts in AWS S3; a Socket.IO channel synchronises EMDR session state — direction, speed, colour, audio — between the therapist dashboard and the patient app.
media_gallery // interactive_walkthrough

Visual Walkthrough

Selected production views and user interface states from Agora + Expo: Shipping a GDPR-Compliant Real-Time Therapy Platform to iOS and Android.

FRAME:01/08
[RENDER_MODE: RAW_IMAGE_SCALE]
Agora + Expo: Shipping a GDPR-Compliant Real-Time Therapy Platform to iOS and Android view 1

CareAi is a GDPR-compliant mobile therapy platform for European users, pairing real-time video with live multilingual transcription, socket-driven EMDR sessions, and AI-assisted summaries in one secure app.

CareAi connects therapists with patients through video consultations, chat, AI-assisted analysis, and interactive EMDR in one mobile experience. Because it was built for European users, performance, privacy, and GDPR compliance were part of the core engineering work from day one — not a layer added at the end.

2 stores
Shipped to App Store and Play Store after clearing the iOS AgoraRTC build blocker
EN + FR
Live multilingual speech-to-text streamed into the therapist dashboard during sessions
GDPR
Encrypted at rest and in transit, with patient identifiers replaced by aliases

How a session runs in real time

Two channels carry a live session: Agora for media and transcription, and Socket.IO for the therapist-controlled EMDR state. They run side by side inside the same call.

Two channels, one session — sockets for EMDR state, Agora for media.
1Sockets

Real-time EMDR from the therapist dashboard

EMDR — Eye Movement Desensitization and Reprocessing — guides patients through specific visual and auditory patterns to help process trauma, and it had to be fully interactive from the therapist side.

The app already relied on socket-based communication for real-time features, so EMDR leveraged that. On the therapist's web dashboard, a slider or buttons control the animation — dot direction, color, speed, sound, and background. Each change is sent as a JSON payload over the socket. The patient, connected in the same video session, receives it instantly and updates the EMDR state in real time — showing, hiding, or changing patterns mid-session as if therapist and patient were in the same room.

The video consultation screen — the session both parties see.
2Media + STT

Live video and multilingual transcription

Video was the backbone of the app, and the requirement was not just stable streaming but speech-to-text transcripts for English and French. I built an Agora agent that joins the call, captures live audio, and sends the transcription to S3 for storage and real-time display. After some trial and error it ran smoothly, giving therapists live transcripts they could reference mid-session.

Chat sits alongside the live session so context is never lost.
3AI assist

Summaries built from real session context

I built an AI assistant that uses previous session context and the live transcription from the call. It summarizes key points, highlights potential concerns, and makes sessions easier to review later. The goal was never to replace therapist judgment — it was to cut manual note-taking and keep important context from getting lost.

Engineering decision
Chose

Agora for video plus STT

Over

Building the real-time media layer from scratch

Why: Agora provided reliable video infrastructure and speech-to-text support out of the box, so the work could focus on the transcription agent and session logic instead of media plumbing.

GDPR and data security

CareAi was built primarily for European users, so handling sensitive medical data was non-negotiable. Data is encrypted at rest and in transit. Patient identifiers are replaced with aliases, so even if internal records were exposed, direct patient identity would not be leaked.

GDPR shaped how every feature was designed — from chat to transcription storage. It slowed the early work down, but it was the right call for a medical product.

The iOS build blocker

Everything worked in simulators, but the App Store build exposed a different problem: AgoraRTC bitcode errors on iOS.

The common forum fixes for stripping bitcode did not work in our Expo setup. Debugging on an M1 Mac, I found the reason: the script was modifying the local ios/ folder, which Expo regenerates and ignores during the real build. Moving the fix into a post-build Expo script — run after pod install — stripped bitcode from the AgoraRTC framework automatically, and the build went through.

Engineering decision
Chose

A post-build Expo script that strips AgoraRTC bitcode after pod install

Over

Patching the local ios/ folder, which Expo regenerates and ignores

Why: Expo owns the native project generation, so any manual edit to ios/ is discarded at build time — the fix has to run inside Expo's own build lifecycle to survive.

Release engineering issues like this tend to hide between tools, generated folders, and build-time assumptions. Getting them stable is what turned CareAi from a working prototype into something ready for client testing — much of the real delivery risk sat outside feature code, spread across real-time media, sockets, privacy controls, cloud storage, and App Store build behavior.

What I'd watch in production

The app shipped for client testing, so these are not measured results — they are the first signals I'd instrument if I owned this longer-term:

  • Agora call quality — call-drop and reconnect rates, since a dropped call interrupts an active therapy session.
  • Transcription latency and accuracy per language — English vs. French, since the transcript feeds both the therapist view and the AI summaries.
  • EMDR socket desync — whether the patient's EMDR state ever drifts from what the therapist dashboard sent, and how fast it recovers.
  • S3 encryption and access auditing — who and what touches stored transcripts, given the medical data involved.
  • GDPR data lifecycle — retention windows and right-to-erasure requests handled cleanly across transcripts, chat, and session records.

Key results

  • Real-time EMDR fully controlled from the therapist dashboard over sockets
  • Multilingual (EN/FR) live transcription integrated via Agora STT
  • AI assistant for session summaries built from real session context
  • GDPR-compliant handling of sensitive medical data — encrypted, aliased identifiers
  • iOS AgoraRTC bitcode blocker resolved with a post-build Expo script
  • Deployed to both the App Store and Play Store for client testing