What Fresh Bug Is This?

Sehrish AslamSehrish Aslam
3 min read

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 time, I thought:

“Let’s just build a simple login screen for my React Native app.”

Ha.
Haha.
😐

What followed was a glorious mess of:

  • 🔌 mysterious plugin errors,

  • 🌐 ghostly network issues,

  • 🔐 SecureStore tantrums,

  • and 👶 a toddler who thinks "Why?" is the only word in the dictionary.


The Tailwind Spiral

It all started with ambition:

“Let’s use Tailwind for mobile styling! It’ll be fast and elegant!”

So I installed nativewind, added the plugin in babel.config.js, hit save...

Boom.

pythonCopyEdit.plugins is not a valid Plugin property

Me:

“I… didn’t even touch plugins. Who touched plugins?!”

Turns out I either:

  • added the plugin wrong,

  • added it too early,

  • or summoned some ancient CSS curse.

After uninstalling, reinstalling, purging caches, and spiritually cleansing my project (basically an exorcism), I gave up.

  • Tailwind: ❌

  • Vanilla stylesheets: ✅

  • Sanity: 🤷‍♀️


The Case of the Disappearing Backend

Next: connect the mobile app to my Express backend for login.

Tried localhost:5000/api/auth/login.
Failed.
Tried 172.x.x.x.
❌ Failed.
Tried praying.
🙏 Still failed.

My phone was like:

“I don’t know where localhost is. Is it a tourist spot in Gilgit?”

Eventually realized: Expo Go can’t access localhost on your laptop.
It needs your actual IP address, like 192.168.1.20.

So I ran ipconfig, got the right IP, and finally connected.

Meanwhile, my toddler, noticing my increasing frustration, chimed in:

“Mama, why doesn’t your app work?”

Me: “Because… I used the wrong localhost.”
Her: “Why?”
I almost said, “Because Mama was dumb,” but figured I shouldn’t model low confidence in tech this early.
So I tried: “Because localhost only works on the same device. My phone isn’t my laptop.”
Her: “Why?”
Me: “Because… network interfaces, IP addresses, TCP routing, DNS something something…”
Her: “Why?”

By the end, I was muttering "why" not just to her, but to:

  • my backend,

  • my frontend,

  • Expo,

  • SecureStore,

  • and every life decision I’ve ever made.

SecureStore Isn’t That Secure… If You Don’t Use Strings

Finally, success! I received the token from backend after login.
Victory was near.

Then Expo hit me with this:

vbnetCopyEditInvalid value provided to SecureStore. Must be string.

Of course.
SecureStore only stores strings. I had given it an object. Or maybe undefined. Or maybe a half baked promise of success.

The fix:

tsCopyEditawait SecureStore.setItemAsync("refreshToken", JSON.stringify(token));

Moral of the story:
If you don’t stringify(), you’ll sufferify().

What I Learned (Again) 🧠

LessonTruth
💻 localhost ≠ your computer (on mobile devices)Use 192.168.x.x, obviously!
🔐 SecureStore only loves stringsNo strings, no love.
🪄 Tailwind is magic... until it misfiresMaybe use it later.
👶 Toddlers are living while-loopswhile (true) { ask("why"); }

✅ What Works Now:

  • ✅ Login screen

  • ✅ Talking to backend

  • ✅ Receiving & saving token

  • ✅ Redux state updated

  • ❓ Knowing where it breaks next... stay tuned.

Coming Up Next

🏠 Home screen,
📍 Location tracking,
📴 Offline support...

… if I don’t go offline myself first. ☕️

Until then,
Still debugging in pajamas, coffee in hand, toddler on lap.
👣

1
Subscribe to my newsletter

Read articles from Sehrish Aslam directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sehrish Aslam
Sehrish Aslam

I am a Python developer making my journey into Python backend development. I'm mother of Ayra (2 years) and Aman (4 years old).