What Fresh Bug Is This?

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) 🧠
Lesson | Truth |
💻 localhost ≠ your computer (on mobile devices) | Use 192.168.x.x , obviously! |
🔐 SecureStore only loves strings | No strings, no love. |
🪄 Tailwind is magic... until it misfires | Maybe use it later. |
👶 Toddlers are living while-loops | while (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.
👣
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).