<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ajmal Hasan</title>
    <description>The latest articles on DEV Community by Ajmal Hasan (@ajmal_hasan).</description>
    <link>https://dev.to/ajmal_hasan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F376439%2F5c8c757f-9969-42c5-86e1-cdeec52d1abf.jpg</url>
      <title>DEV Community: Ajmal Hasan</title>
      <link>https://dev.to/ajmal_hasan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajmal_hasan"/>
    <language>en</language>
    <item>
      <title>How to Use React Native Best Practices Agent Skills</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Thu, 22 Jan 2026 05:07:14 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-to-use-react-native-best-practices-agent-skills-121k</link>
      <guid>https://dev.to/ajmal_hasan/how-to-use-react-native-best-practices-agent-skills-121k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;React Native performance optimization can be complex, with many pitfalls that affect FPS, bundle size, memory usage, and startup time. The &lt;strong&gt;react-native-best-practices&lt;/strong&gt; skill package provides AI coding agents with comprehensive guidelines to automatically detect, suggest, and implement performance optimizations in React Native and Expo applications.&lt;/p&gt;

&lt;p&gt;These best practices are packaged as &lt;strong&gt;Agent skills&lt;/strong&gt; that integrate seamlessly into &lt;strong&gt;Cursor&lt;/strong&gt; and other AI-powered coding agents.&lt;/p&gt;

&lt;p&gt;When your agent reviews, optimizes, or develops a React Native codebase, it can automatically reference these patterns and suggest fixes based on proven optimization techniques from Callstack's "Ultimate Guide to React Native Optimization."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For detailed information, refer to the official announcement:&lt;/strong&gt; &lt;a href="https://www.callstack.com/blog/announcing-react-native-best-practices-for-ai-agents" rel="noopener noreferrer"&gt;Announcing: React Native Best Practices for AI Agents&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Are Agent Skills?
&lt;/h2&gt;

&lt;p&gt;Agent skills are knowledge packages that enhance AI coding assistants with domain-specific expertise. Instead of manually searching documentation or remembering optimization patterns, your AI assistant can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatically detect&lt;/strong&gt; performance issues in your code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggest specific fixes&lt;/strong&gt; based on proven patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference detailed guides&lt;/strong&gt; when working on optimization tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply best practices&lt;/strong&gt; without you having to prompt for each one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The react-native-best-practices skill contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 main SKILL.md file&lt;/strong&gt; with quick references and problem mappings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28 detailed reference files&lt;/strong&gt; covering JavaScript, Native, and Bundling optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority-ordered guidelines&lt;/strong&gt; (CRITICAL → HIGH → MEDIUM impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code examples&lt;/strong&gt; showing incorrect vs. correct patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Cursor
&lt;/h3&gt;

&lt;p&gt;Install the skill package using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx add-skill callstackincubator/agent-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the skill package&lt;/li&gt;
&lt;li&gt;Install it into your agent's skill directory (typically &lt;code&gt;.agents/skills/&lt;/code&gt; or &lt;code&gt;.windsurf/skills/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Make it available for automatic reference during coding sessions&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automatic Activation
&lt;/h3&gt;

&lt;p&gt;The skill is &lt;strong&gt;automatically activated&lt;/strong&gt; when your AI assistant detects tasks related to:&lt;/p&gt;

&lt;h4&gt;
  
  
  Performance Issues
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"App feels slow/janky"&lt;/li&gt;
&lt;li&gt;"Animation drops frames"&lt;/li&gt;
&lt;li&gt;"List scroll is laggy"&lt;/li&gt;
&lt;li&gt;"Too many re-renders"&lt;/li&gt;
&lt;li&gt;"FPS is low"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bundle &amp;amp; App Size
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Bundle size is too large"&lt;/li&gt;
&lt;li&gt;"App size optimization"&lt;/li&gt;
&lt;li&gt;"Reduce bundle size"&lt;/li&gt;
&lt;li&gt;"Tree shaking issues"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Memory Problems
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Memory leaks"&lt;/li&gt;
&lt;li&gt;"Memory growing over time"&lt;/li&gt;
&lt;li&gt;"App crashes due to memory"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Startup Time
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Slow app startup"&lt;/li&gt;
&lt;li&gt;"TTI (Time to Interactive) optimization"&lt;/li&gt;
&lt;li&gt;"Cold start performance"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Native Modules
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Native module performance"&lt;/li&gt;
&lt;li&gt;"Turbo Modules"&lt;/li&gt;
&lt;li&gt;"Bridge overhead"&lt;/li&gt;
&lt;li&gt;"Android 16KB alignment"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Specific Technologies
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;FlashList optimization&lt;/li&gt;
&lt;li&gt;Hermes optimization&lt;/li&gt;
&lt;li&gt;React Native profiling&lt;/li&gt;
&lt;li&gt;Reanimated worklets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Automatic Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You ask:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My FlatList is scrolling slowly, how can I optimize it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recognizes this as a performance issue&lt;/li&gt;
&lt;li&gt;References &lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt; from the skill&lt;/li&gt;
&lt;li&gt;Suggests replacing FlatList with FlashList&lt;/li&gt;
&lt;li&gt;Provides code examples and migration steps&lt;/li&gt;
&lt;li&gt;Explains the performance benefits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You ask:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My bundle size is 15MB, how can I reduce it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detects bundle size optimization need&lt;/li&gt;
&lt;li&gt;References multiple bundle-related skills:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bundle-analyze-js.md&lt;/code&gt; (to analyze current bundle)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-barrel-exports.md&lt;/code&gt; (to fix barrel imports)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-tree-shaking.md&lt;/code&gt; (to enable tree shaking)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provides step-by-step optimization plan&lt;/li&gt;
&lt;li&gt;Shows before/after code examples&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Priority-Ordered Guidelines
&lt;/h3&gt;

&lt;p&gt;The skill organizes optimizations by impact:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;FPS &amp;amp; Re-renders&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRITICAL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FlashList, React Compiler, atomic state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bundle Size&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRITICAL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Barrel exports, tree shaking, R8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TTI Optimization&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hermes mmap, native navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Native Performance&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turbo Modules, threading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Memory Management&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MEDIUM-HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory leak detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Animations&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MEDIUM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reanimated worklets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Reference Files
&lt;/h3&gt;

&lt;h4&gt;
  
  
  JavaScript/React (&lt;code&gt;js-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt; - Replace ScrollView with virtualized lists&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-profile-react.md&lt;/code&gt; - React DevTools profiling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-measure-fps.md&lt;/code&gt; - FPS monitoring&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-memory-leaks.md&lt;/code&gt; - JS memory leak detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-atomic-state.md&lt;/code&gt; - Jotai/Zustand patterns&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-concurrent-react.md&lt;/code&gt; - useDeferredValue, useTransition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-react-compiler.md&lt;/code&gt; - Automatic memoization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-animations-reanimated.md&lt;/code&gt; - Reanimated worklets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-uncontrolled-components.md&lt;/code&gt; - TextInput optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Native (&lt;code&gt;native-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;native-turbo-modules.md&lt;/code&gt; - Building fast native modules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-sdks-over-polyfills.md&lt;/code&gt; - Native vs JS libraries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-measure-tti.md&lt;/code&gt; - TTI measurement&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-threading-model.md&lt;/code&gt; - Turbo Module threads&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-profiling.md&lt;/code&gt; - Xcode/Android Studio profiling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-memory-leaks.md&lt;/code&gt; - Native memory leak detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-android-16kb-alignment.md&lt;/code&gt; - Google Play alignment&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bundling (&lt;code&gt;bundle-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bundle-barrel-exports.md&lt;/code&gt; - Avoid barrel imports&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-analyze-js.md&lt;/code&gt; - JS bundle visualization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-tree-shaking.md&lt;/code&gt; - Dead code elimination&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-r8-android.md&lt;/code&gt; - Android code shrinking&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-hermes-mmap.md&lt;/code&gt; - Disable bundle compression&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Fixing Slow List Scrolling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before (without skill):&lt;/strong&gt;&lt;br&gt;
You might manually search for "React Native list optimization" and try various solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With skill:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Agent automatically suggests:&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ Current code&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ScrollView&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Item&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ScrollView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ Optimized code&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlashList&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shopify/flash-list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FlashList&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;renderItem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Item&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;  &lt;span class="nx"&gt;estimatedItemSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why FlashList is better than FlatList/ScrollView&lt;/li&gt;
&lt;li&gt;How to estimate item sizes&lt;/li&gt;
&lt;li&gt;Performance improvements (often 2-3x faster)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 2: Reducing Bundle Size
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;With skill, the agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes your imports&lt;/li&gt;
&lt;li&gt;Detects barrel exports&lt;/li&gt;
&lt;li&gt;Suggests direct imports
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Barrel import (bundles everything)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Modal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Direct imports (only bundles what you use)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/Card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 3: Memory Leak Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You mention:&lt;/strong&gt; "My app's memory keeps growing"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;References &lt;code&gt;js-memory-leaks.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Suggests profiling steps&lt;/li&gt;
&lt;li&gt;Identifies common leak patterns:

&lt;ul&gt;
&lt;li&gt;Event listeners not cleaned up&lt;/li&gt;
&lt;li&gt;Timers/intervals not cleared&lt;/li&gt;
&lt;li&gt;Subscriptions not unsubscribed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provides fix examples&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Problem → Skill Mapping
&lt;/h2&gt;

&lt;p&gt;The skill includes a built-in mapping so agents know which reference to use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Agent References&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App feels slow/janky&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-measure-fps.md&lt;/code&gt; → &lt;code&gt;js-profile-react.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too many re-renders&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-profile-react.md&lt;/code&gt; → &lt;code&gt;js-react-compiler.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow startup (TTI)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;native-measure-tti.md&lt;/code&gt; → &lt;code&gt;bundle-analyze-js.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large app size&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bundle-analyze-app.md&lt;/code&gt; → &lt;code&gt;bundle-r8-android.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory growing&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-memory-leaks.md&lt;/code&gt; or &lt;code&gt;native-memory-leaks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Animation drops frames&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-animations-reanimated.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List scroll jank&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TextInput lag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-uncontrolled-components.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native module slow&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;native-turbo-modules.md&lt;/code&gt; → &lt;code&gt;native-threading-model.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Automatic Pattern Recognition&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No need to remember all optimization patterns. The agent recognizes issues and suggests fixes automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Proven Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Based on Callstack's comprehensive optimization guide, tested in real-world applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Context-Aware Suggestions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The agent understands your specific problem and provides relevant solutions, not generic advice.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Code Examples&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each skill includes before/after code examples, making implementation straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Priority Guidance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;CRITICAL issues are addressed first, ensuring maximum impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Comprehensive Coverage&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;28 reference files cover JavaScript, Native, and Bundling optimizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices for Using the Skill
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Be Specific About Problems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of "my app is slow," say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"My FlatList scrolls at 30 FPS"&lt;/li&gt;
&lt;li&gt;"App startup takes 5 seconds"&lt;/li&gt;
&lt;li&gt;"Bundle size is 20MB"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Let the Agent Analyze First&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ask the agent to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Analyze my codebase for performance issues"&lt;/li&gt;
&lt;li&gt;"Check for barrel imports"&lt;/li&gt;
&lt;li&gt;"Review my list components"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Follow the Suggestions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The agent provides prioritized fixes. Start with CRITICAL items first.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Measure Before and After&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use the profiling tools mentioned in the skills to verify improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FPS monitoring&lt;/li&gt;
&lt;li&gt;Bundle analysis&lt;/li&gt;
&lt;li&gt;Memory profiling&lt;/li&gt;
&lt;li&gt;TTI measurement&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Integration with Your Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  During Code Review
&lt;/h3&gt;

&lt;p&gt;The agent automatically flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScrollView usage (should be FlashList)&lt;/li&gt;
&lt;li&gt;Barrel imports&lt;/li&gt;
&lt;li&gt;Missing memoization&lt;/li&gt;
&lt;li&gt;Inline styles (if using Unistyles)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  During Development
&lt;/h3&gt;

&lt;p&gt;The agent suggests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better component patterns&lt;/li&gt;
&lt;li&gt;Performance optimizations&lt;/li&gt;
&lt;li&gt;Memory-efficient implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  During Optimization
&lt;/h3&gt;

&lt;p&gt;The agent provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step-by-step optimization plans&lt;/li&gt;
&lt;li&gt;Measurement tools&lt;/li&gt;
&lt;li&gt;Before/after comparisons&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Skill Not Activating?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check Installation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;ls&lt;/span&gt; .agents/skills/react-native-best-practices/
   &lt;span class="c"&gt;# or&lt;/span&gt;
   &lt;span class="nb"&gt;ls&lt;/span&gt; .windsurf/skills/react-native-best-practices/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Specific Keywords&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"performance"&lt;/li&gt;
&lt;li&gt;"optimization"&lt;/li&gt;
&lt;li&gt;"bundle size"&lt;/li&gt;
&lt;li&gt;"memory leak"&lt;/li&gt;
&lt;li&gt;"FPS"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be Explicit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Use react-native-best-practices to optimize this"&lt;/li&gt;
&lt;li&gt;"Check this code against performance best practices"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Skill Suggestions Not Relevant?
&lt;/h3&gt;

&lt;p&gt;The skill is designed for React Native/Expo apps. For other frameworks, different skills may be needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The react-native-best-practices agent skill transforms your AI coding assistant into a React Native performance expert. By automatically detecting issues and suggesting proven optimizations, it helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build faster apps&lt;/strong&gt; with better FPS and responsiveness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce bundle sizes&lt;/strong&gt; for faster downloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevent memory leaks&lt;/strong&gt; that cause crashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize startup time&lt;/strong&gt; for better user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it once, and your agent will continuously help you write performant React Native code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Announcement&lt;/strong&gt;: &lt;a href="https://www.callstack.com/blog/announcing-react-native-best-practices-for-ai-agents" rel="noopener noreferrer"&gt;Announcing: React Native Best Practices for AI Agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Guide&lt;/strong&gt;: Based on &lt;a href="https://www.callstack.com/blog/the-ultimate-guide-to-react-native-optimization" rel="noopener noreferrer"&gt;Callstack's Ultimate Guide to React Native Optimization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill Repository&lt;/strong&gt;: &lt;code&gt;callstackincubator/agent-skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;: &lt;code&gt;npx add-skill callstackincubator/agent-skills&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Happy Optimizing! 🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>Lightning-Fast In-App Debugging with React Native BugBubble</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Mon, 05 Jan 2026 07:05:58 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/lightning-fast-in-app-debugging-with-react-native-bugbubble-5bao</link>
      <guid>https://dev.to/ajmal_hasan/lightning-fast-in-app-debugging-with-react-native-bugbubble-5bao</guid>
      <description>&lt;p&gt;If you want real-time visibility into network calls, WebSocket events, console logs, and analytics without leaving your app, &lt;a href="https://github.com/lokal-app/react-native-bugbubble" rel="noopener noreferrer"&gt;&lt;code&gt;@lokal-dev/react-native-bugbubble&lt;/code&gt;&lt;/a&gt; is a lightweight drop-in debugger for React Native.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/lokal-app/react-native-bugbubble?tab=readme-ov-file#demo" rel="noopener noreferrer"&gt;DEMO&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc2n43phr6xcd8llirt5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc2n43phr6xcd8llirt5.png" alt=" " width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why BugBubble?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Floating debug bubble you can drag and tap to open the debugger UI.&lt;/li&gt;
&lt;li&gt;Tracks network, WebSocket, console, and analytics events out of the box.&lt;/li&gt;
&lt;li&gt;Zero native setup; pure JS/TS with sensible defaults.&lt;/li&gt;
&lt;li&gt;Configurable log limits, button position, and per-signal tracking.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @lokal-dev/react-native-bugbubble
&lt;span class="c"&gt;# or&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @lokal-dev/react-native-bugbubble
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minimal Integration
&lt;/h3&gt;

&lt;p&gt;Add the component at your app root so it mounts once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components/global/BugBubbleProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;YourApp&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuring the Debugger
&lt;/h3&gt;

&lt;p&gt;You can tune log limits, bubble position, and tracking switches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubble&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@lokal-dev/react-native-bugbubble&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;IS_BUG_BUBBLE_ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ENV&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * BugBubble configuration options
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bugBubbleConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;maxLogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Maximum number of logs to store&lt;/span&gt;
  &lt;span class="na"&gt;floatingButtonPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;trackingOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track console logs&lt;/span&gt;
      &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track network requests&lt;/span&gt;
      &lt;span class="na"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track websocket connections&lt;/span&gt;
      &lt;span class="na"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Disable analytics tracking&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ignoreUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;/symbolicate/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/generate_204/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/clients3&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;google&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;com/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// optional: hide unwanted urls&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;IS_BUG_BUBBLE_ENABLED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BugBubble&lt;/span&gt; &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;bugBubbleConfig&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config is read on mount; remount to change it.&lt;/li&gt;
&lt;li&gt;Disabling a log type hides its tab and stops interceptors for that type.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manual Logging (Optional)
&lt;/h3&gt;

&lt;p&gt;If you need to log custom events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@lokal-dev/react-native-bugbubble&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user_login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logNetwork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logWebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://api.example.com/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logConsole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Deprecated API used&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QA builds to inspect API traffic without remote tools.&lt;/li&gt;
&lt;li&gt;Investigating flaky WebSocket or console noise in CI-only environments.&lt;/li&gt;
&lt;li&gt;Lightweight alternative to heavier remote debuggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For full API details and examples, see the project repo: &lt;a href="https://github.com/lokal-app/react-native-bugbubble" rel="noopener noreferrer"&gt;react-native-bugbubble on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Knip: Dead Code Detector for JavaScript &amp; TypeScript Projects</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Tue, 23 Dec 2025 19:51:53 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/knip-the-ultimate-dead-code-detector-for-javascript-typescript-projects-3463</link>
      <guid>https://dev.to/ajmal_hasan/knip-the-ultimate-dead-code-detector-for-javascript-typescript-projects-3463</guid>
      <description>&lt;p&gt;Every mature codebase has &lt;strong&gt;dead code&lt;/strong&gt;. That utility function someone wrote "just in case." The component from a feature that was scrapped. The npm package installed for a spike that never went anywhere.&lt;/p&gt;

&lt;p&gt;ESLint can catch unused variables and imports within a file, but what about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Files that are never imported anywhere?&lt;/li&gt;
&lt;li&gt;Exported functions that no one uses?&lt;/li&gt;
&lt;li&gt;Dependencies in &lt;code&gt;package.json&lt;/code&gt; you forgot to remove?&lt;/li&gt;
&lt;li&gt;Types and interfaces defined but never referenced?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;Knip&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Knip Detects
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ &lt;strong&gt;Unused Files&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Source files that aren't imported anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 &lt;strong&gt;Unused Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Packages in &lt;code&gt;package.json&lt;/code&gt; that aren't used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📤 &lt;strong&gt;Unused Exports&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Functions, classes, types exported but never imported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 &lt;strong&gt;Unused Dev Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Dev packages that aren't needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❓ &lt;strong&gt;Unlisted Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Packages used in code but missing from &lt;code&gt;package.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 &lt;strong&gt;Unresolved Imports&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Imports pointing to non-existent modules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0xvkipuv3kq4t2ttih2.png" alt=" " width="800" height="234"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; knip

&lt;span class="c"&gt;# yarn&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; knip

&lt;span class="c"&gt;# pnpm&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; knip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;

&lt;p&gt;Just run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx knip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Knip will analyze your project and output all the unused code it finds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;For most projects, Knip works out of the box. But for complex setups (monorepos, custom entry points, etc.), you'll want a config file.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;knip.json&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://unpkg.com/knip@5/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/index.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/App.tsx"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*.{ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__tests__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__mocks__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"husky"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Configuration Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;entry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry point files where Knip starts tracing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Files to analyze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Files/patterns to skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignoreDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dependencies to skip (useful for config-only packages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignoreExportsUsedInFile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Don't report exports used only in the same file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  React Native Example
&lt;/h3&gt;

&lt;p&gt;For React Native projects, you'll need to account for native tooling and development dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://unpkg.com/knip@5/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/App.tsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*.{ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__tests__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__mocks__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"android/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ios/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/metro-config"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/typescript-config"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/babel-preset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"patch-package"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"reactotron-react-native"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreExportsUsedInFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Results
&lt;/h2&gt;

&lt;p&gt;I ran Knip on a production React Native app, and here's what it found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Unused files &lt;span class="o"&gt;(&lt;/span&gt;73&lt;span class="o"&gt;)&lt;/span&gt;
src/components/map/index.tsx
src/components/views/NotificationMenuButton.tsx
src/models/requests/auth/authRequests.ts
src/utils/helpers/contactHelper.ts
... and 69 more

Unused dependencies &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
@react-native-firebase/perf

Unused devDependencies &lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt;
@babel/preset-env
@testing-library/jest-native
@types/react-native-get-random-values
eslint-plugin-react-you-might-not-need-an-effect

Unlisted dependencies &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;
credit-card-type  src/features/paymentMethods/addNewCard/index.tsx

Unused exports &lt;span class="o"&gt;(&lt;/span&gt;74&lt;span class="o"&gt;)&lt;/span&gt;
translations        src/config/localization/languages.ts
defaultAddressForm  src/features/addressBook/addressTypes.ts
... and more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;73 unused files!&lt;/strong&gt; That's potentially thousands of lines of dead code that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increases bundle size&lt;/li&gt;
&lt;li&gt;Confuses new developers&lt;/li&gt;
&lt;li&gt;Creates maintenance burden&lt;/li&gt;
&lt;li&gt;Shows up in search results, wasting time&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>iOS Bridging Header Setup for React Native</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Tue, 16 Dec 2025 18:51:43 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/ios-bridging-header-setup-for-react-native-2gln</link>
      <guid>https://dev.to/ajmal_hasan/ios-bridging-header-setup-for-react-native-2gln</guid>
      <description>&lt;p&gt;A bridging header allows Swift code to access Objective-C libraries and native modules. Here's how to set it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create the Bridging Header File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on your project folder in Xcode&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;New File from Template&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Header file&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wkgiafwgf2xjyd64sdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wkgiafwgf2xjyd64sdt.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Configure the File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Header file&lt;/strong&gt; template&lt;/li&gt;
&lt;li&gt;Name it: &lt;code&gt;YourAppName-Bridging-Header.h&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select all targets (main app, development, production)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Step 3: Set the Bridging Header Path
&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;each target&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Build Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"Objective-C Bridging Header"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set path: &lt;code&gt;YourAppName/YourAppName-Bridging-Header.h&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrqoau3n5400jhxwqkrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrqoau3n5400jhxwqkrb.png" alt=" " width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Import Your Headers
&lt;/h3&gt;

&lt;p&gt;Open the bridging header and import what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight objective_c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// React Native Config&lt;/span&gt;
&lt;span class="cp"&gt;#import "RNCConfig.h"
&lt;/span&gt;
&lt;span class="c1"&gt;// Google Maps&lt;/span&gt;
&lt;span class="cp"&gt;#import &amp;lt;GoogleMaps/GoogleMaps.h&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Your custom modules&lt;/span&gt;
&lt;span class="cp"&gt;#import "CustomNativeModule.h"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsa28irpmaxwwx06f6r8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsa28irpmaxwwx06f6r8.png" alt=" " width="754" height="262"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Use in AppDelegate.Swift
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;@UIApplicationMain&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;AppDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIResponder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UIApplicationDelegate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="n"&gt;didFinishLaunchingWithOptions&lt;/span&gt; &lt;span class="nv"&gt;launchOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;LaunchOptionsKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]?)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Access environment variables&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;RNCConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"API_KEY"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;GMSServices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;provideAPIKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Initialize Firebase&lt;/span&gt;
        &lt;span class="kt"&gt;FirebaseApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs6r98zab4mgtedw6o0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs6r98zab4mgtedw6o0o.png" alt=" " width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Clean and Build
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Clean: &lt;code&gt;Cmd + Shift + K&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build: &lt;code&gt;Cmd + B&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run: &lt;code&gt;Cmd + R&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YourAppName/
├── ios/
│   ├── YourAppName/
│   │   ├── AppDelegate.swift
│   │   ├── YourAppName-Bridging-Header.h  ✅
│   │   └── Info.plist
│   └── Pods/
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Found this helpful?&lt;/strong&gt; Drop a ❤️ below! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  ReactNative #iOS #Swift #MobileDevelopment
&lt;/h1&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
    </item>
    <item>
      <title>Stop Fighting React Native Dependency Hell — Use This Microsoft Tool</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Mon, 08 Dec 2025 14:18:07 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/stop-fighting-react-native-dependency-hell-use-this-microsoft-tool-3g5g</link>
      <guid>https://dev.to/ajmal_hasan/stop-fighting-react-native-dependency-hell-use-this-microsoft-tool-3g5g</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Every React Native Dev Knows
&lt;/h2&gt;

&lt;p&gt;You've been there. You run &lt;code&gt;yarn install&lt;/code&gt;, everything looks fine, then &lt;strong&gt;boom&lt;/strong&gt; — runtime crashes, red screens, or mysterious build failures. The culprit? Incompatible package versions.&lt;/p&gt;

&lt;p&gt;React Native's ecosystem moves fast. Package A needs React Native 0.81, but Package B was last tested on 0.79. Figuring out which versions play nice together? A nightmare.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter &lt;a href="https://microsoft.github.io/rnx-kit/docs/guides/dependency-management" rel="noopener noreferrer"&gt;&lt;code&gt;@rnx-kit/align-deps&lt;/code&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Microsoft built a tool that solves this: &lt;strong&gt;align-deps&lt;/strong&gt;. It automatically checks and fixes your dependencies to ensure they're compatible with your React Native version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Setup (2 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Install it:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @rnx-kit/align-deps &lt;span class="nt"&gt;--dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Add these scripts to &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"check-dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rnx-align-deps"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fix-dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rnx-align-deps --write"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Initialize for your RN version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx rnx-align-deps &lt;span class="nt"&gt;--init&lt;/span&gt; app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Fix any issues:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn fix-dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The tool scans your dependencies and adjusts versions to ones known to work together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrading React Native? Here's Your Toolkit
&lt;/h2&gt;

&lt;p&gt;Upgrading React Native involves two things: &lt;strong&gt;dependencies&lt;/strong&gt; and &lt;strong&gt;native files&lt;/strong&gt;. You need different tools for each.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Align Your Dependencies
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;align-deps&lt;/code&gt; to update all your JS dependencies to compatible versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @rnx-kit/align-deps &lt;span class="nt"&gt;--requirements&lt;/span&gt; react-native@0.81 &lt;span class="nt"&gt;--write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This updates &lt;strong&gt;all&lt;/strong&gt; your React Native-related packages to versions known to work with RN 0.81. No more guessing which version of &lt;code&gt;react-native-screens&lt;/code&gt; or &lt;code&gt;react-native-reanimated&lt;/code&gt;, etc you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Update Native Files (iOS/Android)
&lt;/h3&gt;

&lt;p&gt;Dependencies are only half the battle. React Native upgrades often require changes to native files like &lt;code&gt;AppDelegate.swift&lt;/code&gt;, &lt;code&gt;build.gradle&lt;/code&gt;, &lt;code&gt;Podfile&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;👉 Use the &lt;strong&gt;&lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;React Native Upgrade Helper&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This tool shows you a &lt;strong&gt;visual diff&lt;/strong&gt; of all native file changes between your current version and your target version. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to use it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;react-native-community.github.io/upgrade-helper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;current&lt;/strong&gt; RN version (e.g., 0.79.0)&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;target&lt;/strong&gt; RN version (e.g., 0.81.0)&lt;/li&gt;
&lt;li&gt;Review the diff and apply changes to your &lt;code&gt;ios/&lt;/code&gt; and &lt;code&gt;android/&lt;/code&gt; folders&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pro Tip: Use Both Together
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Update JS dependencies&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@rnx-kit/align-deps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update native files&lt;/td&gt;
&lt;td&gt;&lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;Upgrade Helper&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This combo makes React Native upgrades &lt;strong&gt;dramatically&lt;/strong&gt; less painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What align-deps Actually Does
&lt;/h2&gt;

&lt;p&gt;When I ran &lt;code&gt;fix-dependencies&lt;/code&gt; on my project, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬇️ &lt;strong&gt;Downgraded&lt;/strong&gt; some packages to stable, compatible versions&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;Added flexibility&lt;/strong&gt; (&lt;code&gt;^&lt;/code&gt;) to some pinned versions&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Generated config&lt;/strong&gt; tracking which "capabilities" my app uses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, it changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-native-modal&lt;/code&gt;: &lt;code&gt;^14.0.0-rc.1&lt;/code&gt; → &lt;code&gt;^13.0.0&lt;/code&gt; (stable over RC)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-screens&lt;/code&gt;: &lt;code&gt;4.16.0&lt;/code&gt; → &lt;code&gt;^4.11.1&lt;/code&gt; (known compatible)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Should You Use It?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtirvsy6qwh12cptjpji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtirvsy6qwh12cptjpji.png" alt=" " width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You maintain a production React Native app&lt;/li&gt;
&lt;li&gt;You've wasted time debugging version conflicts&lt;/li&gt;
&lt;li&gt;You want safer React Native upgrades&lt;/li&gt;
&lt;li&gt;You work in a team and need consistent dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maybe not if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need bleeding-edge package versions&lt;/li&gt;
&lt;li&gt;You have a simple app with few dependencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Important: Always Review Changes
&lt;/h2&gt;

&lt;p&gt;The tool modifies your &lt;code&gt;package.json&lt;/code&gt; automatically. &lt;strong&gt;Always:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review the diff (&lt;code&gt;git diff package.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Test your app thoroughly&lt;/li&gt;
&lt;li&gt;Check if any downgraded packages break features you need&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;a href="https://microsoft.github.io/rnx-kit/docs/guides/dependency-management" rel="noopener noreferrer"&gt;align-deps Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔄 &lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;React Native Upgrade Helper&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Have you tried these tools? Did they help or cause issues? Drop a comment below!&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Debugging Native Code in React Native: A Step-by-Step Guide (Android &amp; iOS)</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 07 Dec 2025 18:06:21 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/debugging-native-code-in-react-native-a-step-by-step-guide-android-ios-14o3</link>
      <guid>https://dev.to/ajmal_hasan/debugging-native-code-in-react-native-a-step-by-step-guide-android-ios-14o3</guid>
      <description>&lt;p&gt;As React Native developers, we're comfortable with JavaScript debugging—Chrome DevTools, console logs, the usual suspects. But native code? That's where things get intimidating.&lt;/p&gt;

&lt;p&gt;Here's what I learned about debugging Kotlin/Swift code in React Native apps, and why it's not as scary as you think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bother with Native Debugging?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Third-party library crashes&lt;/strong&gt;: That cryptic native error? Step through the actual code to see what's breaking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom native modules&lt;/strong&gt;: Debug your bridge code properly instead of littering it with log statements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt;: JavaScript profiling won't show native rendering bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform-specific bugs&lt;/strong&gt;: That Android 12-only crash? See exactly where and why it fails.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Debugging Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Android Studio (Kotlin/Java)
&lt;/h3&gt;

&lt;p&gt;Android Studio is your IDE for the Android native side. It's built on IntelliJ, so if you've used WebStorm or other JetBrains tools, the interface will feel familiar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key debugging shortcuts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;F8&lt;/code&gt; - Step Over (execute current line, move to next)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F7&lt;/code&gt; - Step Into (dive into function call)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift+F8&lt;/code&gt; - Step Out (finish current function, return to caller)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F9&lt;/code&gt; - Resume (continue until next breakpoint)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+F8&lt;/code&gt; - Toggle breakpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx96zq9dpyxlobj7pz0f5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx96zq9dpyxlobj7pz0f5.png" alt=" " width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzezz69h2kn83cejadmss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzezz69h2kn83cejadmss.png" alt=" " width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Xcode (Swift/Objective-C)
&lt;/h3&gt;

&lt;p&gt;Xcode is Apple's IDE for iOS development. It has powerful debugging tools, though the keyboard shortcuts differ from Android Studio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key debugging shortcuts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;F6&lt;/code&gt; - Step Over&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F7&lt;/code&gt; - Step Into
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F8&lt;/code&gt; - Step Out&lt;/li&gt;
&lt;li&gt;Control button (or &lt;code&gt;Ctrl+Cmd+Y&lt;/code&gt;) - Continue/Resume&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+\&lt;/code&gt; - Toggle breakpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfb9k8vqxsly6clqb6nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfb9k8vqxsly6clqb6nv.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up: My Practice Code
&lt;/h2&gt;

&lt;p&gt;To really learn debugging, I added sample code to both platforms with common patterns you'll encounter. Here's what I created:&lt;/p&gt;

&lt;h3&gt;
  
  
  Android (MainActivity.kt)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;debugBreakpointDemo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;userName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ReactNativeDev"&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;userAge&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isActive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elderberry"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withIndex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Item $index: $item"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;specialItem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Special item found: $specialItem"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Calculation result: $result"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;multiplied&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;multiplied&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  iOS (AppDelegate.swift)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;debugBreakpointDemo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ReactNativeDev"&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;userAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;isActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elderberry"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enumerated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;specialItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uppercased&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Special item found: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;specialItem&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculation result: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;multiplied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;multiplied&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Hands-On: Your First Native Debugging Session
&lt;/h2&gt;

&lt;p&gt;Let me walk you through a practice session. This is how I learned, and it demystified native debugging completely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set Your First Breakpoint
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;android/app/src/main/java/.../MainActivity.kt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find the line &lt;code&gt;val userName = "ReactNativeDev"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the gray gutter area to the left of the line number&lt;/li&gt;
&lt;li&gt;A red dot appears—that's your breakpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Xcode:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;ios/YourApp/AppDelegate.swift&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find the line &lt;code&gt;let userName = "ReactNativeDev"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the gray gutter to the left&lt;/li&gt;
&lt;li&gt;A blue arrow appears—that's your breakpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Run in Debug Mode
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the bug icon 🪲 in the toolbar (or press &lt;code&gt;Shift+F9&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The app launches and immediately pauses at your breakpoint&lt;/li&gt;
&lt;li&gt;The IDE highlights the current line in blue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Cmd+R&lt;/code&gt; or click the Play button&lt;/li&gt;
&lt;li&gt;The app pauses at your breakpoint&lt;/li&gt;
&lt;li&gt;The current line is highlighted with a green overlay&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Explore the Variables Panel
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. Look at the bottom of your IDE.&lt;/p&gt;

&lt;p&gt;You'll see a "Variables" panel showing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;userName = "ReactNativeDev"
userAge = &amp;lt;not initialized yet&amp;gt;
isActive = &amp;lt;not initialized yet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why aren't the others initialized? Because breakpoints pause &lt;em&gt;before&lt;/em&gt; executing the line. The line is about to run but hasn't yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Step Over (F8 or F6)
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;F8&lt;/code&gt; (Android Studio) or &lt;code&gt;F6&lt;/code&gt; (Xcode) a few times. Watch as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;userName&lt;/code&gt; appears in variables&lt;/li&gt;
&lt;li&gt;Next step: &lt;code&gt;userAge&lt;/code&gt; appears
&lt;/li&gt;
&lt;li&gt;Next step: &lt;code&gt;isActive&lt;/code&gt; appears&lt;/li&gt;
&lt;li&gt;The list &lt;code&gt;items&lt;/code&gt; gets created&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You're executing line by line. This is &lt;strong&gt;stepping over&lt;/strong&gt;—you execute the current line and move to the next one without diving into function internals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Step Into a Function (F7)
&lt;/h3&gt;

&lt;p&gt;Keep stepping until you reach the line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now instead of pressing F8/F6, press &lt;strong&gt;F7&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Boom! You're now &lt;em&gt;inside&lt;/em&gt; the &lt;code&gt;performCalculation&lt;/code&gt; function. The IDE jumped you to its definition. This is &lt;strong&gt;stepping into&lt;/strong&gt;—diving into the implementation of a function call.&lt;/p&gt;

&lt;p&gt;Step over a couple of times inside this function. Watch &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;multiplied&lt;/code&gt; appear in the variables panel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Step Out (Shift+F8 or F8)
&lt;/h3&gt;

&lt;p&gt;You've seen enough inside &lt;code&gt;performCalculation&lt;/code&gt;. Press &lt;strong&gt;Shift+F8&lt;/strong&gt; (Android Studio) or &lt;strong&gt;F8&lt;/strong&gt; (Xcode).&lt;/p&gt;

&lt;p&gt;The function completes, and you're back where you called it from. The &lt;code&gt;result&lt;/code&gt; variable now contains the return value (60). This is &lt;strong&gt;stepping out&lt;/strong&gt;—finishing the current function and returning to the caller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Resume Execution (F9 or Continue Button)
&lt;/h3&gt;

&lt;p&gt;Press &lt;strong&gt;F9&lt;/strong&gt; (Android Studio) or click the &lt;strong&gt;Continue button&lt;/strong&gt; (Xcode) to let the app run normally until it hits another breakpoint (or finishes).&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Techniques I Use Daily
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conditional Breakpoints
&lt;/h3&gt;

&lt;p&gt;Right-click a breakpoint and add a condition. For example, only break when &lt;code&gt;index == 2&lt;/code&gt; in a loop. This saved me hours when debugging issues that only occurred on the 100th iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; Right-click breakpoint → More → Condition&lt;br&gt;
&lt;strong&gt;Xcode:&lt;/strong&gt; Right-click breakpoint → Edit Breakpoint → Condition&lt;/p&gt;

&lt;h3&gt;
  
  
  Expression Evaluation
&lt;/h3&gt;

&lt;p&gt;While paused, you can evaluate any expression on the fly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select an expression in code&lt;/li&gt;
&lt;li&gt;Right-click → Evaluate Expression (or &lt;code&gt;Alt+F8&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Try: &lt;code&gt;items.filter { it.startsWith("A") }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the debug console, type: &lt;code&gt;po items.filter { $0.hasPrefix("A") }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;po&lt;/code&gt; means "print object"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Call Stack Navigation
&lt;/h3&gt;

&lt;p&gt;The call stack shows how you got to the current line. Click any frame to jump to that context and see its variables. Invaluable when you're deep in a chain of function calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch Variables
&lt;/h3&gt;

&lt;p&gt;Add variables to your watch list to track them across function calls. They persist even when out of scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; Right-click variable → Add to Watches&lt;br&gt;
&lt;strong&gt;Xcode:&lt;/strong&gt; Right-click variable → Watch "variableName"&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: Debugging a Crash
&lt;/h2&gt;

&lt;p&gt;Last week, my app crashed when users tapped a button. JavaScript logs showed nothing. Here's how native debugging saved me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Android Studio&lt;/strong&gt;: Set breakpoint in &lt;code&gt;onClick&lt;/code&gt; handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run in debug mode&lt;/strong&gt;, tap the button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step through&lt;/strong&gt; the native code&lt;/li&gt;
&lt;li&gt;Found the crash: accessing an ArrayList index that didn't exist&lt;/li&gt;
&lt;li&gt;The issue: JavaScript sent wrong array length to native&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without stepping through with breakpoints, I'd have spent hours adding log statements and rebuilding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips from the Trenches
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start simple&lt;/strong&gt;: Don't try to debug react-native core libraries on day one. Practice with your own simple native code first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use both IDEs&lt;/strong&gt;: I have both Android Studio and Xcode open when working on RN. Debug both platforms regularly—they have different bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combine with JS debugging&lt;/strong&gt;: Use both Chrome DevTools for JS and native debuggers. Some bugs span both layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the call stack&lt;/strong&gt;: When you hit a breakpoint, spend time reading the call stack. Understanding how you got there is as important as where you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't fear native code&lt;/strong&gt;: It's just code. Kotlin and Swift are actually quite pleasant languages. The debugging process is identical to JavaScript debugging, just different tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practice Challenge
&lt;/h2&gt;

&lt;p&gt;Here's what I recommend: spend 30 minutes today just stepping through the sample code I showed above. Don't try to fix anything, just explore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set breakpoints in loops&lt;/li&gt;
&lt;li&gt;Step into and out of functions&lt;/li&gt;
&lt;li&gt;Watch variables change&lt;/li&gt;
&lt;li&gt;Evaluate expressions&lt;/li&gt;
&lt;li&gt;Add conditional breakpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This low-pressure practice builds the muscle memory. When you hit a real bug, you'll know exactly what to do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources That Helped Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/debug" rel="noopener noreferrer"&gt;Android Developer Guide - Debug Your App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/xcode/debugging" rel="noopener noreferrer"&gt;Apple Developer - Debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/docs/debugging#debugging-native-code" rel="noopener noreferrer"&gt;React Native - Native Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Native debugging isn't scary—it's empowering. As React Native developers, we shouldn't fear diving into the native layer. These tools are powerful, learnable, and absolutely essential for professional RN development.&lt;/p&gt;

&lt;p&gt;The difference between a good RN developer and a great one? Great ones are comfortable in all three worlds: JavaScript, Android native, and iOS native.&lt;/p&gt;

&lt;p&gt;Start small, practice deliberately, and soon you'll wonder how you ever developed without native debugging.&lt;/p&gt;

&lt;p&gt;Happy debugging! 🐛🔍&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What native debugging techniques have you found helpful? Share your experiences in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
      <category>android</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How I Reduced My React Native 0.81 APK Size by 50% (Without Breaking Anything)</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Fri, 05 Dec 2025 21:38:01 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-i-reduced-my-react-native-081-apk-size-by-50-without-breaking-anything-e2a</link>
      <guid>https://dev.to/ajmal_hasan/how-i-reduced-my-react-native-081-apk-size-by-50-without-breaking-anything-e2a</guid>
      <description>&lt;p&gt;A large APK size can slow down downloads, increase install drop-offs, and impact user experience — especially in regions with slower internet connections.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through the &lt;strong&gt;exact steps&lt;/strong&gt; I used to reduce a production React Native 0.81 app's APK size by ~50%, while maintaining full functionality and security.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 The Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;~85 MB&lt;/td&gt;
&lt;td&gt;~42 MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~50%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ Step 1: Build Only for arm64-v8a Architecture
&lt;/h2&gt;

&lt;p&gt;Most optimization guides tell you to split APKs by CPU architecture. But here's the thing: &lt;strong&gt;if your minSdkVersion is 29+ (Android 10+), you only need arm64-v8a&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why? Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ All Android 10+ devices support 64-bit (arm64-v8a)&lt;/li&gt;
&lt;li&gt;✅ Google Play Store requires 64-bit support&lt;/li&gt;
&lt;li&gt;✅ 95%+ of active Android devices use arm64-v8a&lt;/li&gt;
&lt;li&gt;❌ armeabi-v7a is for 32-bit devices (pre-2014)&lt;/li&gt;
&lt;li&gt;❌ x86/x86_64 is for Intel devices (&amp;lt;1% market share)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;android/app/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Enable separate builds per CPU architecture
def enableSeparateBuildPerCPUArchitecture = true

android {
    // ... existing config ...

    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // No universal APK needed
            include "arm64-v8a"  // Only modern 64-bit devices
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&amp;gt; 💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Set &lt;code&gt;universalApk false&lt;/code&gt; to skip building a fat universal APK — it's unnecessary when targeting a single architecture.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Step 2: Keep Only Necessary Languages
&lt;/h2&gt;

&lt;p&gt;Your app probably only supports a few languages, but by default, Android bundles resources for &lt;strong&gt;ALL&lt;/strong&gt; languages from your dependencies (like Google Play Services).&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;android/app/build.gradle&lt;/code&gt;, inside &lt;code&gt;defaultConfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaultConfig {
    // ... existing config ...

    // Keep only necessary languages to reduce APK size
    resConfigs "ar", "en", "fr"  // Add your supported languages
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single line can remove &lt;strong&gt;several megabytes&lt;/strong&gt; of unused language resources!&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 3: Enable Resource Shrinking &amp;amp; PNG Compression
&lt;/h2&gt;

&lt;p&gt;Enable these in your release build type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildTypes {
    release {
        signingConfig signingConfigs.release
        debuggable false
        minifyEnabled true          // Code shrinking (already enabled)
        shrinkResources true        // Remove unused resources
        crunchPngs true             // Extra PNG compression
        zipAlignEnabled true        // Memory optimization
        proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What Each Does:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minifyEnabled true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes unused code, obfuscates names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shrinkResources true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes unused drawables, layouts, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crunchPngs true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Additional PNG compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zipAlignEnabled true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optimizes APK for memory-mapped reading&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Step 4: Optimize ProGuard Rules
&lt;/h2&gt;

&lt;p&gt;ProGuard (or R8) is powerful but can break your app if not configured correctly. Here's a comprehensive, battle-tested configuration for React Native 0.81:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;android/app/proguard-rules.pro&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ========== STANDARD OPTIMIZATIONS ==========
-optimizationpasses 3
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontusemixedcaseclassnames
-dontpreverify

# Remove debug logging in production (keeps error logs)
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
}

# Keep crash reporting info
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
-keepattributes Signature, *Annotation*

# ========== REACT NATIVE CORE ==========
-keep class com.facebook.hermes.** { *; }
-keep class com.facebook.hermes.unicode.** { *; }
-keep class com.facebook.react.** { *; }
-keep class com.facebook.jni.** { *; }
-keep class com.facebook.soloader.** { *; }

# Bridge &amp;amp; Native Modules
-keep public class * extends com.facebook.react.bridge.NativeModule { *; }
-keep class com.facebook.react.bridge.** { *; }
-keepclassmembers class * { 
    @com.facebook.react.bridge.ReactMethod *; 
}
-keepclassmembers class * {
    @com.facebook.proguard.annotations.DoNotStrip *;
}

# UI Manager &amp;amp; View System
-keep @com.facebook.react.uimanager.annotations.ReactProp class * { *; }
-keep @com.facebook.react.uimanager.annotations.ReactPropGroup class * { *; }
-keep class * extends com.facebook.react.uimanager.ViewManager { *; }
-keep class com.facebook.react.uimanager.** { *; }

# TurboModules (New Architecture)
-keep class com.facebook.react.turbomodule.** { *; }
-keep class com.facebook.react.animated.** { *; }
-keep class com.facebook.react.common.** { *; }

# ========== COMMON LIBRARIES ==========
# Reanimated
-keep class com.swmansion.reanimated.** { *; }
-keep class com.swmansion.** { *; }
-dontwarn com.swmansion.**

# SVG
-keep public class com.horcrux.svg.** { *; }

# Fast Image
-keep class com.dylanvann.fastimage.** { *; }

# Firebase
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**

# OkHttp
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**### Why This Works:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-optimizationpasses 3&lt;/code&gt;&lt;/strong&gt; — Multiple optimization passes for maximum shrinkage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log removal&lt;/strong&gt; — Strips debug/verbose/info/warning logs (keeps errors for debugging)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-keepattributes SourceFile,LineNumberTable&lt;/code&gt;&lt;/strong&gt; — Preserves stack traces for crash reporting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive &lt;code&gt;-keep&lt;/code&gt; rules&lt;/strong&gt; — Protects all React Native internals and common libraries&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Step 5: Verify Hermes is Enabled
&lt;/h2&gt;

&lt;p&gt;Hermes is React Native's optimised JavaScript engine. It should be enabled by default in RN 0.81, but verify in your &lt;code&gt;android/gradle.properties&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hermesEnabled=true&lt;/code&gt;&lt;br&gt;
Hermes provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Faster app startup&lt;/li&gt;
&lt;li&gt;✅ Smaller JS bundle size&lt;/li&gt;
&lt;li&gt;✅ Lower memory usage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Testing Your Build
&lt;/h2&gt;

&lt;p&gt;After applying all optimisations:&lt;/p&gt;

&lt;h1&gt;
  
  
  Clean previous builds
&lt;/h1&gt;

&lt;p&gt;cd android &amp;amp;&amp;amp; ./gradlew clean&lt;/p&gt;

&lt;h1&gt;
  
  
  Build release APK
&lt;/h1&gt;

&lt;p&gt;./gradlew assembleRelease&lt;/p&gt;

&lt;h1&gt;
  
  
  Check APK size
&lt;/h1&gt;

&lt;p&gt;ls -lh app/build/outputs/apk/&lt;em&gt;/release/&lt;/em&gt;.apk---&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Complete Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Set &lt;code&gt;enableSeparateBuildPerCPUArchitecture = true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Include only &lt;code&gt;arm64-v8a&lt;/code&gt; architecture (if minSdk 29+)&lt;/li&gt;
&lt;li&gt;[ ] Set &lt;code&gt;universalApk false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Add &lt;code&gt;resConfigs&lt;/code&gt; for your supported languages&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;shrinkResources true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;crunchPngs true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;zipAlignEnabled true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Add comprehensive ProGuard rules&lt;/li&gt;
&lt;li&gt;[ ] Verify Hermes is enabled&lt;/li&gt;
&lt;li&gt;[ ] Test on real devices before release!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Optimization&lt;/th&gt;
&lt;th&gt;APK Size Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single architecture (arm64-v8a)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-30-40%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource shrinking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-5-10%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language filtering&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-2-5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProGuard optimizations&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-5-10%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG compression&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-1-3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always test on real devices&lt;/strong&gt; after applying these optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep error logs&lt;/strong&gt; — don't strip &lt;code&gt;Log.e()&lt;/code&gt; for production debugging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Crashlytics still works&lt;/strong&gt; — we preserved &lt;code&gt;SourceFile,LineNumberTable&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Play Store accepts single-architecture APKs&lt;/strong&gt; — they'll deliver the right one to users&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Hope this helps you ship a lighter, faster React Native app! 🚀&lt;/p&gt;

&lt;p&gt;Got questions or improvements? Drop them in the comments! 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this useful? Follow me for more React Native optimization tips!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting Up SonarQube Locally for React Native &amp; MERN Projects</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sat, 08 Nov 2025 16:12:05 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn</link>
      <guid>https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn</guid>
      <description>&lt;p&gt;As a React Native and MERN developer, I recently integrated SonarQube into my local workflow using Docker. Here's a straightforward guide to get you started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvle9x1na5gzl7a5zhke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvle9x1na5gzl7a5zhke.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is SonarQube?
&lt;/h2&gt;

&lt;p&gt;SonarQube automatically scans your code to find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bugs and potential errors&lt;/li&gt;
&lt;li&gt;Security vulnerabilities&lt;/li&gt;
&lt;li&gt;Code smells (maintainability issues)&lt;/li&gt;
&lt;li&gt;Test coverage gaps&lt;/li&gt;
&lt;li&gt;Duplicate code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Install Docker Desktop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open Docker Desktop from Applications and make sure it's running.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Steps (project👨‍💻)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create Docker Compose File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;docker-compose.yml&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonarqube:community&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonarqube-local&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9000:9000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_data:/opt/sonarqube/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_extensions:/opt/sonarqube/extensions&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_logs:/opt/sonarqube/logs&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube-network&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Add Scripts to package.json
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sonar-scanner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose up -d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:down"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose down"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:logs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose logs -f sonarqube"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create SonarQube Configuration
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;sonar-project.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# Project identification
&lt;/span&gt;&lt;span class="py"&gt;sonar.projectKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;my-app&lt;/span&gt;
&lt;span class="py"&gt;sonar.projectName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;My App&lt;/span&gt;
&lt;span class="py"&gt;sonar.projectVersion&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="c"&gt;# Source code location
&lt;/span&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;__tests__&lt;/span&gt;

&lt;span class="c"&gt;# Exclude directories
&lt;/span&gt;&lt;span class="py"&gt;sonar.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/node_modules/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/android/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/ios/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/vendor/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/coverage/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__mocks__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/build/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/assets/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.mjs,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/babel.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/metro.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/jest.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/jest-setup.ts&lt;/span&gt;

&lt;span class="c"&gt;# Test exclusions
&lt;/span&gt;&lt;span class="py"&gt;sonar.test.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/node_modules/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/coverage/**&lt;/span&gt;

&lt;span class="c"&gt;# Language
&lt;/span&gt;&lt;span class="py"&gt;sonar.language&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ts&lt;/span&gt;

&lt;span class="c"&gt;# Encoding
&lt;/span&gt;&lt;span class="py"&gt;sonar.sourceEncoding&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;UTF-8&lt;/span&gt;

&lt;span class="c"&gt;# TypeScript specific
&lt;/span&gt;&lt;span class="py"&gt;sonar.typescript.node&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;

&lt;span class="c"&gt;# Coverage report paths
&lt;/span&gt;&lt;span class="py"&gt;sonar.javascript.lcov.reportPaths&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;coverage/lcov.info&lt;/span&gt;
&lt;span class="py"&gt;sonar.coverage.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__tests__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__mocks__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.tsx&lt;/span&gt;

&lt;span class="c"&gt;# Disable external issues
&lt;/span&gt;&lt;span class="py"&gt;sonar.typescript.internal.typescriptLocation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;node_modules/typescript&lt;/span&gt;

&lt;span class="c"&gt;# Host URL
&lt;/span&gt;&lt;span class="py"&gt;sonar.host.url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;http://localhost:9000&lt;/span&gt;

&lt;span class="c"&gt;# Authentication token (add after generating)
# sonar.login=your-token-here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Update .gitignore
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SonarQube
.scannerwork/
.sonarqube/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Start SonarQube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Docker Desktop first&lt;/span&gt;
open &lt;span class="nt"&gt;-a&lt;/span&gt; Docker

&lt;span class="c"&gt;# Start SonarQube server&lt;/span&gt;
yarn sonar:start

&lt;span class="c"&gt;# Wait 1-2 minutes, then check logs&lt;/span&gt;
yarn sonar:logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Generate Authentication Token
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Login with &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change password when prompted&lt;/li&gt;
&lt;li&gt;Go to Profile Icon → My Account → Security&lt;/li&gt;
&lt;li&gt;Generate token:

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;local-scanner&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type: &lt;code&gt;Global Analysis Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy the token immediately!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a8wj9tpmca19pc6yqu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a8wj9tpmca19pc6yqu2.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Add Token to Configuration
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;sonar-project.properties&lt;/code&gt; and uncomment the last line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.login&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your-generated-token-here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Install &lt;a href="https://www.npmjs.com/package/sonarqube-scanner" rel="noopener noreferrer"&gt;Sonar Scanner&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @sonar/scan
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; @sonar/scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Run Your First Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run tests with coverage&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--coverage&lt;/span&gt;

&lt;span class="c"&gt;# Run SonarQube analysis&lt;/span&gt;
yarn sonar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View results at &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Daily Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start server (if not running)&lt;/span&gt;
yarn sonar:start

&lt;span class="c"&gt;# After making code changes&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--coverage&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn sonar

&lt;span class="c"&gt;# View results at http://localhost:9000&lt;/span&gt;

&lt;span class="c"&gt;# Stop server when done&lt;/span&gt;
yarn sonar:stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configuration for Different Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For Node.js/Express Backend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.test.inclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;**/*.test.js,**/*.spec.js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For React Native:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;__tests__&lt;/span&gt;
&lt;span class="py"&gt;sonar.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;**/android/**,**/ios/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker not running:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open &lt;span class="nt"&gt;-a&lt;/span&gt; Docker
&lt;span class="c"&gt;# Wait 30 seconds, then retry&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Port 9000 in use:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :9000
&lt;span class="c"&gt;# Kill the process or change port in docker-compose.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Authentication error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify token in sonar-project.properties&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;sonar-project.properties | &lt;span class="nb"&gt;grep &lt;/span&gt;sonar.login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Gets Analyzed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code quality issues&lt;/li&gt;
&lt;li&gt;Potential bugs&lt;/li&gt;
&lt;li&gt;Security vulnerabilities
&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Duplicate code&lt;/li&gt;
&lt;li&gt;Complexity metrics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Benefits
&lt;/h2&gt;

&lt;p&gt;✅ Catch bugs before production&lt;br&gt;&lt;br&gt;
✅ Improve code maintainability&lt;br&gt;&lt;br&gt;
✅ Track test coverage&lt;br&gt;&lt;br&gt;
✅ Enforce coding standards&lt;br&gt;&lt;br&gt;
✅ Identify security issues early  &lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn sonar:start   &lt;span class="c"&gt;# Start server&lt;/span&gt;
yarn sonar:stop    &lt;span class="c"&gt;# Stop server&lt;/span&gt;
yarn sonar:down    &lt;span class="c"&gt;# Stop and remove containers&lt;/span&gt;
yarn sonar:logs    &lt;span class="c"&gt;# View logs&lt;/span&gt;
yarn sonar         &lt;span class="c"&gt;# Run analysis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Keep SonarQube running in the background and scan your code regularly to maintain high-quality standards.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.sonarqube.org/" rel="noopener noreferrer"&gt;SonarQube Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>nextjs</category>
      <category>node</category>
    </item>
    <item>
      <title>🧹 How I Freed Up Half My Mac Storage Safely as a React Native Developer</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 19 Oct 2025 16:40:59 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-i-freed-up-half-my-mac-storage-as-a-react-native-developer-8fj</link>
      <guid>https://dev.to/ajmal_hasan/how-i-freed-up-half-my-mac-storage-as-a-react-native-developer-8fj</guid>
      <description>&lt;p&gt;As a React Native developer, I constantly build for both &lt;strong&gt;iOS&lt;/strong&gt; and &lt;strong&gt;Android&lt;/strong&gt;, which means my machine takes a beating from &lt;strong&gt;Xcode, simulators, Gradle builds, node modules, and caches&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recently, I noticed that my 512GB SSD was nearly full — and when I checked, &lt;strong&gt;Xcode alone was consuming over 85 GB&lt;/strong&gt;! 😱&lt;/p&gt;

&lt;p&gt;So, I decided to do a full cleanup.&lt;br&gt;
After running a few terminal commands and deleting unneeded build data, I freed up &lt;strong&gt;half my disk space&lt;/strong&gt;. Here’s what I did 👇&lt;/p&gt;


&lt;h3&gt;
  
  
  💣 The Hidden Storage Hogs
&lt;/h3&gt;
&lt;h4&gt;
  
  
  🧩 1. &lt;strong&gt;Xcode Build Data &amp;amp; Indexes&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;These files rebuild every time you open or compile a project — so it’s completely safe to delete them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/DerivedData
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  📦 2. &lt;strong&gt;Old Archives&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Old &lt;code&gt;.xcarchive&lt;/code&gt; files pile up with every TestFlight or App Store build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/Archives/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  🔍 3. &lt;strong&gt;DeviceSupport Files&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Every time you connect an iPhone or test a new iOS version, Xcode downloads symbol data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/iOS&lt;span class="se"&gt;\ &lt;/span&gt;DeviceSupport/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  📱 4. &lt;strong&gt;Simulator Devices &amp;amp; Cache&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Each simulator keeps its own storage, logs, and app data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/CoreSimulator/Devices/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/CoreSimulator/Caches/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also remove unused runtimes from&lt;br&gt;
&lt;strong&gt;Simulator → Settings → Runtimes&lt;/strong&gt; or&lt;br&gt;
&lt;strong&gt;Window → Devices and Runtimes → Delete unused devices&lt;/strong&gt;.&lt;/p&gt;


&lt;h4&gt;
  
  
  ⚡ 5. &lt;strong&gt;Xcode Cache&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Recreated automatically after you relaunch Xcode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/com.apple.dt.Xcode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ⚙️ React Native &amp;amp; Node Cleanup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🌀 6. &lt;strong&gt;Metro &amp;amp; Watchman Caches&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watchman watch-del-all 2&amp;gt;/dev/null
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/metro&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Metro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  📦 7. &lt;strong&gt;npm / yarn / pnpm Cache&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm cache clean &lt;span class="nt"&gt;--force&lt;/span&gt;
yarn cache clean
pnpm store prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  💡 8. &lt;strong&gt;Project &lt;code&gt;node_modules&lt;/code&gt; (Optional)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🍫 CocoaPods (for iOS builds)
&lt;/h3&gt;

&lt;p&gt;Caches dependencies that can be safely redownloaded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/CocoaPods
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.cocoapods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🤖 Android / Java Cleanup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ⚙️ 9. &lt;strong&gt;Gradle Caches &amp;amp; Build Artifacts&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.gradle/caches
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.gradle/daemon
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.android/build-cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete unused &lt;strong&gt;AVDs (emulators)&lt;/strong&gt; from&lt;br&gt;
&lt;strong&gt;Android Studio → Device Manager&lt;/strong&gt;&lt;br&gt;
and unused &lt;strong&gt;system images&lt;/strong&gt; via &lt;strong&gt;SDK Manager&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧰 10. &lt;strong&gt;Other Optional Cleanups&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Homebrew cleanup&lt;/span&gt;
brew cleanup &lt;span class="nt"&gt;-s&lt;/span&gt;

&lt;span class="c"&gt;# CocoaPods Specs repo&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.cocoapods/repos

&lt;span class="c"&gt;# Xcode docs&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Shared/Documentation/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧩 Project-Level Cleanup Command (Run on projects that you are not working on)
&lt;/h2&gt;

&lt;p&gt;For day-to-day development cleanup, I also added this handy script inside my &lt;strong&gt;package.json&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cleanBuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rm -rf .jso node_modules Gemfile.lock &amp;amp;&amp;amp; cd ios &amp;amp;&amp;amp; rm -rf build Pods .xcode.env.local Podfile.lock &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; cd android &amp;amp;&amp;amp; rm -rf build .gradle &amp;amp;&amp;amp; cd app &amp;amp;&amp;amp; rm -rf development build .cxx &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; cd .."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run cleanBuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn cleanBuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to completely wipe build artifacts for both iOS and Android.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ The Results
&lt;/h3&gt;

&lt;p&gt;After deleting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DerivedData (85+ GB)&lt;/li&gt;
&lt;li&gt;Old simulator data (10+ GB)&lt;/li&gt;
&lt;li&gt;CocoaPods and Gradle caches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My system went from &lt;strong&gt;almost full to over 50% free space&lt;/strong&gt;.&lt;br&gt;
Xcode now opens faster, simulators load instantly, and builds are cleaner.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 Pro Tip: Automate It
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;clean-dev-space.sh&lt;/code&gt; and add all the commands above.&lt;br&gt;
Then simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash clean-dev-space.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;If you’re a React Native developer juggling iOS and Android, your Mac silently collects &lt;strong&gt;tens of gigabytes of temporary build data&lt;/strong&gt; every month.&lt;br&gt;
Cleaning up regularly not only saves space but also improves build speed and performance.&lt;/p&gt;

&lt;p&gt;I freed up half my storage with a few terminal commands — and now my Mac feels brand new again. ✨&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
      <category>android</category>
      <category>mac</category>
    </item>
    <item>
      <title>React Native ESLint 9 Setup: Complete Guide with VSCode Integration, Husky Pre-commit Hooks, Prettier, and CI/CD</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Wed, 24 Sep 2025 20:06:11 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/eslint-prettier-setup-for-latest-react-native-with-typescript-17do</link>
      <guid>https://dev.to/ajmal_hasan/eslint-prettier-setup-for-latest-react-native-with-typescript-17do</guid>
      <description>&lt;h2&gt;
  
  
  📦 Install All Dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Core ESLint dependencies&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint @eslint/js globals typescript-eslint

&lt;span class="c"&gt;# React and React Native plugins&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-native

&lt;span class="c"&gt;# Prettier integration&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; prettier eslint-config-prettier

&lt;span class="c"&gt;# Husky and lint-staged for pre-commit hooks&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; husky lint-staged

&lt;span class="c"&gt;# Additional helpful tools&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ File Creation (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create ESLint Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;eslint.config.mjs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@eslint/js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;globals&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tseslint&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReact&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReactHooks&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReactNative&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;android/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ios/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;tseslint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;pluginReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__DEV__&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;ecmaVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pluginReactHooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pluginReactNative&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// React Native&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-unused-styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/split-platform-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-inline-styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-color-literals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-single-element-style-arrays&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// React Hooks&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks/rules-of-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks/exhaustive-deps&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Disabled for ESLint 9 compatibility&lt;/span&gt;

      &lt;span class="c1"&gt;// React&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/react-in-jsx-scope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/prop-types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/display-name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// General&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-debugger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-unused-vars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prefer-const&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-var&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-duplicate-imports&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;max-lines&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;skipBlankLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;react&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;detect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create Prettier Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.prettierrc.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;semi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;printWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;bracketSpacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;arrowParens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avoid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create Prettier Ignore
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.prettierignore&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
android
ios
build
dist
coverage
*.snap
*.md
*.json
*.lock
*.log
.DS_Store
eslint.config.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Update Package.json Scripts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Add to &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:fix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --max-warnings 0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --check ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write . &amp;amp;&amp;amp; eslint . --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"husky install"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*.{js,jsx,ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"eslint --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Setup Husky Pre-commit Hooks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize husky&lt;/span&gt;
yarn prepare

&lt;span class="c"&gt;# Add pre-commit hook&lt;/span&gt;
npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npx lint-staged"&lt;/span&gt;

&lt;span class="c"&gt;# Add pre-push hook (optional)&lt;/span&gt;
npx husky add .husky/pre-push &lt;span class="s2"&gt;"yarn lint:check"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Create VSCode Settings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.vscode/settings.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.codeActionsOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source.fixAll.eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"explicit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source.organizeImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"explicit"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eslint.validate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"javascript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"javascriptreact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"typescriptreact"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eslint.workingDirectories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.preferences.organizeImportsIgnoreCase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.preferences.includePackageJsonAutoImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Create VSCode Extensions Recommendations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.vscode/extensions.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-next"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"bradlc.vscode-tailwindcss"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Create GitHub Actions Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.github/workflows/lint.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Code Quality&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yarn'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn install --frozen-lockfile&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn lint:check&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn prettier:check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚡ Quick Setup Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install everything&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint @eslint/js globals typescript-eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-native prettier eslint-config-prettier husky lint-staged @types/node

&lt;span class="c"&gt;# 2. Initialize husky&lt;/span&gt;
yarn prepare

&lt;span class="c"&gt;# 3. Setup pre-commit hooks&lt;/span&gt;
npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npx lint-staged"&lt;/span&gt;
npx husky add .husky/pre-push &lt;span class="s2"&gt;"yarn lint:check"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Run initial format&lt;/span&gt;
yarn format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 VSCode Integration Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-fix on save&lt;/strong&gt;: ESLint fixes applied automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format on save&lt;/strong&gt;: Prettier formatting on file save&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import organization&lt;/strong&gt;: Auto-organize imports on save&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time linting&lt;/strong&gt;: Inline error/warning indicators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick fixes&lt;/strong&gt;: Ctrl/Cmd+. for fix suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📋 Essential VSCode Extensions
&lt;/h2&gt;

&lt;p&gt;Install these extensions for full functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; (dbaeumer.vscode-eslint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier&lt;/strong&gt; (esbenp.prettier-vscode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript Importer&lt;/strong&gt; (pmneo.tsimporter)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lint all files&lt;/strong&gt;: &lt;code&gt;yarn lint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix auto-fixable issues&lt;/strong&gt;: &lt;code&gt;yarn lint:fix&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for any issues&lt;/strong&gt;: &lt;code&gt;yarn lint:check&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format all files&lt;/strong&gt;: &lt;code&gt;yarn prettier&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format and fix&lt;/strong&gt;: &lt;code&gt;yarn format&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ Known Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-hooks/exhaustive-deps&lt;/code&gt; disabled due to ESLint 9 compatibility&lt;/li&gt;
&lt;li&gt;Will be re-enabled when plugin updates for ESLint 9&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Post-Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Delete any old &lt;code&gt;.eslintrc.*&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Restart VSCode for settings to take effect&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;yarn format&lt;/code&gt; to format existing code&lt;/li&gt;
&lt;li&gt;Commit changes to trigger pre-commit hooks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This setup provides a complete, production-ready linting environment with VSCode integration and automated quality checks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Additionally integrate SonarQube for code report:&lt;br&gt;
&lt;a href="https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn"&gt;https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>reactnative</category>
      <category>performance</category>
    </item>
    <item>
      <title>☁️📲 React Native OTA Updates: AWS-Powered Hot Updates with S3 &amp; Lambda@Edge</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Fri, 13 Jun 2025 10:47:36 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/complete-guide-ota-setting-up-hot-updater-with-aws-s3-and-lambdaedge-for-react-native-11mb</link>
      <guid>https://dev.to/ajmal_hasan/complete-guide-ota-setting-up-hot-updater-with-aws-s3-and-lambdaedge-for-react-native-11mb</guid>
      <description>&lt;h1&gt;
  
  
  Build Lightning-Fast Over-the-Air Updates for Your Mobile App
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gronxb.github.io/hot-updater/guide/getting-started/introduction.html" rel="noopener noreferrer"&gt;Hot Updater&lt;/a&gt; is a powerful alternative to react-native-codepush that provides self-hostable Over-The-Air (OTA) update capabilities for React Native applications. Unlike traditional app store updates, Hot Updater allows you to instantly update your JavaScript bundle, enabling rapid deployment of bug fixes and feature updates without waiting for app store approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose Hot Updater?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-Hosting&lt;/strong&gt;: Maintain complete control over your update infrastructure and data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Platform Support&lt;/strong&gt;: Seamless compatibility with both iOS and Android platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive Web Console&lt;/strong&gt;: User-friendly interface for managing and monitoring updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust Version Control&lt;/strong&gt;: Advanced app versioning with semantic versioning support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced Updates&lt;/strong&gt;: Push critical security updates when immediate deployment is necessary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Deployment&lt;/strong&gt;: Support for multiple environments and channels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this comprehensive guide, we'll walk through setting up Hot Updater using the &lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html" rel="noopener noreferrer"&gt;AWS S3 Storage + Lambda@Edge Function provider&lt;/a&gt; for storing React Native bundles in the cloud. &lt;strong&gt;Hot Updater supports multiple providers as shown below&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntdlm02z6z7s54by8uxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntdlm02z6z7s54by8uxw.png" alt="Hot Updater Architecture" width="626" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before beginning the setup process, ensure you have the following requirements met:&lt;/p&gt;

&lt;h3&gt;
  
  
  System Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;: Version 20 or later (recommended for optimal performance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Native Development Environment&lt;/strong&gt;: Properly configured for your target platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AWS Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Account&lt;/strong&gt;: Sign up at &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt; if you don't have an existing account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CLI&lt;/strong&gt;: Install the &lt;a href="https://formulae.brew.sh/formula/awscli" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt; and configure your credentials with appropriate permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Additional Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package Manager&lt;/strong&gt;: Yarn or npm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Editor&lt;/strong&gt;: VS Code or your preferred IDE&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Setup Guide
&lt;/h2&gt;




&lt;h3&gt;
  
  
  Phase 1: AWS Configuration
&lt;/h3&gt;

&lt;p&gt;For detailed AWS setup, you can follow either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video Tutorial&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/getting-started/init-aws.mov" rel="noopener noreferrer"&gt;Step-by-step configuration video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Written Guide&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#step-2-configure-aws" rel="noopener noreferrer"&gt;AWS provider documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Configuration Screenshots Reference
&lt;/h4&gt;

&lt;p&gt;The following screenshots demonstrate the AWS setup process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkbveryl8o542b09t8v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkbveryl8o542b09t8v4.png" alt="AWS Setup Step 1" width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffksxyb3pdyyz5k5ejeo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffksxyb3pdyyz5k5ejeo3.png" alt="AWS Setup Step 2" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7ty2bwcv0gep1gdo0ly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7ty2bwcv0gep1gdo0ly.png" alt="AWS Setup Step 3" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qe6mkqhomufd7po01fk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qe6mkqhomufd7po01fk.png" alt="AWS Setup Step 4" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznbis276dhrbs2wcxfff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznbis276dhrbs2wcxfff.png" alt="AWS Setup Step 5" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftp11b1rx00lmwzjhg0cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftp11b1rx00lmwzjhg0cv.png" alt="AWS Setup Step 6" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmw5olpwofhad21debnq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmw5olpwofhad21debnq.png" alt="AWS Setup Step 7" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq1fjezin002fjpfri6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq1fjezin002fjpfri6z.png" alt="AWS Setup Step 8" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lqn0il7ozzat6or04b6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lqn0il7ozzat6or04b6.png" alt="AWS Setup Step 9" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluuyecnkbbptbns06p7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluuyecnkbbptbns06p7g.png" alt="AWS Setup Step 10" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmt88sktjw73sy2w5e9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmt88sktjw73sy2w5e9r.png" alt="AWS Setup Step 11" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jpe8t5y2joy2ul4j3u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jpe8t5y2joy2ul4j3u0.png" alt="AWS Setup Step 12" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlmbcylq310al2vgf69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlmbcylq310al2vgf69.png" alt="AWS Setup Step 13" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvepcmq8s1f6fbsssmq91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvepcmq8s1f6fbsssmq91.png" alt="Image description" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 2: Configuration Files Generation
&lt;/h3&gt;

&lt;p&gt;Once the AWS setup is complete, the system will automatically generate essential configuration files:&lt;/p&gt;

&lt;h4&gt;
  
  
  Generated Files
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.env&lt;/code&gt; file&lt;/strong&gt;: Contains AWS credentials and configuration keys (&lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#step-2-configure-aws" rel="noopener noreferrer"&gt;reference&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;hot-updater.config.ts&lt;/code&gt;&lt;/strong&gt;: Main configuration file (&lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#step-3-generated-configurations" rel="noopener noreferrer"&gt;reference&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important Note&lt;/strong&gt;: Keep the automatically generated code intact, even when using dotenv. This applies even if you're using react-native-config for &lt;a href="https://dev.to/ajmal_hasan/react-native-multi-environment-setup-app-icon-app-name-googleservicejson-in-android-hf3"&gt;multiple scheme or flavoring&lt;/a&gt; setups.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvyewvpj5uwwpwq3d8s8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvyewvpj5uwwpwq3d8s8.png" alt="AWS Setup Step 15" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldvwinsuxukm2w4o81lz.png" alt="Image description" width="800" height="168"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 3: Project Integration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Add Required Plugins
&lt;/h4&gt;

&lt;p&gt;Follow the official documentation to add necessary plugins to your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#step-5-add-babel--repack--expo-plugin-to-your-project" rel="noopener noreferrer"&gt;Babel, Repack, and Expo Plugin Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 2: Native Code Integration
&lt;/h4&gt;

&lt;p&gt;Integrate native code components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#step-7-add-native-code" rel="noopener noreferrer"&gt;Native Code Setup Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 3: Verification (Optional)
&lt;/h4&gt;

&lt;p&gt;If you want to verify your setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gronxb.github.io/hot-updater/guide/providers/3_aws-s3-lambda-edge.html#verifying-the-setup" rel="noopener noreferrer"&gt;Verification Steps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Phase 4: Fingerprint Configuration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Create Fingerprint File
&lt;/h4&gt;

&lt;p&gt;In your project's root directory, create a &lt;code&gt;fingerprint.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"android"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Install Dependencies
&lt;/h4&gt;

&lt;p&gt;Run the following commands to install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;ios &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pod &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 5: App Integration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Wrap Your App Component
&lt;/h4&gt;

&lt;p&gt;Modify your &lt;code&gt;App.tsx&lt;/code&gt; file according to the &lt;a href="https://gronxb.github.io/hot-updater/guide/hot-updater/wrap.html" rel="noopener noreferrer"&gt;official wrapping guide&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getUpdateSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HotUpdater&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@hot-updater/react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;teal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Change to "pink" for testing&lt;/span&gt;
        &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-- 555&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;__DEV__&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Development Mode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Release Mode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Fingerprint: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFingerprintHash&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Channel: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getChannel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;App Version: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAppVersion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Bundle Id: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBundleId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Min Bundle Id: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMinBundleId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;HotUpdater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;getUpdateSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://do1f2fjq14bee.cloudfront.net/api/check-update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;updateStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fingerprint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// or "appVersion"&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;requestHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Add custom request headers if needed&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;fallbackComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rgba(0, 0, 0, 0.5)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* You can add a splash image here for better UX */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATING&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Updating...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Checking for Update...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;%
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl4y0mj2hgp04fvvvr02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl4y0mj2hgp04fvvvr02.png" alt="Image description" width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Single Environment Setup&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you're not using multiple environments, you can proceed directly with these steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Build and Deploy Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Release Build&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/simulator-test.html" rel="noopener noreferrer"&gt;Simulator Testing Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Fingerprint Hash&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/update-strategy/1_fingerprint.html#managing-and-updating-fingerprints" rel="noopener noreferrer"&gt;Fingerprint Management&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy Updates&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/deploy.html" rel="noopener noreferrer"&gt;Deployment Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Updates&lt;/strong&gt;: &lt;a href="https://gronxb.github.io/hot-updater/guide/console.html" rel="noopener noreferrer"&gt;Console Management&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Multiple Environment Setup&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For projects requiring &lt;a href="https://dev.to/ajmal_hasan/react-native-multi-environment-setup-app-icon-app-name-googleservicejson-in-android-hf3"&gt;multiple environments&lt;/a&gt; (development, staging, production), follow these additional configurations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak7jo8uzexbfe9m8mkbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak7jo8uzexbfe9m8mkbg.png" alt="Multiple Environment Setup" width="486" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Package.json Scripts Configuration
&lt;/h3&gt;

&lt;p&gt;Add the following scripts to your &lt;code&gt;package.json&lt;/code&gt; for streamlined environment management:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"setDevelopment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ENVFILE=.env.development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"setStaging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ENVFILE=.env.staging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"setProduction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ENVFILE=.env.production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"aos:dev-release"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn setDevelopment &amp;amp;&amp;amp; react-native run-android --mode=developmentrelease"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aos:prod-release"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn setProduction &amp;amp;&amp;amp; react-native run-android --mode=productionrelease"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"hot-updater-console"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn hot-updater console"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"check_fingerprint_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn hot-updater fingerprint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fingerprint_update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn hot-updater fingerprint create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"channel_update_production"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn hot-updater channel set production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"channel_update_development"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn hot-updater channel set development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"update_ios_dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn installAll &amp;amp;&amp;amp; yarn setDevelopment &amp;amp;&amp;amp; npx hot-updater deploy -p ios -c development -f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"update_ios_prod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn installAll &amp;amp;&amp;amp; yarn setProduction &amp;amp;&amp;amp; npx hot-updater deploy -p ios -c production -f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"update_android_dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn channel_update_development &amp;amp;&amp;amp; yarn setDevelopment &amp;amp;&amp;amp; npx hot-updater deploy -p android -c development -f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"update_android_prod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn channel_update_production &amp;amp;&amp;amp; yarn setProduction &amp;amp;&amp;amp; npx hot-updater deploy -p android -c production -f"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Script Parameters Explanation
&lt;/h3&gt;

&lt;p&gt;For detailed understanding of deployment parameters (-p, -c, -f, etc.), refer to the &lt;a href="https://gronxb.github.io/hot-updater/guide/deploy.html" rel="noopener noreferrer"&gt;deployment documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment Process (to deploy new changes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running Deploy Commands
&lt;/h3&gt;

&lt;p&gt;When executing deploy commands, you should see output similar to this:&lt;/p&gt;

&lt;p&gt;First &lt;strong&gt;set channel&lt;/strong&gt; as per particular env(if using), then run &lt;strong&gt;deploy command&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn channel_update_production &amp;amp;&amp;amp; yarn update_android_prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6vzdd1s3k6chz4eit2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6vzdd1s3k6chz4eit2u.png" alt="Deploy Command Output" width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Another Update Strategy (Note: we are using &lt;a href="https://gronxb.github.io/hot-updater/guide/update-strategy/1_fingerprint.html#fingerprint-update-strategy" rel="noopener noreferrer"&gt;Fingerprint&lt;/a&gt;):
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://gronxb.github.io/hot-updater/guide/update-strategy/2_app-version.html" rel="noopener noreferrer"&gt;"App Version"&lt;/a&gt; update strategy in hot-updater allows you to target specific native app versions when deploying updates. Unlike the fingerprint strategy, which compares hash values to check for native code changes, this strategy applies updates only to the app version specified with the -t (or --target-app-version) option during the hot-updater deploy command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshooting &lt;a href="https://gronxb.github.io/hot-updater/guide/update-strategy/1_fingerprint.html#managing-and-updating-fingerprints" rel="noopener noreferrer"&gt;Fingerprint&lt;/a&gt; Issues
&lt;/h3&gt;

&lt;p&gt;If you encounter a fingerprint error like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;■ Fingerprint mismatch. 'hot-updater fingerprint create' to update fingerprint.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Run the fingerprint update command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn fingerprint_update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AWS S3 Verification
&lt;/h3&gt;

&lt;p&gt;After successful deployment, your AWS S3 bucket should contain the deployed bundles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frq7bucx47453u5eco3n6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frq7bucx47453u5eco3n6.png" alt="AWS S3 Bundle Storage" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Management Console
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Accessing the Console
&lt;/h3&gt;

&lt;p&gt;Launch the management console using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn hot-updater-console
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The console provides a comprehensive interface for managing your deployments:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1un7n0o8pfzibo2smqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1un7n0o8pfzibo2smqo.png" alt="Image description" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0474oty3yz0ubo2mfn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0474oty3yz0ubo2mfn8.png" alt="Image description" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Console Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Management&lt;/strong&gt;: Deploy, rollback, and delete updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Control&lt;/strong&gt;: Track all deployed versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel Management&lt;/strong&gt;: Manage different deployment channels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt;: Monitor update adoption and performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues and Solutions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Updates Not Appearing in Release Build
&lt;/h4&gt;

&lt;p&gt;If updates aren't showing in your release build, verify that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Channel Configuration&lt;/strong&gt;: Ensure the channel is correctly set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash Verification&lt;/strong&gt;: Confirm the fingerprint hash matches between deployment and app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Connectivity&lt;/strong&gt;: Check internet connection and CloudFront distribution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;: &lt;a href="https://github.com/gronxb/hot-updater/issues/417" rel="noopener noreferrer"&gt;GitHub Issue #417&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fingerprint Mismatch Errors
&lt;/h4&gt;

&lt;p&gt;This typically occurs when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App fingerprint doesn't match deployed bundle fingerprint&lt;/li&gt;
&lt;li&gt;Multiple environments are using conflicting fingerprints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Update fingerprints using the provided scripts.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS Permissions Issues
&lt;/h4&gt;

&lt;p&gt;Ensure your AWS credentials have the necessary permissions for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3 bucket operations&lt;/li&gt;
&lt;li&gt;CloudFront distribution management&lt;/li&gt;
&lt;li&gt;Lambda@Edge function deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security Considerations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Credential Management&lt;/strong&gt;: Store AWS credentials securely using environment variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Control&lt;/strong&gt;: Implement proper IAM policies for restricted access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS Enforcement&lt;/strong&gt;: Always use HTTPS for update endpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Performance Optimization
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bundle Size&lt;/strong&gt;: Keep JavaScript bundles as small as possible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching Strategy&lt;/strong&gt;: Leverage CloudFront caching for improved performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental Updates&lt;/strong&gt;: Use fingerprint strategy for efficient updates&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Monitoring and Maintenance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regular Monitoring&lt;/strong&gt;: Check console regularly for update adoption rates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rollback Strategy&lt;/strong&gt;: Always have a rollback plan for critical updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Thoroughly test updates in staging environments before production deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hot Updater with AWS S3 and Lambda@Edge provides a robust, scalable solution for React Native OTA updates. This setup gives you complete control over your update infrastructure while maintaining the flexibility to support multiple environments and deployment strategies.&lt;/p&gt;

&lt;p&gt;The self-hosted approach ensures data privacy and eliminates dependency on third-party services, making it an excellent choice for enterprise applications or projects with specific compliance requirements.&lt;/p&gt;

&lt;p&gt;By following this comprehensive guide, you should have a fully functional Hot Updater setup that enables rapid deployment of JavaScript bundle updates without going through traditional app store approval processes.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>Using react-native-vector-icons in React Native</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 04 May 2025 15:08:01 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/using-react-native-vector-icons-in-react-native-1bem</link>
      <guid>https://dev.to/ajmal_hasan/using-react-native-vector-icons-in-react-native-1bem</guid>
      <description>&lt;p&gt;&lt;code&gt;react-native-vector-icons&lt;/code&gt; is a library that lets you integrate a variety of icons into your React Native app, improving design and user experience. It supports popular icon sets like FontAwesome, Material Icons, and Ionicons. Explore available icons &lt;a href="https://oblador.github.io/react-native-vector-icons/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Install the Library
&lt;/h3&gt;

&lt;p&gt;Install via npm or Yarn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-native-vector-icons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add react-native-vector-icons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Available Icon Sets
&lt;/h4&gt;

&lt;p&gt;Icon libraries available include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AntDesign&lt;/strong&gt; (298 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entypo&lt;/strong&gt; (411 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EvilIcons&lt;/strong&gt; (70 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feather&lt;/strong&gt; (286 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FontAwesome 5&lt;/strong&gt; (1,598 free icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ionicons&lt;/strong&gt; (1,338 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MaterialIcons&lt;/strong&gt; (2,189 icons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MaterialCommunityIcons&lt;/strong&gt; (6,596 icons)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore other sets &lt;a href="https://oblador.github.io/react-native-vector-icons/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Configure Fonts
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Android Setup
&lt;/h4&gt;

&lt;p&gt;In &lt;code&gt;android/app/build.gradle&lt;/code&gt;, add the fonts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;react&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vectoricons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
      &lt;span class="nl"&gt;iconFontNames:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'MaterialCommunityIcons.ttf'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'FontAwesome.ttf'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'AntDesign.ttf'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"../../node_modules/react-native-vector-icons/fonts.gradle"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  iOS Setup
&lt;/h4&gt;

&lt;p&gt;In &lt;code&gt;Info.plist&lt;/code&gt;, add the fonts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;UIAppFonts&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;MaterialCommunityIcons.ttf&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;FontAwesome.ttf&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;AntDesign.ttf&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, in &lt;code&gt;react-native.config.js&lt;/code&gt;, disable iOS auto-linking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-vector-icons&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx react-native-asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Use Icons in Your Components
&lt;/h3&gt;

&lt;p&gt;Import and use icons like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Icon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-vector-icons/MaterialCommunityIcons&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#900&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can replace &lt;code&gt;MaterialCommunityIcons&lt;/code&gt; with other icon sets as needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By integrating &lt;code&gt;react-native-vector-icons&lt;/code&gt;, you can enhance your app with a wide range of high-quality icons. The setup process is simple and involves configuring a few files for Android and iOS.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
