Technical case study: Cross-platform mobile app

Mobile Chat App

A chat app with real-time messaging, offline-first architecture, image and location sharing, and screen reader support.

Built with

  • React Native
  • Expo
  • Firebase Firestore
  • Firebase Auth
  • Firebase Storage
  • Gifted Chat
  • AsyncStorage

At a glance

Project snapshot

4

weeks of development

2

platforms, iOS and Android

6

core features

3

Firebase services

Role

Developer (solo project)

Framework

React Native with Expo

Backend

Firebase Firestore, Auth, and Storage

Program

CareerFoundry Full-Stack Web Development

Overview

About the app

The app lets users chat in real time, share images, and send their location. Firebase Firestore stores and syncs every conversation, Firebase Cloud Storage hosts shared images, and the Gifted Chat library powers the chat interface, with screen reader compatibility built in throughout.

See it in action

The app in use

A quick walkthrough of the start screen, real-time messaging, and image and location sharing.

Core features

What the app does

Custom start screen

Name entry and background color selection, built to spec with accessibility in mind.

Real-time messaging

Gifted Chat with Firebase Firestore for instant delivery and cross-device sync.

Anonymous authentication

Firebase Authentication gives secure access without a sign-up barrier.

Image sharing

Camera capture and gallery selection, hosted in Firebase Cloud Storage.

Location sharing

GPS-based location sharing displayed in an interactive map view.

Offline access

AsyncStorage keeps conversations available and syncs when the connection returns.

The approach

Technical challenges and solutions

Cross-platform compatibility

Challenge: one app that behaves the same on iOS and Android.

Solution: React Native with Expo, using native device features from a single codebase.

Real-time data synchronization

Challenge: instant messaging across unreliable connections.

Solution: Firestore listeners that update the chat live, falling back to cached messages offline.

Offline-first architecture

Challenge: keeping conversations available without a connection.

Solution: AsyncStorage caching that loads saved messages whenever the device is offline.

In the code

How the core features work

Three snippets from the app’s source code, one for each core feature.

Choose a feature below to see its code

Firestore listeners deliver new messages instantly and cache them for offline use.

// Firebase Firestore real-time listener setup
useEffect(() => {
  let unsubscribe;
  if (isConnected === true) {
    const q = query(
      collection(db, "messages"),
      orderBy("createdAt", "desc")
    );
    unsubscribe = onSnapshot(q, (docs) => {
      let newMessages = [];
      docs.forEach((doc) => {
        newMessages.push({
          id: doc.id,
          ...doc.data(),
          createdAt: new Date(doc.data().createdAt.toMillis())
        });
      });
      cacheMessages(newMessages);
      setMessages(newMessages);
    });
  } else {
    loadCachedMessages();
  }
  return () => unsubscribe && unsubscribe();
}, [isConnected]);

The results

What it demonstrates

Building offline-first showed how complex mobile state management can be, and why graceful degradation matters for any app that depends on a network connection.

  • React Native and Expo: cross-platform components, navigation, and native device features
  • Firebase: real-time database, anonymous authentication, and cloud storage
  • Offline-first, accessible UX: local caching and screen reader support

Need a custom web or mobile app?

Book a free 30-minute discovery call to talk through your idea.