<?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: HASAN GÖNEN</title>
    <description>The latest articles on DEV Community by HASAN GÖNEN (@hasangonen91).</description>
    <link>https://dev.to/hasangonen91</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%2F764236%2F29e119d1-af1d-477e-8788-bc00cd4365a5.jpg</url>
      <title>DEV Community: HASAN GÖNEN</title>
      <link>https://dev.to/hasangonen91</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hasangonen91"/>
    <language>en</language>
    <item>
      <title>I Built Expo Go for Bare React Native — Wireless Install via QR</title>
      <dc:creator>HASAN GÖNEN</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:47:59 +0000</pubDate>
      <link>https://dev.to/hasangonen91/i-built-expo-go-for-bare-react-native-wireless-install-via-qr-5gin</link>
      <guid>https://dev.to/hasangonen91/i-built-expo-go-for-bare-react-native-wireless-install-via-qr-5gin</guid>
      <description>&lt;h1&gt;
  
  
  I Built Expo Go for Bare React Native — No Cables, No Expo Account, Just QR
&lt;/h1&gt;

&lt;p&gt;If you use bare React Native CLI with custom native modules, you know the pain: USB cables, manual IP configuration, &lt;code&gt;adb reverse&lt;/code&gt;, shaking your phone to set debug host...&lt;/p&gt;

&lt;p&gt;Meanwhile, Expo Go users just scan a QR code and they're running.&lt;/p&gt;

&lt;p&gt;I wanted that same experience — but for projects with custom native code. So I built &lt;strong&gt;Starship&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time you want to test on a physical Android device with bare React Native:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plug in USB cable&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;adb reverse tcp:8081 tcp:8081&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build APK&lt;/li&gt;
&lt;li&gt;Install APK&lt;/li&gt;
&lt;li&gt;Open app → "Unable to load script"&lt;/li&gt;
&lt;li&gt;Shake phone → Settings → Type your IP manually&lt;/li&gt;
&lt;li&gt;Shake → Reload&lt;/li&gt;
&lt;li&gt;Repeat when your IP changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With Expo Go, you just scan a QR code. But Expo Go doesn't support custom native modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;One command. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds your debug APK with your local IP &lt;strong&gt;embedded&lt;/strong&gt; (no manual setup)&lt;/li&gt;
&lt;li&gt;Shows a QR code in terminal&lt;/li&gt;
&lt;li&gt;You scan with your phone camera&lt;/li&gt;
&lt;li&gt;Phone downloads APK, installs it, app opens&lt;/li&gt;
&lt;li&gt;App &lt;strong&gt;auto-connects to Metro&lt;/strong&gt; — Fast Refresh works immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No USB. No IP typing. No shake-settings-reload dance.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Expo Go&lt;/th&gt;
&lt;th&gt;RN CLI&lt;/th&gt;
&lt;th&gt;Starship&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom native modules&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wireless install (QR)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero config&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No USB needed&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-device deploy&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build caching&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Features That Save Real Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;APK Caching&lt;/strong&gt; — First build takes ~60 seconds. After that, if you only changed JavaScript, it skips the native build entirely. Instant restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Device&lt;/strong&gt; — Have 3 test phones? They all get the APK at once. &lt;code&gt;adb reverse&lt;/code&gt; runs on all of them automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device Identification&lt;/strong&gt; — Terminal shows which device connected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📱 Xiaomi Mi 9 SE (Android 11) connected — app is running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Build Time Tracking&lt;/strong&gt; — Shows how long each build took and compares with previous builds. You know instantly if something slowed down your native build.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Auto-Connect Works
&lt;/h2&gt;

&lt;p&gt;The biggest pain point with bare RN is the "Unable to load script" screen. The app doesn't know where Metro is running.&lt;/p&gt;

&lt;p&gt;Starship solves this by injecting a tiny &lt;code&gt;ContentProvider&lt;/code&gt; at build time that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Writes your computer's IP to SharedPreferences on first app launch&lt;/li&gt;
&lt;li&gt;React Native reads this and connects to Metro automatically&lt;/li&gt;
&lt;li&gt;The ContentProvider only exists in debug builds (runtime safety check included)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Release builds are never affected. Google Play would reject a &lt;code&gt;debuggable=true&lt;/code&gt; APK anyway.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;starship build apk/aab/ipa&lt;/code&gt; — Store-ready builds&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;starship --tunnel&lt;/code&gt; — Access from outside your local network&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;starship update&lt;/code&gt; — OTA updates (free CodePush alternative)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;starship doctor&lt;/code&gt; — Environment diagnostics&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Works with any bare React Native CLI project. Single dependency. Zero config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hasangonen91/react-native-starship" rel="noopener noreferrer"&gt;https://github.com/hasangonen91/react-native-starship&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/react-native-starship" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/react-native-starship&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/hasangonen91/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/hasangonen91/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've been stuck with USB cables and manual IP config, give it a try. It takes 30 seconds to install and the first build is the only slow one — after that it's instant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>reactnative</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
