_blogs
// blogs / 20260830.md
// blogs / 20260830.md
Dev Log: August 30 Wrap-up
Overview
Today was a mix of satisfying UI wins and those incredibly specific, head-scratching bugs that remind me why regex is both a gift and a curse. I spent most of the day in the ExpenseTracker codebase, mostly focused on tightening up the data parsing and fixing a few distribution headaches.
What I Worked On
Chasing Periods in the Parser
I’ve been tracking a weird edge case where some transactions weren’t de-duplicating correctly. It turns out that some banks like to get creative with their formatting—specifically, adding a period after abbreviations like "No." or "Ref.".
It sounds trivial, but that tiny . was causing my parser to fail, which meant the app would miss the reference number and fallback to a "fuzzy" match. I went in and updated the patterns to optionally consume that trailing period before hitting the separator.
// Generalizing the pattern to handle "Ref.", "No.", or "ID."
val updatedPattern = Pattern.compile(
"(?:Ref(?:erence)?(?:\\s*(?:No|Number|ID))?\\.?)" +
"\\s*[:#-]?\\s*(\\d{6,20})",
Pattern.CASE_INSENSITIVE
)
It’s a small change, but it makes the cross-channel dedup much more robust, especially for those specific bank SMS formats that were failing silently before.
Filtering the Noise
The cash flow chart is great, but seeing spent and received data mashed together isn't always helpful if you're just trying to track a budget. I added a toggle to the chart components so I can now filter by "Spent," "Received," or "Both."
I had to refactor how I calculate the maxAmount for the Y-axis so the scale adjusts dynamically based on which filter is active. Watching the chart lines smoothly re-scale as you toggle filters is one of those small UI polish moments that feels really good.
Private Repo Update Woes
I hit a bit of a wall with the in-app update checker. If you're hosting a private repo on GitHub, the browser_download_url for a release asset actually returns a 404 if you're trying to fetch it via the app, even with a valid token.
I had to pivot the logic to use the GitHub REST API asset URL instead. It’s a bit more involved because you have to handle the redirect properly, but it finally eliminates those "File Not Found" errors during an update. While I was at it, I forced an update check on app launch just to make sure I'm always running the latest fixes as I push them.
Wrapping Up
Bumped the version to 1.5.3 and shipped the fixes. It feels good to have the parser behaving again and the chart feels way more functional now. Tomorrow, I might take a break from the logic and look into some more UI themes or maybe just clean up some technical debt in the repository layer.