www.opabinia.com.au
mikechiao.substack.com
The ghost is (hopefully) busted! Your grocery list should now correctly clear out after a trip, and you won't be bothered about duplicates from the past.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
The ghost is (hopefully) busted! Your grocery list should now correctly clear out after a trip, and you won't be bothered about duplicates from the past.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
The fix was to teach the app what "deleted" really means. I had to go into the core database logic and add the proper filter to make sure it only loads active, non-deleted items.
It's humbling how one tiny, missed filter can create such a confusing experience. Always learning.
The fix was to teach the app what "deleted" really means. I had to go into the core database logic and add the proper filter to make sure it only loads active, non-deleted items.
It's humbling how one tiny, missed filter can create such a confusing experience. Always learning.
It turned out to be a deep data-layer bug. The app was correctly marking the old items as "deleted" in the local database, but it wasn't filtering them out when loading the list!
It was like inviting a ghost to the party.
It turned out to be a deep data-layer bug. The app was correctly marking the old items as "deleted" in the local database, but it wasn't filtering them out when loading the list!
It was like inviting a ghost to the party.
This was a frustrating one. You'd finish your trip, everything would move to your inventory, but the app was secretly holding onto a "ghost" of your old list.
So the next time you'd add "chicken," it would pop up like, "Hey, you're already buying this!" which was just confusing.
This was a frustrating one. You'd finish your trip, everything would move to your inventory, but the app was secretly holding onto a "ghost" of your old list.
So the next time you'd add "chicken," it would pop up like, "Hey, you're already buying this!" which was just confusing.
It’s a humbling lesson. This kind of polish isn't "extra"; it's a core part of the experience. Still learning how much effort this takes, but it's worth it.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
It’s a humbling lesson. This kind of polish isn't "extra"; it's a core part of the experience. Still learning how much effort this takes, but it's worth it.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
I also hunted down other visual bugs:
"Invisible" buttons on the recipe image that blended into the photo.
Overlapping text in dialogs (like "Unit" and "g" on top of each other).
A truncated "Add to List" button that just... looked... awk...
I also hunted down other visual bugs:
"Invisible" buttons on the recipe image that blended into the photo.
Overlapping text in dialogs (like "Unit" and "g" on top of each other).
A truncated "Add to List" button that just... looked... awk...
After a few failed attempts, I landed on a clean, two-column layout. Now, all ingredient names are perfectly aligned, and quantities (even "to taste") sit neatly beside them.
It's so much easier to read. A small change that makes the app feel 10x more professional.
After a few failed attempts, I landed on a clean, two-column layout. Now, all ingredient names are perfectly aligned, and quantities (even "to taste") sit neatly beside them.
It's so much easier to read. A small change that makes the app feel 10x more professional.
The main bug was my ingredient lists. An item like "1 cup flour" would align, but "basil leaves" or "to taste salt" would be offset, breaking the whole layout.
It looked messy and made the lists hard to scan quickly.
The main bug was my ingredient lists. An item like "1 cup flour" would align, but "basil leaves" or "to taste salt" would be offset, breaking the whole layout.
It looked messy and made the lists hard to scan quickly.
The new logic is much safer. Before uploading any change, the app now asks the server, "Is your data newer?" It only uploads if its local data is actually the newest. A lesson in building defensively.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
The new logic is much safer. Before uploading any change, the app now asks the server, "Is your data newer?" It only uploads if its local data is actually the newest. A lesson in building defensively.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
Fixing that led me to another potential nightmare: the "sync conflict." What if you used the app on two devices? Your phone could accidentally overwrite new cloud data with its old, stale data. A recipe for data loss. Still so much to learn about data sync.
Fixing that led me to another potential nightmare: the "sync conflict." What if you used the app on two devices? Your phone could accidentally overwrite new cloud data with its old, stale data. A recipe for data loss. Still so much to learn about data sync.
The fix was a single-line change to listen for "user updates," not just "user sign-ins."
The real lesson? This time, I've locked in the fix with a new unit test. Now, if I ever break this specific logic again, my tests will fail instantly.
The fix was a single-line change to listen for "user updates," not just "user sign-ins."
The real lesson? This time, I've locked in the fix with a new unit test. Now, if I ever break this specific logic again, my tests will fail instantly.
I was looking in all the wrong places. The problem wasn't the migration failing—it was never starting.
Turns out, a previous refactor I did had caused this "lost signal" bug to reappear. A classic regression that's been driving me mad!
I was looking in all the wrong places. The problem wasn't the migration failing—it was never starting.
Turns out, a previous refactor I did had caused this "lost signal" bug to reappear. A classic regression that's been driving me mad!
It feels like a small change, but it's a huge step for trust and stability. The goal is an app that's not just smart, but also safe and predictable. Still so much to learn on this journey.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
It feels like a small change, but it's a huge step for trust and stability. The goal is an app that's not just smart, but also safe and predictable. Still so much to learn on this journey.
Building Opabinia, one bug at a time. 🛒🦐 opabinia.com.au
Fixing the UI was just the start. It uncovered a subtle bug where a first-time Google sign-up didn't get the same clean setup as an email sign-up. It's a small detail, but these inconsistencies are the ones that can cause confusing problems for users down the line.
Fixing the UI was just the start. It uncovered a subtle bug where a first-time Google sign-up didn't get the same clean setup as an email sign-up. It's a small detail, but these inconsistencies are the ones that can cause confusing problems for users down the line.
The solution was to stop guessing and just ask. Now, if you have an unsaved list, the app presents a clear, simple choice first:
* Save & Link this list to an account.
* Discard this list & Sign in.
You are always in control.
The solution was to stop guessing and just ask. Now, if you have an unsaved list, the app presents a clear, simple choice first:
* Save & Link this list to an account.
* Discard this list & Sign in.
You are always in control.
The old sign-in panel tried to be clever, showing different options based on what it thought you wanted to do. But I'm learning that "clever" can easily become confusing. Worse, it created a path where you could accidentally delete your local list. Not a great experience.
The old sign-in panel tried to be clever, showing different options based on what it thought you wanted to do. But I'm learning that "clever" can easily become confusing. Worse, it created a path where you could accidentally delete your local list. Not a great experience.