How to Build a Chat App with Firebase

This tutorial will show you how to build a fully functional chat application using Firebase and React. We will explore the challenges and possibilities of building from scratch with Firebase and learn how CometChat offers a seamless alternative with pre-built chat features, saving time and effort.

Shrimithran • Mar 22, 2021

Building a modern chat application involves much more than just sending and receiving messages. Users expect features like real-time messaging, typing indicators, message reactions, group chats, and offline message persistence - all working seamlessly across devices. While Firebase is a popular choice for building chat applications, developers often underestimate the complexity and development effort required to create a production-ready chat experience.

In this comprehensive guide, we'll build a basic chat application using Firebase and React, exploring both the possibilities and challenges. Along the way, we'll see how CometChat provides a more efficient alternative by offering these features out of the box.

What we'll build

Our chat application will include:

  • Real-time messaging between users

  • Group chat functionality

  • Message persistence and history

  • Presence indicators (online/offline status)

  • Typing indicators

  • Message reaction

Firebase vs CometChat: Understanding the implementation landscape

Firebase approach

Firebase provides a real-time database and authentication system, but it's essentially a backend-as-a-service platform. This means developers need to:

  • Design and implement the entire messaging architecture

  • Build all UI components from scratch

  • Create custom logic for features like typing indicators and presence

  • Handle real-time updates and state management

  • Implement offline capabilities manually

  • Design and maintain database security rules

  • Scale the implementation as user base grows

Using Firebase as the sole backend to build your chat application will require significant time investment across various stages of development. The table below provides a detailed breakdown of the time taken for each step, helping you better understand the scope of work involved

Development stageEstimation
Basic messaging functionality
2-3 weeks
Full feature set implementation
6-8 weeks
UI development and polish
3-4 weeks
Testing and bug fixes
2-3 weeks

CometChat approach

CometChat provides a complete chat platform with:

  • Pre-built UI components

  • Ready-to-use backend infrastructure

  • Built-in support for all modern chat features

  • Scalable architecture managed by CometChat

  • Enterprise-grade security

  • SDKs and UI Kits for rapid development

Using CometChat to build your chat app can significantly reduce development time and effort. Unlike building a chat application from scratch with Firebase, CometChat provides pre-built chat functionalities, enabling you to save valuable time and redirect it toward refining other aspects of your app.

The table below offers a detailed breakdown of the development process when using CometChat. With our ready-to-use features, the entire chat application can be built and deployed in as little as one week. This is a stark contrast to the estimated 20-week timeline for building a similar app solely with Firebase, especially when factoring in the complexities of real-time messaging, user presence, and security.

Development stageEstimation
Basic integration
1-2 days
Customization and styling
3-5 days
Testing and deployment
1-2 days

Project setup and configuration

Before diving into the implementation details, let's first take a look at the core components that will form the foundation of our chat app. We'll also highlight which Firebase services we'll use to set up each component.

1. Realtime database

We will use the Firebase Realtime Database to store all the chat messages. It ensures that as new messages are sent or received, they are instantly reflected in the app for all users involved in the conversation. The database supports real-time data synchronization, meaning that when a user sends a message, all other participants in the chat see the message in real time.

2. Authentication

We will use Firebase Authentication to handle the secure management of user sessions. It provides various methods for users to sign in, such as email/password authentication, social media logins, or anonymous authentication.

Firebase Authentication also helps manage the connection state of users, such as whether they are online or offline. This information is critical for tracking user activity and updating the app's UI (e.g., showing if a user is currently active in a chat or when they were last seen).

3. Cloud functions (Optional)

Firebase cloud functions allow us to run backend code in response to Firebase events. We will use it to set up and send push notifications to users when they receive a new message, even if they are not actively using the app.

Cloud Functions can also be used to automate tasks like archiving old messages or cleaning up data that is no longer needed, keeping your database optimized.

4. Storage (Optional)

Firebase Storage provides an easy way to handle the uploading, storing, and sharing of media files such as images, videos, and documents. When a user sends a photo or a file in a chat, the file is uploaded to Firebase Storage, and a reference to that file is stored in the Realtime Database, ensuring seamless file retrieval and access by other users.

Once you've understood the roles of each component, we can dive deeper into how to configure the Realtime Database, which forms the backbone of our app's message storage and real-time synchronization.

Database structure design

In this section, we will see how to do the initial setup and configuration required for the Firebase Realtime Database to support your chat app. The following code represents the data structure for users, chats, and messages in the database, which will help organize and manage user profiles, chat rooms, and message exchanges efficiently.

Creating a firebase project

Go to the Firebase Console. Click "Add Project" and follow these steps:

  • Enter project name: "whatsapp-clone"

  • Disable Google Analytics (optional)

  • Click "Create Project

Once created, go to Project Settings and note your configuration:

Important: Replace these placeholder values with your actual Firebase credentials. You can find these in your Firebase Console under Project Settings. Never commit these credentials to version control or share them publicly. For production applications, consider using environment variables to manage these sensitive values.


Setting up the React project

Create a new React project using the create-react-app command

Install necessary dependencies:

Project structure

Create the following folder structure:


Firebase configuration

Create src/services/firebase.js:

Important: Replace these placeholder values with your actual Firebase credentials. You can find these in your Firebase Console under Project Settings. Never commit these credentials to version control or share them publicly. For production applications, consider using environment variables to manage these sensitive values.

Basic authentication setup

Create src/contexts/AuthContext.js:

Update src/App.js:

This completes our initial setup. In the next section, we'll implement user authentication and create the basic chat interface.

Building the chat application

Step 1: Setting up the development environment

First, let's set up our React project with Material-UI for a polished user interface:

The Material-UI components we'll use include:

  • Paper for chat windows and message bubbles

  • TextField for message input

  • List and ListItem for chat lists

  • AppBar for headers

  • Avatar for user profiles

Step 2: Understanding websocket connection management

Firebase's WebSocket implementation handles several crucial aspects of real-time messaging to ensure reliable communication:

1. Connection states

Firebase automatically manages connection state transitions

  • Provides built-in reconnection logic

  • Maintains a heartbeat to detect connection health

2. Message queue management

  • Messages are queued locally when offline

  • Automatic sync when connection is restored

  • Handles message ordering and conflict resolution

Let's implement proper connection management:

Step 3: Firebase service configuration

When working with Firebase, we need to initialize different services and set up security rules. Here's what each service file does:

  • firebase.js: Core Firebase initialization

  • presence.js: Handles user online/offline status using Firebase's '.info/connected' reference

  • chat.js: Manages message operations and real-time listeners

Let's implement these services:

Step 4: State management with context

Firebase works best with a central state management system. We're using React Context to:

  • Handle real-time updates from Firebase

  • Manage current chat state

  • Control user authentication state

Step 5: Building UI components

Our components use Material-UI for consistent styling and better user experience. Here's how they work together:

Step 6: Real-time features implementation

Firebase's real-time capabilities enable several features. Let's enhance our ChatService:

Step 7: Performance considerations

When building with Firebase, keep these performance tips in mind:

Data fetching

  • Use limitToLast() to paginate messages

  • Index your queries for better performance

  • Cache frequently accessed data

Real-time listeners

  • Clean up listeners when components unmount

  • Use single listeners for related data

  • Implement error boundaries for failed connections

Implementing advanced chat features

Understanding advanced chat requirements

Modern chat applications need several sophisticated features to provide a complete user experience:

  • Message reactions: Allow users to react with emojis

  • User mentions: Tag users in messages

  • Typing indicators: Show when users are composing messages

  • Read receipts: Track message delivery and read status

  • Message threading: Allow conversation threads/replies

  • Rich media support: Handle images and files

Message reactions implementation

While real-time messaging and typing indicators create a responsive chat experience, modern users expect more ways to interact with messages. Let's implement message reactions to allow quick, expressive responses without sending additional messages.

  • Message reactions need careful consideration for:

  • Real-time updates across all clients

  • Multiple reactions per message

  • Reaction counts and user lists

  • Efficient data structure for scaling

User mentions system

Now that users can react to messages, let's add the ability to directly mention other participants in the conversation. This feature is crucial for group chats and helps draw attention to specific users or responses.

Mentions require:

  • User search/suggestion functionality

  • Special message formatting

  • Notifications for mentioned users

Real-time typing indicators

With presence implementation complete, we can further improve the interactive experience by showing users when someone is composing a message. Typing indicators provide valuable real-time feedback and make conversations feel more dynamic and engaging.

Typing indicators need careful implementation to:

  • Prevent unnecessary database updates

  • Handle multiple typing users

    • Clear stale typing states

Read receipts implementation

Track message delivery and read status efficiently:

Deploying your chat application

1. Preparing for production

Before deploying, ensure you:

  • Have separate Firebase projects for development and production

  • Configure proper security rules for your production database

  • Set up environment variables for sensitive configuration

  • Enable proper Firebase services in your production project

2. Building the application

3. Deployment Options

Option 1: Firebase hosting

Firebase provides a straightforward hosting solution

Option 2: Other hosting platforms

For platforms like Vercel, Netlify, or AWS:

  • Configure build settings in your hosting platform

  • Set up environment variables

  • Connect your repository for automatic deployments

4. Post-deployment checklist

  • Verify WebSocket connections are working

  • Test real-time features

  • Monitor Firebase usage and quotas

  • Set up error tracking and monitoring

Conclusion

What we built

Throughout this tutorial, we implemented a WhatsApp-style chat application using Firebase, including:

  • Real-time messaging with message persistence

  • User presence and typing indicators

  • Group chat functionality

  • Message reactions

  • Basic security and authentication

Cost and maintenance reality check

Building with Firebase requires ongoing attention to:

Development costs

  • Initial development time (4-6 weeks minimum)

  • Continuous feature development and bug fixes

  • Regular security updates and maintenance

Infrastructure Costs

  • Database storage ($5/GB/month)

  • Real-time connections ($50/100k concurrent connections)

  • Data transfer costs ($0.12/GB downloaded)

  • These costs scale with user growth

Maintenance overhead

  • Performance optimization

  • Database cleanup routines

  • Connection management

  • Security rule updates

  • Scaling challenges as user base grows

The CometChat advantage

Rather than building and maintaining your own chat infrastructure, CometChat provides all these features out of the box:

  • Pre-built UI components and SDKs

  • Enterprise-grade infrastructure

  • Automatic scaling and performance optimization

  • Regular feature updates and security patches

  • Predictable pricing based on monthly active users

While Firebase offers flexibility, platforms like CometChat eliminate the complexity of building and maintaining chat functionality, allowing you to focus on your core application features.

Shrimithran

Director of Inbound Marketing , CometChat

Shrimithran is a B2B SaaS marketing leader and leads marketing and GTM efforts for CometChat. Besides SaaS and growth conversations, he finds joy in board games, football and philosophy.

Try out CometChat in action

Experience CometChat's messaging with this interactive demo built with CometChat's UI kits and SDKs.