<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sussana Teye]]></title><description><![CDATA[Sussana Teye]]></description><link>https://sussanateye.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aa6c1e303fb3ec9beecce1d/f4ec7bd1-263a-4191-8c32-bb93d7cf1462.jpg</url><title>Sussana Teye</title><link>https://sussanateye.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 09:33:03 GMT</lastBuildDate><atom:link href="https://sussanateye.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I'm a Web Developer. Building My First Mobile App With AI Nearly Broke My Brain.]]></title><description><![CDATA[Three weeks into building my first mobile app, I was staring at a crashed Expo Go session for the fourth time that hour, scrolling through a wall of terminal errors that made no sense, thinking: I kno]]></description><link>https://sussanateye.hashnode.dev/i-m-a-web-developer-building-my-first-mobile-app-with-ai-nearly-broke-my-brain</link><guid isPermaLink="true">https://sussanateye.hashnode.dev/i-m-a-web-developer-building-my-first-mobile-app-with-ai-nearly-broke-my-brain</guid><category><![CDATA[React Native]]></category><category><![CDATA[AI]]></category><category><![CDATA[Expo]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Sussana]]></dc:creator><pubDate>Thu, 17 Sep 2026 07:26:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aa6c1e303fb3ec9beecce1d/795c3481-5260-4bcd-87f4-55619994ced3.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Three weeks into building my first mobile app, I was staring at a crashed Expo Go session for the fourth time that hour, scrolling through a wall of terminal errors that made no sense, thinking: <em>I know how to code.</em> This was supposed to be the easy part.</p>
<p>It wasn't. And it wasn't just one bug...it was a string of them, each one quietly teaching me something I didn't know I didn't know.</p>
<h2><strong>The Bug That Wasn't a Bug</strong></h2>
<img src="https://cdn.hashnode.com/uploads/covers/6aa6c1e303fb3ec9beecce1d/5adfacb1-cea4-4a04-ae6c-5c6fd1995c67.png" alt="" style="display:block;margin:0 auto" />

<p>The first real wall was a photo picker. A user taps "choose from library," picks a photo, and… nothing. No error, no crash; just silence. I waited four minutes before giving up and backing out, which triggered an alert saying I'd "cancelled." I hadn't cancelled anything. I'd waited.</p>
<blockquote>
<p>That single distinction ( cancelled vs. hung) turned out to matter a lot. My first instinct was to assume it was a permissions issue, since that's the obvious web-dev-brain answer: something's being denied, check the permissions. Wrong guess. The real cause was <em><strong>allowsEditing</strong></em>: true a native crop screen that, in Expo Go specifically, doesn't reliably hand control back to the JavaScript side after you confirm. The picker wasn't broken. It was just waiting, forever, for a handoff that was never going to come.</p>
</blockquote>
<img src="https://cdn.hashnode.com/uploads/covers/6aa6c1e303fb3ec9beecce1d/c736a415-7618-4962-9b88-2508babe2c6e.svg" alt="" style="display:block;margin:0 auto" />

<p>The fix was almost anticlimactic once I found it: drop the crop step, add a hard 20-second timeout so it fails loudly instead of hanging silently. But finding that fix meant learning something that isn't obvious if you've only ever worked on the web , native mobile has separate "activities" and screens that hand control back and forth, and if that handoff breaks, nothing tells you. There's no console error for "a native screen forgot to return."  </p>
<h2><strong>The Bug That Gaslit Me</strong></h2>
<img src="https://cdn.hashnode.com/uploads/covers/6aa6c1e303fb3ec9beecce1d/097db724-fc21-45b4-863b-5c8203408fdd.jpg" alt="" style="display:block;margin:0 auto" />

<p>The second one was worse, because it lied convincingly. A UI issue would appear, then disappear on its own, then come back a session later with no pattern I could find. I'd fix something, it would look fixed, then two days later the exact same broken state would show up again like I'd never touched it.</p>
<p>The actual cause had nothing to do with my code. I had a pile of old dev server processes running simultaneously in the background , metro bundlers from previous sessions that never actually shut down. Each one was quietly serving a different, stale version of my app. Depending on which port my device happened to connect to, I'd get a different snapshot of my own code, days apart, with no warning that this was even possible.</p>
<p>This one taught me something web development never really forces you to learn: that "it looks fixed" and "I understand why it's fixed" are not the same claim, and treating them as the same one will waste hours of your life.</p>
<hr />
<p><strong>Why This Was Harder With AI in the Loop, Not Easier</strong></p>
<img src="https://cdn.hashnode.com/uploads/covers/6aa6c1e303fb3ec9beecce1d/ef64ad3d-1850-458c-928e-d09d801d14b4.jpg" alt="" style="display:block;margin:0 auto" />

<p>Here's the part that actually surprised me. I expected AI to make debugging faster, and it did ... for writing fixes. But it didn't shortcut the understanding. If anything, it raised the bar, because I could get a plausible-sounding fix in seconds, and plausible isn't the same as correct.</p>
<p>With the picker bug, my first prompt to Claude Code was based on my wrong assumption — permissions. It gave me a reasonable-sounding permissions fix. It would have "worked" in the sense of not crashing, while leaving the actual hang untouched. The only reason I caught it was refusing to accept a fix I couldn't fully explain back to myself. Same with the stale-server issue , the first few explanations sounded complete, but none of them actually accounted for why the bug would vanish and reappear days later. I kept pushing until the explanation actually closed every loop, not just the visible one.  </p>
<h3><strong>What I Actually Learned (Beyond the Fixes)</strong></h3>
<ul>
<li><p>Native mobile has handoffs between screens/processes that web development doesn't really have an equivalent of, and when those handoffs silently fail, there's no clean error to point you at it</p>
</li>
<li><p>"Cancelled" and "hung" look identical from the outside but mean completely different things, and confusing them sends you debugging the wrong problem entirely</p>
</li>
<li><p>Long-running dev processes on mobile can quietly multiply and serve stale code without any obvious signal, always check what's actually still running before trusting what you're looking at</p>
</li>
<li><p>An AI-generated fix that runs without error isn't the same as a fix you understand and the gap between those two only shows up later, usually at the worst time</p>
</li>
</ul>
<h3><strong>The Actual Lesson</strong></h3>
<p>None of this was really about mobile development, or even about AI. It was about the fact that "it works" is a much lower bar than "I know why it works" and the second one is the only one that actually protects you later. Web development let me get away with the first bar more than I realized. Mobile, with an AI moving fast enough to outpace my understanding if I let it, didn't let me get away with it at all.  </p>
<blockquote>
<p>Looking back, I learned a lot more from this project than I expected. I learned that mobile development has its own rules, that some problems take more than just another fix, and that sometimes the hardest part is figuring out what is actually going wrong. I also learned to slow down, question things, and not assume that because something worked on the web, it would work the same way here.</p>
<p>It was frustrating at times, but every strange bug, wrong turn, and late realization taught me something I didn’t know before. And honestly, that’s probably what I’ll remember most from building this app.</p>
</blockquote>
]]></content:encoded></item></channel></rss>