<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[How Instagram, WhatsApp, Uber & Netflix Would Be Built Today Using Expo Router]]></title><description><![CDATA[How Instagram, WhatsApp, Uber & Netflix Would Be Built Today Using Expo Router]]></description><link>https://howappsbuildusingexporouter.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>How Instagram, WhatsApp, Uber &amp; Netflix Would Be Built Today Using Expo Router</title><link>https://howappsbuildusingexporouter.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 23:02:17 GMT</lastBuildDate><atom:link href="https://howappsbuildusingexporouter.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How Instagram, WhatsApp, Uber & Netflix Would Be Built Today Using Expo Router]]></title><description><![CDATA[Introduction
When developers first start building React Native applications, the folder structure usually looks simple:
src/
 ├── screens/
 ├── components/
 ├── navigation/
 ├── services/
 └── utils/
]]></description><link>https://howappsbuildusingexporouter.hashnode.dev/how-instagram-whatsapp-uber-netflix-would-be-built-today-using-expo-router</link><guid isPermaLink="true">https://howappsbuildusingexporouter.hashnode.dev/how-instagram-whatsapp-uber-netflix-would-be-built-today-using-expo-router</guid><dc:creator><![CDATA[Shailja Yadav]]></dc:creator><pubDate>Sat, 23 May 2026 05:01:22 GMT</pubDate><content:encoded><![CDATA[<h2>Introduction</h2>
<p>When developers first start building React Native applications, the folder structure usually looks simple:</p>
<pre><code class="language-bash">src/
 ├── screens/
 ├── components/
 ├── navigation/
 ├── services/
 └── utils/

        
        
      
</code></pre>
<p>This works perfectly for small applications.</p>
<p>But once an app starts growing into something like Instagram, WhatsApp, Uber, or Netflix, this structure quickly becomes difficult to maintain.</p>
<p>At scale, teams are not just building screens. They are building:</p>
<ul>
<li><p>realtime systems</p>
</li>
<li><p>scalable navigation</p>
</li>
<li><p>modular architecture</p>
</li>
<li><p>offline-first experiences</p>
</li>
<li><p>optimized startup performance</p>
</li>
<li><p>maintainable codebases for hundreds of developers</p>
</li>
</ul>
<p>Modern mobile engineering is no longer about just building UI. It is about designing systems that can scale for years.</p>
<p>This is where Expo Router and feature-based architecture become incredibly powerful.</p>
<p>In this article, we will explore how production-scale apps could be architected today using Expo Router.</p>
<hr />
<h1>Why Simple Folder Structures Fail at Scale</h1>
<p>A beginner-level architecture usually groups files by type:</p>
<pre><code class="language-bash">components/
screens/
hooks/
services/

        
        
      
</code></pre>
<p>Initially this feels clean.</p>
<p>But over time:</p>
<ul>
<li><p>components become impossible to locate</p>
</li>
<li><p>navigation grows chaotic</p>
</li>
<li><p>features become tightly coupled</p>
</li>
<li><p>onboarding new developers becomes difficult</p>
</li>
<li><p>large teams start conflicting with each other</p>
</li>
<li><p>state management becomes scattered</p>
</li>
</ul>
<p>Imagine Instagram using one global <code>components/</code> folder with 3000 files.</p>
<p>That would become unmaintainable.</p>
<p>Large applications solve this using:</p>
<ul>
<li><p>feature-based architecture</p>
</li>
<li><p>modular separation</p>
</li>
<li><p>domain-driven organization</p>
</li>
<li><p>shared infrastructure layers</p>
</li>
<li><p>scalable routing systems</p>
</li>
</ul>
<hr />
<h1>Why Architecture Matters in React Native Applications</h1>
<p>Architecture is not about writing more code.</p>
<p>It is about:</p>
<ul>
<li><p>scalability</p>
</li>
<li><p>maintainability</p>
</li>
<li><p>performance</p>
</li>
<li><p>developer experience</p>
</li>
<li><p>faster onboarding</p>
</li>
<li><p>easier testing</p>
</li>
<li><p>independent feature development</p>
</li>
</ul>
<p>Good architecture allows:</p>
<ul>
<li><p>100+ developers to work simultaneously</p>
</li>
<li><p>independent deployments</p>
</li>
<li><p>isolated feature ownership</p>
</li>
<li><p>scalable realtime systems</p>
</li>
<li><p>predictable app behavior</p>
</li>
</ul>
<p>Without architecture, scaling becomes extremely expensive.</p>
<hr />
<h1>How Modern Large-Scale Apps Are Structured</h1>
<p>Modern apps are usually divided into:</p>
<pre><code class="language-bash">app/
features/
shared/
services/
store/
core/

        
        
      
</code></pre>
<p>Each layer has clear responsibilities.</p>
<hr />
<h1>Production-Grade Expo Router Architecture</h1>
<h2>Suggested Folder Structure</h2>
<pre><code class="language-bash">app/
 ├── (auth)/
 │    ├── login.tsx
 │    ├── signup.tsx
 │    └── _layout.tsx
 │
 ├── (tabs)/
 │    ├── home/
 │    ├── profile/
 │    ├── search/
 │    ├── messages/
 │    └── _layout.tsx
 │
 ├── feed/
 ├── reels/
 ├── ride/
 ├── movie/
 └── _layout.tsx

features/
 ├── auth/
 ├── chat/
 ├── feed/
 ├── payments/
 ├── rides/
 ├── video/
 └── notifications/

shared/
 ├── components/
 ├── hooks/
 ├── ui/
 ├── constants/
 └── utils/

services/
 ├── api/
 ├── websocket/
 ├── analytics/
 └── storage/

store/
 ├── auth/
 ├── chat/
 ├── feed/
 └── app/

        
        
      
</code></pre>
<hr />
<h1>Diagram Idea</h1>
<h2>Production Expo Router Structure</h2>
<p>Suggested image:</p>
<ul>
<li><p>root layout</p>
</li>
<li><p>auth routes</p>
</li>
<li><p>tabs routes</p>
</li>
<li><p>nested routes</p>
</li>
<li><p>shared modules</p>
</li>
<li><p>feature modules</p>
</li>
</ul>
<hr />
<h1>Why Expo Router Changes Everything</h1>
<p>Expo Router introduces filesystem-based routing inspired by Next.js.</p>
<p>Instead of manually wiring every screen:</p>
<pre><code class="language-tsx">&lt;Stack.Screen name="Home" component={HomeScreen} /&gt;

        
        
      
</code></pre>
<p>Routes are automatically generated from folders.</p>
<p>This becomes extremely powerful at scale.</p>
<p>Benefits:</p>
<ul>
<li><p>cleaner navigation</p>
</li>
<li><p>automatic route organization</p>
</li>
<li><p>nested layouts</p>
</li>
<li><p>protected routes</p>
</li>
<li><p>shared layouts</p>
</li>
<li><p>better scalability</p>
</li>
<li><p>easier deep linking</p>
</li>
<li><p>improved developer experience</p>
</li>
</ul>
<hr />
<h1>Shared Layouts and Nested Routing in Expo Router</h1>
<p>One of the biggest advantages of Expo Router is shared layouts.</p>
<p>Example:</p>
<pre><code class="language-bash">app/
 ├── (tabs)/
 │    ├── home.tsx
 │    ├── search.tsx
 │    ├── profile.tsx
 │    └── _layout.tsx

        
        
      
</code></pre>
<p>The <code>_layout.tsx</code> controls shared navigation.</p>
<p>This allows:</p>
<ul>
<li><p>persistent tab bars</p>
</li>
<li><p>shared headers</p>
</li>
<li><p>nested stacks</p>
</li>
<li><p>feature isolation</p>
</li>
<li><p>scalable navigation trees</p>
</li>
</ul>
<p>Large apps rely heavily on nested routing.</p>
<hr />
<h1>Navigation Architecture for Scalable Apps</h1>
<p>Small apps think:</p>
<pre><code class="language-txt">Screen A → Screen B

        
        
      
</code></pre>
<p>Large apps think:</p>
<pre><code class="language-txt">Feature Modules → Nested Stacks → Shared Layouts → Dynamic Routes

        
        
      
</code></pre>
<p>Example architecture:</p>
<pre><code class="language-bash">Root Layout
 ├── Auth Stack
 ├── Tabs Stack
 │    ├── Home Stack
 │    ├── Search Stack
 │    ├── Notifications Stack
 │    └── Profile Stack
 └── Modal Stack

        
        
      
</code></pre>
<p>This separation prevents navigation chaos.</p>
<hr />
<h1>Authentication Flow Architecture</h1>
<p>Production apps never simply navigate users manually.</p>
<p>Instead they use:</p>
<ul>
<li><p>auth state</p>
</li>
<li><p>protected routes</p>
</li>
<li><p>session restoration</p>
</li>
<li><p>token refresh systems</p>
</li>
<li><p>persisted authentication</p>
</li>
</ul>
<p>Example:</p>
<pre><code class="language-tsx">return user ? &lt;AppRoutes /&gt; : &lt;AuthRoutes /&gt;

        
        
      
</code></pre>
<p>This creates:</p>
<ul>
<li><p>cleaner architecture</p>
</li>
<li><p>safer routing</p>
</li>
<li><p>easier scaling</p>
</li>
<li><p>predictable navigation</p>
</li>
</ul>
<img src="https://virtual-dom-under-the-hood.hashnode.dev/align=%22center%22" alt="" style="display:block;margin:0 auto" />

<h1>Feature-Based Architecture</h1>
<p>Feature-based architecture organizes code by business domain.</p>
<p>Instead of:</p>
<pre><code class="language-bash">components/
screens/

        
        
      
</code></pre>
<p>You structure:</p>
<pre><code class="language-bash">features/
 ├── auth/
 ├── chat/
 ├── reels/
 ├── payments/
 └── feed/

        
        
      
</code></pre>
<p>Each feature contains:</p>
<pre><code class="language-bash">feed/
 ├── components/
 ├── hooks/
 ├── services/
 ├── store/
 ├── types/
 └── screens/

        
        
      
</code></pre>
<p>Benefits:</p>
<ul>
<li><p>isolated ownership</p>
</li>
<li><p>easier scaling</p>
</li>
<li><p>better maintainability</p>
</li>
<li><p>reusable logic</p>
</li>
<li><p>independent development</p>
</li>
</ul>
<hr />
<h1>State Management Strategies for Large Apps</h1>
<p>Large apps rarely rely only on <code>useState</code>.</p>
<p>Common approaches:</p>
<ul>
<li><p>Zustand</p>
</li>
<li><p>Redux Toolkit</p>
</li>
<li><p>React Query / TanStack Query</p>
</li>
<li><p>Jotai</p>
</li>
<li><p>MobX</p>
</li>
<li><p>Recoil</p>
</li>
</ul>
<p>State is usually divided into:</p>
<h2>Local UI State</h2>
<p>Example:</p>
<ul>
<li><p>modal visibility</p>
</li>
<li><p>form inputs</p>
</li>
<li><p>animations</p>
</li>
</ul>
<h2>Server State</h2>
<p>Example:</p>
<ul>
<li><p>feeds</p>
</li>
<li><p>chats</p>
</li>
<li><p>notifications</p>
</li>
<li><p>movies</p>
</li>
<li><p>ride status</p>
</li>
</ul>
<h2>Persisted State</h2>
<p>Example:</p>
<ul>
<li><p>auth session</p>
</li>
<li><p>cached content</p>
</li>
<li><p>settings</p>
</li>
</ul>
<hr />
<h1>API Handling and Networking Layers</h1>
<p>Large apps never directly call APIs inside components.</p>
<p>Bad approach:</p>
<pre><code class="language-tsx">fetch("/api/feed")

        
        
      
</code></pre>
<p>inside screens.</p>
<p>Production apps create dedicated API layers.</p>
<p>Example:</p>
<pre><code class="language-bash">services/
 ├── api/
 │    ├── auth.api.ts
 │    ├── feed.api.ts
 │    ├── ride.api.ts
 │    └── chat.api.ts

        
        
      
</code></pre>
<p>Benefits:</p>
<ul>
<li><p>centralized networking</p>
</li>
<li><p>reusable logic</p>
</li>
<li><p>retry handling</p>
</li>
<li><p>caching</p>
</li>
<li><p>token refresh</p>
</li>
<li><p>error normalization</p>
</li>
</ul>
<hr />
<h1>Realtime Systems in Large Applications</h1>
<p>Realtime systems are one of the hardest engineering problems in mobile apps.</p>
<hr />
<h1>WhatsApp → Realtime Messaging Architecture</h1>
<p>WhatsApp focuses heavily on:</p>
<ul>
<li><p>websocket connections</p>
</li>
<li><p>message synchronization</p>
</li>
<li><p>offline delivery</p>
</li>
<li><p>typing indicators</p>
</li>
<li><p>read receipts</p>
</li>
<li><p>end-to-end encryption</p>
</li>
</ul>
<p>Typical architecture:</p>
<pre><code class="language-txt">Client
  ↓
WebSocket Gateway
  ↓
Realtime Messaging Service
  ↓
Database

        
        
      
</code></pre>
<p>Key challenges:</p>
<ul>
<li><p>reconnect handling</p>
</li>
<li><p>background sync</p>
</li>
<li><p>delivery guarantees</p>
</li>
<li><p>low battery consumption</p>
</li>
<li><p>offline queues</p>
</li>
</ul>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/6951617dfdd6cd5c419c0595/3b3aaae4-cffc-4ebd-b4c8-4799c99df82c.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h1>Instagram → Feed and Media Architecture</h1>
<p>Instagram is heavily optimized around:</p>
<ul>
<li><p>image delivery</p>
</li>
<li><p>video streaming</p>
</li>
<li><p>feed ranking</p>
</li>
<li><p>infinite scrolling</p>
</li>
<li><p>caching</p>
</li>
<li><p>preloading</p>
</li>
</ul>
<p>Challenges:</p>
<ul>
<li><p>large media files</p>
</li>
<li><p>memory optimization</p>
</li>
<li><p>smooth scrolling</p>
</li>
<li><p>lazy loading</p>
</li>
<li><p>pagination</p>
</li>
</ul>
<p>Typical strategies:</p>
<ul>
<li><p>CDN delivery</p>
</li>
<li><p>image caching</p>
</li>
<li><p>background prefetching</p>
</li>
<li><p>virtualization</p>
</li>
<li><p>media compression</p>
</li>
</ul>
<hr />
<h1>Uber → Maps and Live Location Systems</h1>
<p>Uber introduces complex realtime problems:</p>
<ul>
<li><p>live GPS updates</p>
</li>
<li><p>driver tracking</p>
</li>
<li><p>route calculations</p>
</li>
<li><p>map rendering</p>
</li>
<li><p>websocket updates</p>
</li>
</ul>
<p>Architecture usually involves:</p>
<pre><code class="language-txt">Driver App ↔ Realtime Server ↔ Rider App

        
        
      
</code></pre>
<p>Challenges:</p>
<ul>
<li><p>battery optimization</p>
</li>
<li><p>realtime synchronization</p>
</li>
<li><p>low-latency communication</p>
</li>
<li><p>network instability</p>
</li>
<li><p>map performance</p>
</li>
</ul>
<p>Mobile optimization becomes critical.</p>
<hr />
<h1>Netflix → Heavy Content Delivery</h1>
<p>Netflix focuses heavily on:</p>
<ul>
<li><p>video streaming</p>
</li>
<li><p>recommendation systems</p>
</li>
<li><p>offline downloads</p>
</li>
<li><p>smart caching</p>
</li>
<li><p>content optimization</p>
</li>
</ul>
<p>Challenges:</p>
<ul>
<li><p>massive bandwidth usage</p>
</li>
<li><p>buffering reduction</p>
</li>
<li><p>adaptive streaming</p>
</li>
<li><p>startup performance</p>
</li>
<li><p>download synchronization</p>
</li>
</ul>
<p>Netflix architecture prioritizes:</p>
<ul>
<li><p>caching</p>
</li>
<li><p>CDN usage</p>
</li>
<li><p>predictive preloading</p>
</li>
<li><p>background downloads</p>
</li>
</ul>
<hr />
<h1>Offline-First Support and Caching</h1>
<p>Modern apps cannot assume stable internet.</p>
<p>Offline-first architecture means:</p>
<ul>
<li><p>apps continue functioning offline</p>
</li>
<li><p>actions sync later</p>
</li>
<li><p>cached content remains accessible</p>
</li>
</ul>
<p>Common technologies:</p>
<ul>
<li><p>AsyncStorage</p>
</li>
<li><p>MMKV</p>
</li>
<li><p>SQLite</p>
</li>
<li><p>WatermelonDB</p>
</li>
<li><p>Realm</p>
</li>
</ul>
<p>Example:</p>
<pre><code class="language-txt">User Action
   ↓
Local Database
   ↓
Background Sync
   ↓
Server

        
        
      
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6951617dfdd6cd5c419c0595/2404d3ff-66e5-4c04-acdb-5b7ef3309dc0.png" alt="" style="display:block;margin:0 auto" />

<h1>App Startup Optimization Techniques</h1>
<p>Large apps invest heavily in startup performance.</p>
<p>Slow startup kills retention.</p>
<p>Common optimizations:</p>
<ul>
<li><p>lazy loading</p>
</li>
<li><p>code splitting</p>
</li>
<li><p>asset preloading</p>
</li>
<li><p>font optimization</p>
</li>
<li><p>deferred rendering</p>
</li>
<li><p>bundle optimization</p>
</li>
<li><p>background initialization</p>
</li>
</ul>
<p>Production apps avoid:</p>
<ul>
<li><p>blocking API calls on startup</p>
</li>
<li><p>huge JS bundles</p>
</li>
<li><p>unnecessary renders</p>
</li>
</ul>
<hr />
<h1>Performance Considerations in Production Apps</h1>
<p>Production mobile apps optimize aggressively.</p>
<p>Key areas:</p>
<h2>Rendering Performance</h2>
<p>Avoid:</p>
<ul>
<li><p>unnecessary rerenders</p>
</li>
<li><p>large lists without virtualization</p>
</li>
<li><p>expensive computations inside render</p>
</li>
</ul>
<p>Use:</p>
<ul>
<li><p>FlashList</p>
</li>
<li><p>memoization</p>
</li>
<li><p>optimized images</p>
</li>
<li><p>virtualization</p>
</li>
</ul>
<h2>Network Performance</h2>
<p>Use:</p>
<ul>
<li><p>pagination</p>
</li>
<li><p>caching</p>
</li>
<li><p>request deduplication</p>
</li>
<li><p>background sync</p>
</li>
</ul>
<h2>Memory Optimization</h2>
<p>Important for:</p>
<ul>
<li><p>media-heavy apps</p>
</li>
<li><p>infinite feeds</p>
</li>
<li><p>map systems</p>
</li>
<li><p>video streaming</p>
</li>
</ul>
<hr />
<h1>Small-App Thinking vs Production Engineering Thinking</h1>
<h2>Beginner Thinking</h2>
<ul>
<li><p>Build screens quickly</p>
</li>
<li><p>Put everything in components</p>
</li>
<li><p>Minimal abstraction</p>
</li>
<li><p>Local state everywhere</p>
</li>
</ul>
<h2>Production Engineering Thinking</h2>
<ul>
<li><p>Design scalable systems</p>
</li>
<li><p>Build modular features</p>
</li>
<li><p>Separate concerns</p>
</li>
<li><p>Optimize rendering</p>
</li>
<li><p>Prioritize maintainability</p>
</li>
<li><p>Design for future teams</p>
</li>
</ul>
<p>This mindset shift is what separates tutorial projects from production applications.</p>
<hr />
<h1>Scalability Challenges at Scale</h1>
<h2>Instagram Challenges</h2>
<ul>
<li><p>feed ranking</p>
</li>
<li><p>media caching</p>
</li>
<li><p>video delivery</p>
</li>
<li><p>realtime notifications</p>
</li>
</ul>
<h2>WhatsApp Challenges</h2>
<ul>
<li><p>realtime synchronization</p>
</li>
<li><p>encryption</p>
</li>
<li><p>delivery guarantees</p>
</li>
<li><p>massive concurrency</p>
</li>
</ul>
<h2>Uber Challenges</h2>
<ul>
<li><p>live GPS streaming</p>
</li>
<li><p>low-latency systems</p>
</li>
<li><p>realtime maps</p>
</li>
<li><p>ride synchronization</p>
</li>
</ul>
<h2>Netflix Challenges</h2>
<ul>
<li><p>content delivery</p>
</li>
<li><p>adaptive streaming</p>
</li>
<li><p>massive caching</p>
</li>
<li><p>personalization systems</p>
</li>
</ul>
<p>Every large app has completely different engineering priorities.</p>
<hr />
<h1>Tradeoffs and Architectural Decisions</h1>
<p>There is no perfect architecture.</p>
<p>Every decision involves tradeoffs.</p>
<p>Examples:</p>
<table>
<thead>
<tr>
<th>Decision</th>
<th>Tradeoff</th>
</tr>
</thead>
<tbody><tr>
<td>Redux</td>
<td>More boilerplate, better predictability</td>
</tr>
<tr>
<td>Zustand</td>
<td>Simpler DX, less strict structure</td>
</tr>
<tr>
<td>WebSockets</td>
<td>Realtime updates, higher complexity</td>
</tr>
<tr>
<td>Offline-first</td>
<td>Better UX, harder synchronization</td>
</tr>
<tr>
<td>Modular architecture</td>
<td>Better scaling, more setup complexity</td>
</tr>
<tr>
<td>Expo Router</td>
<td>Easier navigation, filesystem constraints</td>
</tr>
</tbody></table>
<p>Engineering is about balancing:</p>
<ul>
<li><p>scalability</p>
</li>
<li><p>developer experience</p>
</li>
<li><p>performance</p>
</li>
<li><p>maintainability</p>
</li>
<li><p>speed of development</p>
</li>
</ul>
<hr />
<h1>Why Expo Router Is a Strong Choice Today</h1>
<p>Expo Router significantly improves:</p>
<ul>
<li><p>navigation organization</p>
</li>
<li><p>route scalability</p>
</li>
<li><p>developer productivity</p>
</li>
<li><p>nested layouts</p>
</li>
<li><p>deep linking</p>
</li>
<li><p>route maintainability</p>
</li>
</ul>
<p>For modern React Native applications, Expo Router aligns extremely well with production-scale thinking.</p>
<p>Especially when combined with:</p>
<ul>
<li><p>feature-based architecture</p>
</li>
<li><p>modern state management</p>
</li>
<li><p>offline-first systems</p>
</li>
<li><p>modular API layers</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>