Back to projects
Case Study

Celiapp

A mobile app helping the celiac community safely navigate food. Built and shipped to iOS and Android from the ground up.

Role

Lead Front-end Developer

Timeline

Jun 2023 – Present

Platforms

iOS & Android

Celiapp app screenshot

The Problem

For people with celiac disease, reading ingredient labels is a daily necessity that becomes stressful. Gluten hides under dozens of ingredient names, manufacturing processes change, ingredients that constantly change. Information is fragmented, inaccurate and difficult to find and celiacs are tired of putting their health at risk.

Celiapp was built as a fast, reliable, community-driven tool that gives people with celiac disease confidence when choosing what to eat.

My Role

As cofounder, I was the sole front-end engineer and owned the entire client-side architecture. I also contributed to the back-end, including Firebase auth, analytics, and firestore database.

There was no existing codebase to inherit. Every architectural decision was mine to make and own: navigation structure, state management, context, the auth system design, the deployment pipeline etc.

Architecture

I chose Expo with Expo Router for file-based navigation, which gave us a clean, maintainable route structure that scaled as the feature set grew. TypeScript throughout kept the codebase safe across a complex data model involving users, products, ingredients, reviews, and dietary profiles.

Firebase handled auth, the product database (Firestore), image storage, analytics, and server-side logic via Cloud Functions. This kept infrastructure overhead low while giving us real-time capabilities where needed.

For performance, I implemented a write-through caching layer using AsyncStorage for frequently accessed data, combined with optimistic UI updates so the app feels instant even on slow connections. Pagination was applied to all list views to keep Firestore reads and render times in check.

Features I Built

Visual Product Scanner

Built using expo-camera, the scanner reads barcodes in real time, looks up the product in our database, and immediately surfaces a gluten-safe verdict with a full ingredient breakdown. I optimised the camera lifecycle carefully by handling permissions, background/ foreground transitions, and torch state. This was done to avoid common crashes and battery drain issues on both platforms.

Product Search with Filtering & Sorting

Designed and built a multi-criteria search experience backed by Firestore composite queries. Users can filter by category, dietary tags, and safety rating, and sort by relevance, rating, or recency. I implemented debounced search input with paginated results and skeleton loading states to keep the experience smooth regardless of result set size.

Multi-provider Authentication

I unified five distinct auth flows by implementing Google Sign-In, Apple Sign-In, OAuth, email/password, and guest. The trickiest part was guest-to-registered account migration: preserving a guest user's saved products, reviews, and preferences when they later signed up, without data loss or duplicate accounts.

Apple Sign-In required its own handling due to the one-time email reveal behaviour. I stored the display name on first sign-in since Apple doesn't return it on subsequent logins.

Personalised Onboarding

Built an adaptive onboarding flow that collects each user's celiac diagnosis type, dietary restrictions, and food preferences. This data shapes their experience throughout the app including product recommendations, safety thresholds, and notification preferences. The flow is GDPR-compliant with granular consent capture and a clear data usage explanation, since we're handling health- category data.

Optimistic UI & Caching

Favouriting a product, submitting a review, or updating preferences all update the UI instantly before the Firebase write confirms. If the write fails, the UI rolls back with an appropriate error. Combined with the AsyncStorage caching layer, this means the app feels responsive even on poor network conditions. This especially matters when someone is in a grocery store with a weak signal (which is frustratingly often).

Hard Problems

Cross-platform parity

React Native abstracts most platform differences, but edge cases surface constantly. Keyboard behaviour, safe area insets, font rendering, modal animations, and native module APIs all differ between iOS and Android. I built a systematic approach to platform-specific overrides, keeping the shared codebase clean while handling the differences explicitly where needed.

App Store review process

Getting a health-adjacent app through both stores' review processes required careful handling of our content, permissions, and privacy disclosures. I led the full EAS build and submission pipeline, managed reviewer feedback, and iterated on compliance requirements across multiple release cycles.

GDPR with health-category data

Dietary and medical data falls under GDPR's special category rules, requiring explicit consent and the right to erasure. I implemented a full account deletion flow that removes all user data from Firestore and Storage via a Cloud Function, and structured our consent capture to satisfy the stricter requirements for sensitive data.

Outcome

2.5k+

Downloads

4.6/5

Average Rating

2m+

Products in database

Celiapp is live on both stores and actively used by the celiac community. The app has received positive feedback for its speed and ease of use. I continue to ship new features and improvements based on user feedback.

Tech Stack

React NativeExpoExpo RouterTypeScriptFirebase AuthFirestoreFirebase StorageFirebase AnalyticsReanimatedReact NavigationAsyncStorageEAS BuildOAuthGoogle Sign-InApple Sign-InRevenueCatexpo-camera