In this three-part tutorial series, you'll build a fully functional Slack clone for iOS and Android using React Native and Stream Chat.
By the end, you'll have a working app that closely mirrors Slack's UI and functionality, complete with dark mode support, emoji reactions, GIF previews, and a message action sheet.
Note: This tutorial is a guide to building a real-world chat experience using Stream's Chat API and SDKs — not a production-ready Slack replacement.
What You'll Build
Over the course of three parts, you'll implement the following features:
- A real-time channel list with unread indicators, presence indicators, and direct message support
- A channel screen with a custom Slack-style message UI (square avatars, inline reactions, URL previews, GIF cards)
- A custom message input with attach and send buttons
- Dark mode support with dynamic theming
- A channel list header, floating compose button, and a bottom tab bar
- A message action sheet for editing, deleting, copying, and replying to messages
- A threads screen for replying within a message thread
- Search screens for jumping to channels, searching direct messages, and searching messages globally
Prerequisites
Before starting, you should have:
- A React Native development environment set up for iOS and/or Android. See the official React Native docs for guidance.
- A free Stream account. You'll use Stream's Chat API and React Native SDK throughout this series.
- Basic familiarity with React Native and React hooks.
The Tutorial Series
→ Part 1: Project Setup, Channel List, Channel Screen & Message Input
Part 1 covers everything you need to get from zero to a working messaging UI. You'll scaffold the React Native project, install all dependencies, and connect to the Stream Chat API. From there, you'll build:
- A channel list with real-time event handling for new messages and read state
- A channel screen powered by Stream's
Channel,MessageList, andMessageInputcomponents - A custom
MessageSlackcomponent that replicates Slack's message UI: square avatars, username headers, bottom-aligned reactions with counts, styled URL previews, and GIF cards - A custom input box with compose, attach, and send controls
→ Part 2: Icons, Top Bar, Compose Button & Message Action Sheet
Part 2 builds on the foundation from Part 1 by adding the navigational chrome and interaction patterns that make the app feel complete. You'll add:
- An SVG icon system with light and dark mode variants
- App-wide dark and light themes using React Navigation's theming API
- A screen header with title, logo, and search button
- A floating compose button for starting new conversations
- A bottom tab bar (Home, DMs, Mentions, You)
- A message action sheet for copy, edit, delete, and reply-in-thread actions
→ Part 3: Threads, Message Search & Channel Search
Part 3 completes the series with the features that make a chat app truly navigable. You'll build:
- A thread screen for focused replies on a parent message, using Stream's built-in
Threadcomponent - A message search screen with recent search history stored in
AsyncStorageand global search powered by Stream's Search API - A channel search screen that doubles as a "jump to channel" UI, with debounced queries and a horizontal strip of recent direct message contacts
- A targeted message channel screen that opens a channel scrolled to a specific search result message
The complete project is available on GitHub.
Happy coding! 🎉
