_blogs
// blogs / 20260817.md
// blogs / 20260817.md
Dev Log: August 17 Wrap-up
Overview
Today was mostly about closing the loop on a week that felt like a constant juggle between mobile UI polish and deep-seated backend plumbing. I finally feel like the project is in a 'stable' state where I'm not just fighting fires, but actually making the system smarter.
What I Worked On
Automating the Boring Stuff
I spent a good chunk of time yesterday and today finalizing the CI/CD pipeline. I was getting tired of manually building signed APKs every time I wanted to test a release candidate. Now, it's all handled by a GitHub Actions workflow.
One thing I had to be careful with was making sure the build didn't break for anyone else just because they don't have my local signing keys. I added a simple check in the build script to see if the environment variables exist before attempting to sign the app. It’s a small bit of defensive coding that saves a lot of 'why is the build failing?' headaches later.
Squashing the "Ellipsis" Mystery
I finally figured out why my transaction deduplication was failing occasionally. It turns out the system was truncating long strings with a specific ellipsis character (…) instead of just cutting them off. My parser was looking for an exact match, so Store Name and Store Nam… looked like different entities.
I wrote a quick utility to sanitize these strings before they hit the database. It’s one of those 'invisible' fixes that makes the data quality feel 10x better without changing a single pixel on the screen.
// Sanitizing inputs to prevent duplicate entries caused by truncation
fun sanitize_entity_name(input: String): String {
val special_ellipsis = "\u2026"
return input.replace(special_ellipsis, "").trimEnd('.')
}
Backend Stability and Feedback
On the backend side, I finished the translation layer for our lead intake errors. Previously, if a user submitted a duplicate, they just got a generic server error. Now, the API sends back a structured response that the UI can actually use to tell the user what went wrong. It feels much less like a 'black box' now.
I also fixed a nagging session issue where the chat widget would lock users out on a page refresh. The logic was accidentally nuking valid tokens by requesting new ones too aggressively. Adding a simple validation check before the fetch call fixed the loop and stopped the 'Access Denied' errors from popping up.
Wrapping Up
It’s been a marathon of context-switching between Kotlin, Gradle, and backend decorators, but the foundation feels solid now. Tomorrow, I’m planning to look more into the AMOLED theme refinements I started earlier this week—making things pretty is usually a nice reward after a few days of heavy debugging.