<?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[The Rocky Road to Clarity]]></title><description><![CDATA[The Rocky Road to Clarity]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 19 Jun 2026 12:48:11 GMT</lastBuildDate><atom:link href="https://the-rocky-road-to-clarity.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Deployed My App and My Laptop Didn't Catch Fire: A Success Story]]></title><description><![CDATA[If you’ve been following my dev journey (the series I update with the thrilling irregularity of a public bus schedule in the mountains), you’ll remember my last post. It was a tear stained tale of woe, where my dream of a mobile app was mercilessly t...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/i-deployed-my-app-and-my-laptop-didnt-catch-fire-a-success-story</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/i-deployed-my-app-and-my-laptop-didnt-catch-fire-a-success-story</guid><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Fri, 17 Oct 2025 13:13:16 GMT</pubDate><content:encoded><![CDATA[<p>If you’ve been following my dev journey (the series I update with the thrilling irregularity of a public bus schedule in the mountains), you’ll remember my last post. It was a tear stained tale of woe, where my dream of a mobile app was mercilessly throttled by a laptop that couldn't handle React Native without sounding like a jet engine preparing for takeoff.</p>
<p>Well, wipe those tears away, because this is a different story. This is a story of victory. This is the tale of how <strong>Blogify</strong>, my blogging brainchild, is not just alive and kicking, but <strong>fully deployed and functional</strong> on the internet for all to see. My laptop, for once, is cool, quiet, and probably as surprised as I am.</p>
<h4 id="heading-from-glacial-builds-to-lightning-deploys">🚀 From Glacial Builds to Lightning Deploys</h4>
<p>Remember when testing a single line of code felt like waiting for a glacier to melt? Where a 20 minute build cycle was just… normal? Moving from that bare React Native nightmare back to web development was like swapping a rickety donkey for a sports car.</p>
<p>Building Blogify was a dream. With <strong>React</strong>, <strong>TailwindCSS</strong>, and <strong>Framer Motion</strong>, I could tweak a component, hit save, and <em>BAM</em>! see the change instantly. It felt less like coding and more like witchcraft. A very productive, well documented form of witchcraft.</p>
<h4 id="heading-what-blogify-can-do-besides-not-crashing-my-machine">What Blogify Can Do (Besides Not Crashing My Machine)</h4>
<p>This isn't just a "hello world" with a blog skin. Oh no. Blogify is a fully loaded, feature rich, blogging beast. Here’s what you can do:</p>
<ul>
<li><p><strong>Write &amp; Publish with Ease:</strong> The core of any blogging platform. Create, edit, and delete your literary masterpieces. It’s so smooth, you’ll forget you’re even working.</p>
</li>
<li><p><strong>User Authentication that Actually Works:</strong> Secure <strong>user login</strong> and profiles. No more pretending to be someone you're not (unless that's your thing, I don't judge).</p>
</li>
<li><p><strong>Your Own Personal Dashboard:</strong> Log in and you’re greeted with a sleek <strong>User Dashboard</strong> where you can see all your blogs and even check out <strong>analytics</strong> on your profile. Watch those view counts climb higher than a peak in Hunza!</p>
</li>
<li><p><strong>Filter Like a Pro:</strong> Can’t find that one post you wrote about that thing? <strong>Filter articles by authors, tags, and categories</strong> in a flash. The search is over.</p>
</li>
<li><p><strong>Trending Now:</strong> The home page showcases <strong>trending posts based on most viewed</strong>, so you know what’s hot and what’s not. It’s like a popularity contest, but for articles.</p>
</li>
<li><p><strong>Dark Mode or Light Mode? You Choose:</strong> It has a <strong>dark and light theme</strong> because your retinas deserve choice. My eyes have personally thanked me.</p>
</li>
<li><p><strong>Butter Smooth Animations:</strong> Thanks to <strong>Framer Motion</strong>, every page transition and hover effect is smoother than a polished ice rink. It just <em>feels</em> modern.</p>
</li>
<li><p><strong>Fully Responsive:</strong> Whether you’re reading on a massive monitor or squinting at a phone on a bumpy jeep ride in Skardu, the experience is seamless. <strong>Fully responsive on mobile and big screens</strong>? Check.</p>
</li>
</ul>
<h4 id="heading-the-final-boss-deployment-on-vercel">The Final Boss: Deployment on Vercel</h4>
<p>After all the coding, the real test was the deployment. I’ll be honest, I was prepared for another multi day saga of cryptic error messages and existential dread.</p>
<p>But then I used <strong>Vercel</strong>.</p>
<p>Linking my GitHub repo and hitting deploy was almost… anticlimactic. It was so straightforward, so painless, that I kept refreshing the page, waiting for the catch. There was no catch. Just a beautiful, live URL. My app was on the internet. My laptop, for the first time in months, was silent. The only thing overheating was my sense of pride.</p>
<h4 id="heading-the-lesson-learned-the-sequel">The Lesson Learned (The Sequel)</h4>
<p>The lesson from my last blog was "know when to retreat." The lesson from this one is <strong>"know when to charge forward."</strong></p>
<p>Pivoting from the mobile app wasn't a defeat; it was a strategic relocation of passion. By focusing on a project that matched my tools (my beloved, underpowered laptop), I was able to build something substantial, see it through to the end, and actually enjoy the process.</p>
<p>I went from debugging existential JDK crises to <strong>successfully deploying a full-stack application</strong> with a modern tech stack. The win wasn't just the deployed app; it was reclaiming the joy of coding.</p>
<h4 id="heading-whats-next">What's Next?</h4>
<p>Is Blogify "done"? Is any software ever truly done? I’ll be adding more bells and whistles, but for now, it’s a solid, working product out in the wild.</p>
<p>As for the mobile app dream? It’s still there, on the back burner, waiting for the day I upgrade my hardware. But for now, I’m going to bask in the glorious, quiet hum of a successful deployment.</p>
<p><strong>Go forth and explore!</strong> The app is live, the code is on GitHub, and my motivation is higher than the K2 base camp.</p>
<p><em>[</em><a target="_blank" href="https://blogify-seven-rho.vercel.app/">https://blogify-seven-rho.vercel.app/</a><em>]</em><br /><em>[</em><a target="_blank" href="https://github.com/SehrishHussain/Blogify">https://github.com/SehrishHussain/Blogify</a><em>]</em></p>
<p><em>Missed the dramatic prequel? Read about my great laptop tragedy here:</em> <a target="_blank" href="https://hashnode.com/6874c3d843509ec131cc74c4/dashboard/posts"><em>My Hashnode Blog Series</em></a></p>
]]></content:encoded></item><item><title><![CDATA[This Blog Was Long Due (and Very Hard to Write)]]></title><description><![CDATA[If you’ve been following my dev journey series (you know, the one I update with the consistency of a Gilgit-Baltistan Wi-Fi signal), you probably noticed a gap. A yawning chasm, really. A silence so profound you could hear a single pixel drop.
This b...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/this-blog-was-long-due-and-very-hard-to-write</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/this-blog-was-long-due-and-very-hard-to-write</guid><category><![CDATA[React]]></category><category><![CDATA[React Native]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Sun, 21 Sep 2025 07:52:17 GMT</pubDate><content:encoded><![CDATA[<p>If you’ve been following my dev journey series (you know, the one I update with the consistency of a Gilgit-Baltistan Wi-Fi signal), you probably noticed a gap. A yawning chasm, really. A silence so profound you could hear a single pixel drop.</p>
<p>This blog was long due and, honestly, very hard for me to write. Not because I forgot my password, but because this one isn’t about a glorious breakthrough. It’s about a bottleneck so severe it made my laptop weep and forced me to pause one of my dream projects. Think of it less as a blog post and more as a tech themed tragedy. With slightly more debugging.</p>
<h3 id="heading-the-dream-before-the-nightmare">The Dream (Before the Nightmare)</h3>
<p>I was building a travel tracking app for my beloved Gilgit-Baltistan. Not just another map app that gets lost the moment you lose a bar of service, but a legit safety tool. The kind that says, "I got you, fam," even during a power outage or a surprise landslide.</p>
<p>The crown jewel feature?<br /><strong>Background location tracking.</strong> The ability for the app to whisper your coordinates even when it's napping.</p>
<p><strong>Why?</strong></p>
<ul>
<li><p><strong>Frequent power shortages:</strong> Tourists can't be expected to have their phones plugged into a mountain.</p>
</li>
<li><p><strong>Battery life:</strong> My app saving a life while draining a battery to 0% is a terrible review waiting to happen.</p>
</li>
<li><p><strong>The obvious:</strong> Lives &gt; likes.</p>
</li>
</ul>
<p>I started in Expo. It was beautiful. It was fast. It was like coding on a smooth, freshly paved road. But Expo, for all its wonders, doesn't let you do the hardcore, background stuff. It's the "we don't do that here" of the mobile world.</p>
<p>So, like a developer who has just read one too many "Real devs use bare React Native" comments on Reddit, I made the switch.</p>
<p>I entered the jungle. I was not prepared.</p>
<h3 id="heading-the-bottleneck-or-how-my-laptop-learned-to-hate-me">💻 The Bottleneck (Or, How My Laptop Learned to Hate Me)</h3>
<p>Bare React Native development isn't just coding. It's a ritual. A sacred, frustrating ceremony of summoning ancient SDKs, appeasing the JDK gods, and trying to get Android Studio to not look at you with utter contempt.</p>
<p>Somehow, through tears and copious amounts of caffeine, I did it. I debugged the environment, installed <em>everything</em>, and got my first build running. I did a victory dance. My laptop, now sweating and making a sound like a distant helicopter, did not dance with me.</p>
<p>"Then… reality hit. The kind of hit that leaves a mark.</p>
<p>Every. Single. Build. Command. took 15-20 minutes. I could boil chai on chula, drink it, and have a philosophical debate about the meaning of undefined in the time it took to see if my button color changed. My laptop transformed into a space heater that occasionally allowed me to type. I'd type a line of code, hit save, and go for a walk. By the time I came back, the cursor was still thinking about it. Testing a one-line change felt like waiting for a glacier to melt. A very, very slow glacier that also had to compile Java first.</p>
<p>Yet somehow, I managed to build user authentication, integrate Google Auth, and even implement itinerary generation pulling data from MongoDB. The catch? What should have been a day's work stretched into a 4-5 day marathon of watching progress bars like they were the main feature. My stubborn self the same part of me that tries to fix a leaky tap with chewing gum kept going for days. But after the 100th minute-long fan solo, I had to face the truth: I was trying to run a Formula 1 race on a bicycle. With a flat tire.</p>
<p>It wasn't me.<br />It was my glorified toaster of a laptop."</p>
<h3 id="heading-the-hard-call-aka-the-smart-one">The Hard Call (Aka, The Smart One)</h3>
<p>Stopping this project felt like giving up on a pet. A very complex, code-based pet that was constantly on fire.</p>
<p>But it wasn't giving up. It was strategic retreat. It was recognizing that sinking weeks into 20 minute build cycles isn't productivity it's a form of digital self flagellation.</p>
<p>So, for now, the background tracking app is on pause. Not cancelled. Just cryogenically frozen until I can afford a machine powerful enough to handle it (read: until I sell a kidney and buy a Mac, because apparently, that's the entry fee).</p>
<h3 id="heading-the-pivot-enter-blogify-a-phoenix-from-the-ashes">The Pivot → Enter Blogify (A Phoenix from the Ashes)</h3>
<p>Since my laptop can handle web dev without threatening to launch into orbit, I shifted gears. I started building <strong>Blogify</strong>, a blogging platform.</p>
<p>And folks, the joy. The sheer, unadulterated joy of hitting 'save' and seeing changes <strong>INSTANTLY</strong>. It’s like going from communicating via carrier pigeon to using a phone. It’s magical.</p>
<p>Here’s what I’ve built so far in the time it would have taken me to do one mobile build:</p>
<h4 id="heading-tech-stack">Tech Stack</h4>
<ul>
<li><p><strong>Frontend:</strong> React + JavaScript + TailwindCSS (It's fast, it's responsive, it doesn't judge me).</p>
</li>
<li><p><strong>State Management:</strong> Redux (For storing all the important stuff, like whether you're logged in or just pretending to be).</p>
</li>
<li><p><strong>Authentication:</strong> Google OAuth (fancy!) + Email/Password (old reliable).</p>
</li>
<li><p><strong>Backend:</strong> Appwrite (My new best friend. It handles the boring stuff so I can focus on the fun stuff).</p>
</li>
</ul>
<h4 id="heading-features-implemented-so-far">Features Implemented so far…</h4>
<ul>
<li><p><strong>Redux store:</strong> Auth state is flowing smoother than a hot cup of Hunza’s famous tumuro green-tea.</p>
</li>
<li><p><strong>Full CRUD Operations:</strong></p>
<ul>
<li><p>Create blog. Done! (The "Eureka!" moment)</p>
</li>
<li><p>View blog and saving number of views. Done! (The "It works!" moment)</p>
</li>
<li><p>Update blog. Done! (The "Whoops, typo" fix)</p>
</li>
<li><p>Delete blog. Done! (The "This idea was terrible" button)</p>
</li>
</ul>
</li>
<li><p><strong>Editor workflow:</strong> Write, save, publish. No 20 minute wait to see if your headline is centered.</p>
</li>
</ul>
<h3 id="heading-the-lesson-because-there-has-to-be-one">The Lesson (Because There Has to Be One)</h3>
<p>Sometimes in tech, you have to pause something you love, not because you're a quitter, but because you're not a masochist. Continuing under terrible conditions isn't grit it's a great way to burn out and start hating what you do.</p>
<p>The mobile app dream is on ice. But it's not dead. It's just waiting for a stronger machine and a developer with a few more scars (and hopefully, a MacBook).</p>
<p>In the meantime, I'm back in my web dev comfort zone, building cool things, and remembering that coding is supposed to be <strong>fun</strong>, not a test of your patience while you sit and do nothing but wait for results nor its a test of laptop's cooling capabilities.</p>
<p><strong>Gilgit Baltistan may be full of obstacles</strong> landslides, power cuts, internet that dies when a cloud looks at it funny but I’ve learned to treat coding challenges the same way we treat mountain treks: sometimes you have to turn back, regroup, and wait for a clearer day to climb.</p>
<p><strong>👉 What's next?</strong> I’ll keep polishing Blogify, maybe add some hilarious features, and who knows, maybe I'll even let you all try it out. The journey continues, just on a slightly different path!</p>
<p><em>Check out the</em> <a target="_blank" href="https://github.com/SehrishHussain/react/tree/master/MegaBlogAppwrite"><em>GitHub repo for Blogify</em></a> <em>here and feel the need for speed!</em></p>
<p><em>Catch up on the rest of the chaos I call a journey here:</em> <a target="_blank" href="https://hashnode.com/6874c3d843509ec131cc74c4/dashboard/posts"><em>My Hashnode Blog Series</em></a></p>
]]></content:encoded></item><item><title><![CDATA[When Location Tracking Works (and You Still Panic): A React Native Adventure]]></title><description><![CDATA[Welcome to another episode of “What Fresh Bug Is This?” where I, a full time parent and part time debugger, attempt to build a rescue ready location tracking app while keeping my sanity intact (mostly).

The Mission
I’m building a mobile app (React N...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/when-location-tracking-works-and-you-still-panic-a-react-native-adventure</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/when-location-tracking-works-and-you-still-panic-a-react-native-adventure</guid><category><![CDATA[Gilgit Baltistan]]></category><category><![CDATA[React Native]]></category><category><![CDATA[MERN Stack]]></category><category><![CDATA[Location Tracking]]></category><category><![CDATA[asyncstorage]]></category><category><![CDATA[fullstackdevelopment]]></category><category><![CDATA[React]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Sun, 27 Jul 2025 12:53:22 GMT</pubDate><content:encoded><![CDATA[<p><em>Welcome to another episode of “What Fresh Bug Is This?” where I, a full time parent and part time debugger, attempt to build a rescue ready location tracking app while keeping my sanity intact (mostly).</em></p>
<hr />
<h2 id="heading-the-mission">The Mission</h2>
<p>I’m building a mobile app (React Native) and web app (Next.js) for <strong>tourists in Gilgit Baltistan</strong>, with a very real use case: people get lost or have accidents in places with no cell coverage. My app should:</p>
<p>✅ Let mobile users send location to backend<br />✅ Show that location on a map (web + mobile)<br />✅ Cache the last known location offline<br />✅ Help rescuers/family track them when they go off-grid</p>
<p>Simple, right?</p>
<hr />
<h2 id="heading-the-login-that-works-and-finally-sends-a-token">The Login That Works (and Finally Sends a Token)</h2>
<p>After wiring up user registration and login, I hooked Redux into my mobile app to store the <code>accessToken</code>. This allowed me to protect location routes and ensure only logged-in users could send their location.</p>
<pre><code class="lang-ts"><span class="hljs-keyword">const</span> token = useSelector(<span class="hljs-function">(<span class="hljs-params">state: RootState</span>) =&gt;</span> state.auth.accessToken);
</code></pre>
<p>I also added feedback to the user:</p>
<pre><code class="lang-ts">Alert.alert(<span class="hljs-string">"Login Success"</span>, <span class="hljs-string">`Welcome <span class="hljs-subst">${res.user.fullName}</span>`</span>);
navigation.navigate(<span class="hljs-string">"Home"</span>);
</code></pre>
<hr />
<h2 id="heading-sending-location-from-mobile">Sending Location from Mobile</h2>
<p>Here’s how I did it:</p>
<ol>
<li><p><strong>Requested foreground location permission</strong> using <code>expo-location</code></p>
</li>
<li><p><strong>Fetched lat/lng</strong></p>
</li>
<li><p><strong>Sent it to backend via Axios</strong> with bearer token</p>
</li>
<li><p><strong>Saved it to MongoDB</strong> in the backend</p>
</li>
</ol>
<pre><code class="lang-ts"><span class="hljs-keyword">const</span> location = <span class="hljs-keyword">await</span> Location.getCurrentPositionAsync({});
<span class="hljs-keyword">const</span> { latitude, longitude } = location.coords;
<span class="hljs-keyword">await</span> axios.post(<span class="hljs-string">"/api/location/save"</span>, { lat: latitude, lng: longitude }, { headers: { Authorization: <span class="hljs-string">`Bearer <span class="hljs-subst">${token}</span>`</span> } });
</code></pre>
<p>It felt good to finally see:</p>
<pre><code class="lang-bash">Location saved successfully 🟢
</code></pre>
<hr />
<h2 id="heading-the-real-world-use-case">The Real-World Use Case</h2>
<p>The app is meant to work <strong>even in emergency mountain scenarios</strong>, where:</p>
<ul>
<li><p>Cell signals vanish</p>
</li>
<li><p>No internet means no live tracking</p>
</li>
</ul>
<p>So we added <code>AsyncStorage</code> to save the <strong>last known location offline</strong>, so:</p>
<ul>
<li><p>It can be sent to backend when internet returns</p>
</li>
<li><p>The web app can show the last known position for families/rescuers</p>
</li>
</ul>
<p>It’s not perfect, but in GB <strong>sometimes good enough is life saving</strong>.</p>
<hr />
<h2 id="heading-reverse-geocoding-amp-city-names">Reverse Geocoding &amp; City Names</h2>
<p>Getting a lat/lng is cool. But displaying:</p>
<blockquote>
<p><em>“Passu, Gilgit Baltistan, Pakistan”</em></p>
</blockquote>
<p>is way more meaningful to a user than just numbers.</p>
<h3 id="heading-i-considered">I considered:</h3>
<ul>
<li><p><strong>Nominatim (OpenStreetMap)</strong>: free, no billing, fair usage (1 req/sec)</p>
</li>
<li><p><strong>Google Maps API</strong>: more accurate, but requires billing and strict quotas</p>
</li>
</ul>
<p>I picked <strong>Nominatim</strong> for now, to stay within budget and dev sanity.</p>
<pre><code class="lang-ts">GET https:<span class="hljs-comment">//nominatim.openstreetmap.org/reverse?lat=35.5&amp;lon=74.4&amp;format=json</span>
</code></pre>
<hr />
<h2 id="heading-choosing-map-frameworks">Choosing Map Frameworks 🗺️</h2>
<p>I needed maps in both <strong>mobile</strong> and <strong>web</strong> versions.</p>
<h3 id="heading-web-nextjs">Web (Next.js)</h3>
<ul>
<li><p><strong>MapLibre GL JS</strong>: Opensource, performant, no billing drama</p>
</li>
<li><p>Leaflet: Easy but a bit old school</p>
</li>
</ul>
<h3 id="heading-mobile-react-native">Mobile (React Native)</h3>
<ul>
<li><p><code>react-native-maps</code> works with Google/Apple Maps, easy to integrate</p>
</li>
<li><p>Future plan: <code>react-native-maplibre-gl</code> for <strong>offline maps</strong></p>
</li>
</ul>
<p>Offline maps are <strong>ideal for GB</strong>, where signal can be lost. But we’ll phase that in later.</p>
<hr />
<h2 id="heading-asyncstorage-a-lifesaver-in-no-signal-zones">AsyncStorage (a lifesaver in no-signal zones)</h2>
<p>In mountain areas, a user might:</p>
<ul>
<li><p>Lose signal before their location gets sent</p>
</li>
<li><p>Be unable to call for help</p>
</li>
</ul>
<p>We designed it so:</p>
<ul>
<li><p>Their <strong>last known location is cached offline</strong></p>
</li>
<li><p>When signals return, the app will try sending it again</p>
</li>
<li><p>Families using the web app can see that cached location</p>
</li>
</ul>
<p>It’s the tech version of <strong>dropping breadcrumbs in the forest</strong>, except it works.</p>
<hr />
<h2 id="heading-important-considerations">Important Considerations</h2>
<p><strong>Battery:</strong> GPS polling can drain battery. We only get location:</p>
<ul>
<li><p>When user taps "Send Location"</p>
</li>
<li><p>On SOS/fall detection trigger</p>
</li>
</ul>
<p><strong>Rate Limits:</strong> Nominatim (free API) allows 1 request/sec <strong>per IP</strong>, which is fine for my small user base.</p>
<p><strong>Offline support:</strong> No map tiles = no visual. With MapLibre, I can cache map tiles for key GB regions.</p>
<p><strong>Emergency Use:</strong> Even if user can’t send a location, their <strong>last known coordinates</strong> help rescuers.</p>
<hr />
<h2 id="heading-summary-tracking-progress-and-sanity">Summary: Tracking Progress (and Sanity)</h2>
<p>In this episode of <em>“What Fresh Bug Is This?”</em>, we strapped on our hiking boots and took our mobile app for a real adventure through the valleys of React Native, past the ridges of Redux, and into the high altitude zones of <strong>location tracking</strong>.</p>
<h3 id="heading-what-i-actually-built">What I Actually Built</h3>
<p>✅ Secure user login<br />✅ Redux-based token management<br />✅ Location tracking screen in React Native<br />✅ Backend API to receive and save coordinates<br />✅ Successful save to MongoDB<br />✅ “Send Location” button actually works!<br />✅ Accurate error logs when it doesn’t (thank you, logs)<br />✅ Mobile → backend → database pipeline is alive!</p>
<hr />
<h2 id="heading-what-i-thought-about-a-lot">What I Thought About (A Lot) 🤔</h2>
<ul>
<li><p>Unreliable connectivity</p>
</li>
<li><p>Battery efficiency</p>
</li>
<li><p>Offline fallback</p>
</li>
<li><p>Accurate location (village-level + GPS pin)</p>
</li>
<li><p>Caching with <code>AsyncStorage</code></p>
</li>
<li><p>Designing for emergencies, because let’s be honest <strong>if someone’s hanging by a rock ledge with no bars on their phone, my app’s fancy UI animations won’t save them. But a last pinged GPS with a timestamp just might.</strong></p>
</li>
</ul>
<hr />
<h2 id="heading-how-i-chose-maps-amp-location-apis">How I Chose Maps &amp; Location APIs 🗺️</h2>
<p>I had a full on developer dharna about which map frameworks and APIs won’t:</p>
<ul>
<li><p>Drain the battery</p>
</li>
<li><p>Drain our wallets</p>
</li>
<li><p>Break when there's no internet</p>
</li>
<li><p>Violate rate limits</p>
</li>
</ul>
<h3 id="heading-final-picks">Final Picks:</h3>
<ul>
<li><p><strong>MapLibre</strong> (for both React Native + Next.js)</p>
</li>
<li><p><strong>OpenStreetMap + Nominatim</strong></p>
</li>
<li><p><strong>AsyncStorage</strong></p>
</li>
</ul>
<p>I decided against Google Maps for now because:</p>
<ul>
<li><p>They want your <strong>billing account</strong></p>
</li>
<li><p>They track you harder than your desi mom on Eid</p>
</li>
<li><p>Rate limits are more forgiving elsewhere</p>
</li>
</ul>
<hr />
<h2 id="heading-where-i-am-headed-next-no-pun-intended">Where I am Headed Next (no pun intended)</h2>
<ul>
<li><p>Cache last location offline</p>
</li>
<li><p>Automatically send when internet returns</p>
</li>
<li><p>Show it on a map in the app</p>
</li>
<li><p>Build a simple web dashboard so family members can <strong>see</strong> the last location</p>
</li>
<li><p>Add SOS button + fall detection (because gravity is not always a friend)</p>
</li>
</ul>
<hr />
<blockquote>
<p><em>If you're building a mobile app from scratch, remember: even if your app doesn’t always save lives it should at least not crash when trying.</em></p>
</blockquote>
<p>🧭 <strong>Until next time track responsibly, debug often, and don’t forget to breathe (or hydrate).</strong></p>
]]></content:encoded></item><item><title><![CDATA[What Fresh Bug Is This?]]></title><description><![CDATA[Episode 3: Plugins, Packets, and a Toddler’s Endless “Why”
Welcome to Episode 3 of “The Rocky Road to Clarity”, where I full-time parent, part-time debugger set out to bring location tracking to life... and end up tracking my own sanity instead.
This...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/what-fresh-bug-is-this</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/what-fresh-bug-is-this</guid><category><![CDATA[ #funnycodingstories]]></category><category><![CDATA[t #debugging ]]></category><category><![CDATA[WomenWhoTech]]></category><category><![CDATA[React Native]]></category><category><![CDATA[Expo]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[debugging]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[full stack]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Sat, 26 Jul 2025 06:41:31 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-episode-3-plugins-packets-and-a-toddlers-endless-why">Episode 3: Plugins, Packets, and a Toddler’s Endless “Why”</h2>
<p>Welcome to <strong>Episode 3 of “The Rocky Road to Clarity”</strong>, where I full-time parent, part-time debugger set out to bring location tracking to life... and end up tracking my own sanity instead.</p>
<p>This time, I thought:</p>
<blockquote>
<p><em>“Let’s just build a simple login screen for my React Native app.”</em></p>
</blockquote>
<p>Ha.<br />Haha.<br />😐</p>
<p>What followed was a glorious mess of:</p>
<ul>
<li><p>🔌 mysterious plugin errors,</p>
</li>
<li><p>🌐 ghostly network issues,</p>
</li>
<li><p>🔐 <code>SecureStore</code> tantrums,</p>
</li>
<li><p>and 👶 a toddler who thinks <strong>"Why?"</strong> is the only word in the dictionary.</p>
</li>
</ul>
<hr />
<h2 id="heading-the-tailwind-spiral">The Tailwind Spiral</h2>
<p>It all started with ambition:</p>
<blockquote>
<p><em>“Let’s use Tailwind for mobile styling! It’ll be fast and elegant!”</em></p>
</blockquote>
<p>So I installed <code>nativewind</code>, added the plugin in <code>babel.config.js</code>, hit save...</p>
<p><strong>Boom.</strong></p>
<pre><code class="lang-bash">pythonCopyEdit.plugins is not a valid Plugin property
</code></pre>
<p>Me:</p>
<blockquote>
<p>“I… didn’t even touch plugins. Who touched plugins?!”</p>
</blockquote>
<p>Turns out I either:</p>
<ul>
<li><p>added the plugin wrong,</p>
</li>
<li><p>added it too early,</p>
</li>
<li><p>or summoned some ancient CSS curse.</p>
</li>
</ul>
<p>After uninstalling, reinstalling, purging caches, and spiritually cleansing my project (basically an exorcism), I gave up.</p>
<ul>
<li><p>Tailwind: ❌</p>
</li>
<li><p>Vanilla stylesheets: ✅</p>
</li>
<li><p>Sanity: 🤷‍♀️</p>
</li>
</ul>
<hr />
<h2 id="heading-the-case-of-the-disappearing-backend">The Case of the Disappearing Backend</h2>
<p>Next: connect the mobile app to my Express backend for login.</p>
<p>Tried <a target="_blank" href="http://localhost:5000/api/auth/login.￼❌"><code>localhost:5000/api/auth/login</code>.<br />❌</a> Failed.<br />Tried <code>172.x.x.x</code>.<br />❌ Failed.<br />Tried praying.<br />🙏 Still failed.</p>
<p>My phone was like:</p>
<p><strong><em>“I don’t know where</em></strong> <a target="_blank" href="http://localhost"><strong><em>localhost</em></strong></a> <strong><em>is. Is it a tourist spot in Gilgit?”</em></strong></p>
<p>Eventually realized: <strong>Expo Go can’t access</strong> <a target="_blank" href="http://localhost"><code>localhost</code></a> on your laptop.<br />It needs your <strong>actual IP address</strong>, like <code>192.168.1.20</code>.</p>
<p>So I ran <code>ipconfig</code>, got the right IP, and finally connected.</p>
<p>Meanwhile, my toddler, noticing my increasing frustration, chimed in:</p>
<p><strong>“Mama, why doesn’t your app work?”</strong></p>
<p>Me: “Because… I used the wrong <a target="_blank" href="http://localhost">localhost</a>.”<br />Her: “Why?”<br />I <em>almost</em> said, <em>“Because Mama was dumb,”</em> but figured I shouldn’t model low confidence in tech this early.<br />So I tried: <em>“Because</em> <a target="_blank" href="http://localhost"><em>localhost</em></a> <em>only works on the same device. My phone isn’t my laptop.”</em><br />Her: “Why?”<br />Me: <em>“Because… network interfaces, IP addresses, TCP routing, DNS something something…”</em><br />Her: “Why?”</p>
<p>By the end, I was muttering <strong>"why"</strong> not just to her, but to:</p>
<ul>
<li><p>my backend,</p>
</li>
<li><p>my frontend,</p>
</li>
<li><p>Expo,</p>
</li>
<li><p><code>SecureStore</code>,</p>
</li>
<li><p>and every life decision I’ve ever made.</p>
</li>
</ul>
<h2 id="heading-securestore-isnt-that-secure-if-you-dont-use-strings"><code>SecureStore</code> Isn’t That Secure… If You Don’t Use Strings</h2>
<p>Finally, success! I received the token from backend after login.<br />Victory was near.</p>
<p>Then <strong>Expo</strong> hit me with this:</p>
<pre><code class="lang-powershell">vbnetCopyEditInvalid value provided to SecureStore. Must be string.
</code></pre>
<p>Of course.<br /><code>SecureStore</code> <strong>only stores strings.</strong> I had given it an object. Or maybe <code>undefined</code>. Or maybe a half baked promise of success.</p>
<h3 id="heading-the-fix">The fix:</h3>
<pre><code class="lang-powershell">tsCopyEditawait SecureStore.setItemAsync(<span class="hljs-string">"refreshToken"</span>, JSON.stringify(token));
</code></pre>
<p><strong>Moral of the story:</strong><br /><strong>If you don’t</strong> <code>stringify()</code><strong>, you’ll</strong> <code>sufferify()</code><strong>.</strong></p>
<h2 id="heading-what-i-learned-again">What I Learned (Again) 🧠</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Lesson</td><td>Truth</td></tr>
</thead>
<tbody>
<tr>
<td>💻 <a target="_blank" href="http://localhost"><code>localhost</code></a> ≠ your computer (on mobile devices)</td><td>Use <code>192.168.x.x</code>, <strong>obviously</strong>!</td></tr>
<tr>
<td>🔐 SecureStore only loves strings</td><td>No strings, no love.</td></tr>
<tr>
<td>🪄 Tailwind is magic... until it misfires</td><td>Maybe use it later.</td></tr>
<tr>
<td>👶 Toddlers are living while-loops</td><td><code>while (true) { ask("why"); }</code></td></tr>
</tbody>
</table>
</div><h2 id="heading-what-works-now">✅ What Works Now:</h2>
<ul>
<li><p>✅ Login screen</p>
</li>
<li><p>✅ Talking to backend</p>
</li>
<li><p>✅ Receiving &amp; saving token</p>
</li>
<li><p>✅ Redux state updated</p>
</li>
<li><p>❓ Knowing where it breaks next... stay tuned.</p>
</li>
</ul>
<h3 id="heading-coming-up-next">Coming Up Next</h3>
<p>🏠 Home screen,<br />📍 Location tracking,<br />📴 Offline support...</p>
<p>… if I don’t go offline myself first. ☕️</p>
<p>Until then,<br />Still debugging in pajamas, coffee in hand, toddler on lap.<br />👣</p>
]]></content:encoded></item><item><title><![CDATA[From Peaks to Passwords]]></title><description><![CDATA[Debugging My Mountain of Auth Errors in the Glacier to GitHub Saga
Remember when I said React Native would make me weep? Turns out Google OAuth beat it to the punch! In this next leg of our Glacier to GitHub journey, I traded mountain switchbacks for...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/from-peaks-to-passwords</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/from-peaks-to-passwords</guid><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Tue, 22 Jul 2025 14:09:31 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-debugging-my-mountain-of-auth-errors-in-the-glacier-to-github-saga">Debugging My Mountain of Auth Errors in the Glacier to GitHub Saga</h2>
<p>Remember when I said React Native would make me weep? Turns out Google OAuth beat it to the punch! In this next leg of our <strong>Glacier to GitHub</strong> journey, I traded mountain switchbacks for authentication switchbacks and discovered why environment variables haunt developers' dreams.</p>
<h3 id="heading-the-authentication-base-camp-email-vs-google-gates"><strong>The Authentication Base Camp: Email vs. Google Gates</strong></h3>
<ol>
<li><p><strong>The Traditional Ascent (Email/Password):</strong></p>
<ul>
<li><p>Next.js form → Express backend</p>
</li>
<li><p>Passwords hashed like frozen lakes</p>
</li>
<li><p>MongoDB as our gear stash</p>
</li>
<li><p>JWT summit flags planted</p>
</li>
</ul>
</li>
<li><p><strong>The Glacier Slide (Google OAuth):</strong></p>
<ul>
<li><p><code>@react-oauth/google</code> package as our ice axe</p>
</li>
<li><p>Frontend harvesting idTokens like ripe apricots</p>
</li>
<li><p>Backend verifying with Google’s <code>google-auth-library</code></p>
</li>
<li><p><em>"Either find existing sherpa or carve new path!"</em></p>
</li>
</ul>
</li>
</ol>
<p>Simple map, right? *Cue ominous foreshadowing crevasse sounds._</p>
<h3 id="heading-the-two-day-whiteout-when-google-said-wrong-recipient"><strong>The Two Day Whiteout: When Google Said "Wrong Recipient!"</strong></h3>
<p>There it was – the error that stole my sleep:</p>
<pre><code class="lang-plaintext">Error: Wrong recipient, payload audience != requiredAudience
</code></pre>
<p>Translation: *"Your token tried to summit K2 but brought Everest gear."_</p>
<p>As a beginner? Those 48 hours felt like:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753193041460/9b2185fb-31da-4631-b088-a3484fabdf9d.png" alt class="image--center mx-auto" /></p>
<p><strong>My debugging expedition:</strong></p>
<ol>
<li><p><strong>Checked gear at base camp:</strong></p>
<ul>
<li><p>Triple-verified <code>GOOGLE_CLIENT_ID</code> matched across Google Cloud/Next.js/Express</p>
</li>
<li><p>Frontend token generation? Perfect. ✅</p>
</li>
<li><p>Backend route receiving tokens? Confirmed. ✅</p>
</li>
</ul>
</li>
<li><p><strong>The Crevasse Dive (console.log glacier):</strong></p>
<pre><code class="lang-plaintext"> console.log("Token payload:", payload); // { aud: undefined, ...wait WHAT? }  
 console.log("Expected ID:", process.env.GOOGLE_CLIENT_ID); // undefined 🤯
</code></pre>
<p> <em>Discovery:</em> <code>GOOGLE_CLIENT_ID</code> was vanishing like summer snow in auth.controller.ts!</p>
</li>
</ol>
<h3 id="heading-the-ice-axe-fix-order-of-operations-saves-the-day"><strong>The Ice Axe Fix: Order of Operations Saves the Day</strong></h3>
<p><strong>Root cause:</strong> My <code>.env</code> file was late to the expedition!</p>
<ul>
<li><p>❌ <strong>Before:</strong> <code>dotenv.config()</code> buried <em>after</em> imports</p>
</li>
<li><p>✅ <strong>After:</strong> Strategic positioning at the <strong>very summit</strong> of server.ts:</p>
</li>
</ul>
<pre><code class="lang-plaintext">// 🚨 EMERGENCY POSITIONING SYSTEM ACTIVATE 🚨  
import dotenv from "dotenv";  
dotenv.config(); // FIRST. BEFORE. EVERYTHING.  

import express from "express";  
import authRoutes from "./routes/auth"; // Now env variables survive!
</code></pre>
<p><strong>Why it worked:</strong></p>
<ul>
<li><p>Environment variables loaded BEFORE controllers</p>
</li>
<li><p><code>OAuth2Client</code> stopped receiving empty strings ('' vs actual client ID)</p>
</li>
<li><p>Google finally nodded: <em>"Correct gear, proceed, little mountaineer."</em></p>
</li>
</ul>
<h3 id="heading-lessons-from-the-auth-avalanche"><strong>Lessons from the Auth Avalanche</strong></h3>
<ol>
<li><p><strong>Dotenv is diva:</strong> It demands center stage.</p>
</li>
<li><p><strong>Undefined &gt; wrong value:</strong> More terrifying to debug!</p>
</li>
<li><p><strong>Beginner’s badge of honor:</strong> Two days? Standard acclimatization period!</p>
</li>
</ol>
<h3 id="heading-next-on-the-glacier-to-github-trail"><strong>Next on the Glacier to GitHub Trail</strong></h3>
<p>While I bandage my OAuth wounds, React Native looms like Nanga Parbat. Will I:</p>
<ul>
<li><p>Conquer mobile SOS buttons?</p>
</li>
<li><p>Wrestle location-sharing demons?</p>
</li>
<li><p>Discover <em>new</em> ways to anger environment variables?</p>
</li>
</ul>
<p><em>To fellow coders:</em> Ever survived an ".env ambush"? Share your war stories below misery loves company at 15,000 ft! ❄️</p>
<p><em>// This mom-coder, signing off with functional Google auth and irrational fear of semicolons</em> 🏔️🔑</p>
]]></content:encoded></item><item><title><![CDATA[From Web to Peaks: Crafting Reliable Itineraries and Dodging AI Pitfalls in My Mountain Travel App]]></title><description><![CDATA[Remember how I compared building this app to navigating Himalayan switchbacks? Well, buckle up we're hitting another hairpin curve in development! After solving the SOS/location sharing puzzle, I turned to my second core feature: creating trustworthy...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/from-web-to-peaks-crafting-reliable-itineraries-and-dodging-ai-pitfalls-in-my-mountain-travel-app</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/from-web-to-peaks-crafting-reliable-itineraries-and-dodging-ai-pitfalls-in-my-mountain-travel-app</guid><category><![CDATA[Full Stack Development]]></category><category><![CDATA[React Native]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Express]]></category><category><![CDATA[MongoDB]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Mobile Development]]></category><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Mon, 14 Jul 2025 19:23:11 GMT</pubDate><content:encoded><![CDATA[<p>Remember how I compared building this app to navigating Himalayan switchbacks? Well, buckle up we're hitting another hairpin curve in development! After solving the SOS/location sharing puzzle, I turned to my second core feature: <strong>creating trustworthy itineraries for travelers exploring Gilgit-Baltistan.</strong></p>
<h3 id="heading-why-real-guides-beat-ai-for-now"><strong>Why Real Guides Beat AI (For Now)</strong></h3>
<p>My vision was simple: connect travelers with battle tested itineraries crafted by local guides and tour companies who've spent decades navigating these mountains. These aren't algorithmically generated checklists they're wisdom packed routes refined through thousands of tourist footprints, unpredictable weather, and real world logistics.</p>
<p>I'll admit I initially flirted with AI-generated itineraries. But staring at ChatGPT's "helpful" suggestion to visit a glacier <em>during monsoon season</em> (a sure path to trouble), reality hit hard. <strong>Hallucinations + mountain safety = unacceptable risk.</strong> While I might revisit AI later if users demand it, for now, authenticity wins. Our itineraries will carry the fingerprints of experts like <em>Adventure Pakistan</em> and <em>Hunza Guides</em> – people who've literally saved tourists from whiteout blizzards.</p>
<h3 id="heading-the-web-first-temptation-and-its-wisdom"><strong>The Web-First Temptation (And Its Wisdom)</strong></h3>
<p>Confession time: I built the web version first partly because mobile development terrifies me. There, I said it! Fresh off learning Next.js and TypeScript, my inner code-nerd screamed: <em>"USE THE NEW TOYS!"</em> But beyond the shiny tech allure, two practical reasons won out:</p>
<ol>
<li><p><strong>No-Download Peace of Mind:</strong> If you're sharing your live location with worried parents, forcing them to <em>install an app</em> defeats the purpose. A web link works instantly on any device.</p>
</li>
<li><p><strong>Zero-Barrier Itineraries:</strong> Letting potential travelers browse guide curated routes without logins? Essential. First impressions shouldn't have friction.</p>
</li>
</ol>
<p>    <strong>Quick aside:</strong> That SOS/location sharing magic I mentioned last time? It’s fully designed but not yet coded, my brain’s mapped the switchbacks, but my fingers haven’t hiked the trail!</p>
<h3 id="heading-the-itinerary-quandary-weather-warnings-and-ais-slippery-slope"><strong>The Itinerary Quandary: Weather Warnings and AI's Slippery Slope</strong></h3>
<p>Here's where things got thorny. I wanted dynamic itinerary notes like: <em>"Heavy snow expected in Naltar tomorrow – pack microspikes and extra layers!"</em> Naturally, my mind jumped to AI-generated real time alerts. But after coffee chats with tour operators, cold water splashed that idea:</p>
<p><em>"What if AI hallucinates 'light sweater weather' during a blizzard?"</em><br /><em>"Will you stake your app's credibility on a chatbot's mountain judgment?"</em></p>
<p>Their point hit home. <strong>More variables = more uncertainty.</strong> While AI <em>could</em> theoretically synthesize weather data, terrain difficulty, and gear lists, one wrong suggestion could erode trust instantly. For now, I'm leaning toward human vetted static checklists (e.g., <em>"Always carry oxygen in Khunjerab Pass"</em>) with manual weather alerts. But I'm torn where should AI's role <em>safely</em> begin? I'd love your thoughts!</p>
<h3 id="heading-next-stop-react-native-and-the-mobile-frontier"><strong>Next Stop: React Native and the Mobile Frontier</strong></h3>
<p>The web app is my training wheels. Now comes the real climb: <strong>building the mobile experience with React Native.</strong> As a mountain mom with zero native app experience, I equal parts dread and crave this challenge. Will I weep over deployment quirks? Probably. Will seeing that first SOS button work on a phone in the Karakoram make it worthwhile? Absolutely.</p>
<p><em>To fellow builders wrestling with AI tradeoffs:</em> How do you balance innovation with reliability in high stakes contexts? Hit reply your war stories might just save my sanity (and my users' safety)!</p>
<p><em>// This mom coder, signing off from a misty valley, wondering if React Native has a "panic mode" tutorial.</em> 🏔️💻</p>
]]></content:encoded></item><item><title><![CDATA[The Rocky Road to Clarity: Defining My Travel Safety App as a Mom-Coder in the Mountains]]></title><description><![CDATA[(and yes, that process has a name!)
Hey wanderers and builders! 👋 I’m a housewife and solo developer living in the breathtaking but treacherous mountains of Gilgit-Baltistan (GB), juggling code, motherhood (my 6 and 3 year-old tornadoes 😅), and the...]]></description><link>https://the-rocky-road-to-clarity.hashnode.dev/the-rocky-road-to-clarity-defining-my-travel-safety-app-as-a-mom-coder-in-the-mountains</link><guid isPermaLink="true">https://the-rocky-road-to-clarity.hashnode.dev/the-rocky-road-to-clarity-defining-my-travel-safety-app-as-a-mom-coder-in-the-mountains</guid><category><![CDATA[Full Stack Development]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[MongoDB]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Sehrish Aslam]]></dc:creator><pubDate>Mon, 14 Jul 2025 08:56:12 GMT</pubDate><content:encoded><![CDATA[<p><em>(and yes, that process has a name!)</em></p>
<p>Hey wanderers and builders! 👋 I’m a housewife and solo developer living in the breathtaking but treacherous mountains of Gilgit-Baltistan (GB), juggling code, motherhood (my 6 and 3 year-old tornadoes 😅), and the daily chaos of mountain life. Today, I’m sharing the <strong>first brutal truth</strong> of building my travel safety app: <strong>the agony of defining <em>what</em> this app should actually DO.</strong></p>
<h3 id="heading-that-exhausting-back-and-forth-its-called-product-discovery"><strong>That Exhausting Back-and-Forth? It’s Called Product Discovery.</strong></h3>
<p>You know that phase where you’re drowning in ideas, scribbling features on napkins, questioning every choice, and wondering if <em>any</em> of it solves real problems? That’s <strong>Product Discovery</strong> the critical process of defining:</p>
<ul>
<li><p><strong>What</strong> your app does (and <em>doesn’t</em> do).</p>
</li>
<li><p><strong>Which features</strong> genuinely solve user pain points.</p>
</li>
<li><p><strong>Why</strong> it deserves to exist.</p>
</li>
</ul>
<p>For weeks, I’d put my kids to bed, open my notebook, and spiral:</p>
<blockquote>
<p><em>“Should it just track location? Or also send SOS alerts? What if there’s NO signal? How do I make it work offline? Should it notify emergency contacts automatically? Wait—is this even technically possible?!”</em></p>
</blockquote>
<p>Back and forth. Forth and back. <strong>Mom guilt</strong> knocking (“Should I be sleeping instead?”). <strong>Doubt</strong> whispering (“Who am I to build this?”). The mountains outside my window stunning yet deadly reminded me <em>why</em> I started: after seeing news of travelers found dead in ravines days after vanishing. GB’s beauty hides peril: no network, crumbling roads, and zero margin for error.</p>
<h3 id="heading-why-product-discovery-felt-like-hiking-through-a-blizzard"><strong>Why Product Discovery Felt Like Hiking Through a Blizzard</strong></h3>
<p>As a solo dev with limited time (naptime = coding time!), every decision carried weight:</p>
<ol>
<li><p><strong>Feature Triage:</strong> I wanted EVERYTHING live tracking, offline maps, automated checkins. Reality check? I’m one person. I forced myself to ask: <em>“If I build ONLY ONE THING, what saves lives?”</em> Answer: <strong>Offline location tracking with automated emergency alerts.</strong> Everything else? V2.</p>
</li>
<li><p><strong>Tech Stack Panic:</strong> React Native? Flutter? Pure native? With spotty electricity and a toddler climbing my lap, I needed:</p>
<ul>
<li><p><strong>Cross-platform</strong> (I can’t maintain two codebases).</p>
</li>
<li><p><strong>Shared logic</strong> (backend + web + mobile in one place).</p>
</li>
<li><p><strong>Speed.</strong><br />  So I chose: <strong>TurboRepo + React Native + Express.js</strong>. One monorepo to rule them all (shoutout to NPM workspaces!).</p>
</li>
</ul>
</li>
</ol>
<h3 id="heading-how-i-tamed-the-chaos-sort-of"><strong>How I Tamed the Chaos (Sort Of)</strong></h3>
<ol>
<li><p><strong>Embraced the “Minimum”:</strong> My MVP (Minimum Viable Product) became painfully simple:</p>
<ul>
<li><p>Logs your route <em>offline</em> via GPS.</p>
</li>
<li><p>If you miss a checkpoint, it alerts your emergency contacts <em>when signal returns</em>.</p>
</li>
<li><p>No fancy UI. No social features. Just a digital lifeline.</p>
</li>
</ul>
</li>
<li><p><strong>Leaned Into Constraints:</strong></p>
<ul>
<li><p><strong>Time?</strong> I code during preschool hours and after bedtime.</p>
</li>
<li><p><strong>Resources?</strong> My “office” is the kitchen table. My “team” is my husband’s feedback after kids sleep.</p>
</li>
<li><p><strong>Connectivity?</strong> I test in GB’s dead zones (which, sadly, are everywhere).</p>
</li>
</ul>
</li>
</ol>
<p><strong>Progress So Far: Monorepos &amp; Mom Wins 🚀</strong></p>
<p>I’ve set up the bones:</p>
<pre><code class="lang-plaintext">travel-safe-app/  
├── apps/  
│   ├── mobile (React Native)  
│   ├── web (Next.js)  
│   └── backend (Express)  
└── packages/  
    └── shared (Typescript utils, DB models)
</code></pre>
<p><strong>TurboRepo</strong> is my sanity-saver. One <code>npm install</code> to rule them all? <em>Yes, please.</em></p>
<h3 id="heading-why-this-matters-to-me-and-maybe-you"><strong>Why This Matters to Me (And Maybe You?)</strong></h3>
<p>I’m not just building an app. I’m coding against helplessness. Every time I hear about a missing hiker in these mountains, I think: <em>“Could my app have given them a fighting chance?”</em></p>
<p>To every solo dev, mom, or dreamer staring down a mountain of doubt:</p>
<blockquote>
<p><strong>Product Discovery isn’t procrastination it’s laying the foundation.</strong><br />Your constraints? They’re your superpower.</p>
</blockquote>
<p><strong>Next Up:</strong> How I’m hacking offline GPS tracking in zero-network zones! (Spoiler: It involves file syncing and sheer stubbornness 😤).</p>
<p><em>Follow my journey here on Hashnode! I’ll share code snippets, mom-fails, and the raw reality of building tech where the wifi stops but the cliffs don’t.</em> ✨</p>
<p><strong>P.S.</strong> What’s the <em>hardest</em> part of your Product Discovery phase? Share below—let’s suffer together! 👇</p>
<p><em>🌍 About the App: "Safe Trails GB" aims to reduce traveler fatalities in remote areas by providing offline location tracking and emergency alerts. Built with love (and chaos) from the mountains of Pakistan.</em></p>
]]></content:encoded></item></channel></rss>