We spent most of last week inside the bottom sheet of mytraces — the trip-companion app we've been writing alongside pouch. It's the newer cousin in the family: same sage palette, same paper-cream feel, but a much denser surface. A map. A sheet that slides up from the bottom. A chip in the corner that follows which stop you tapped. A column of shortcut chips for "find food nearby" and "save this place." Small pieces of state all needing to agree with each other.
They didn't agree. A user told us — politely — that tapping the back arrow on the sheet sometimes opened a full-screen "discover nearby" dialog. Which is not a thing back arrows are supposed to do.
How we got here
A quick aside, because we haven't told this part of the story before.
Most of what you see across our apps lives in motif: the shared design system — colors, type, buttons, the look. We've mentioned it. What we haven't mentioned is its quieter sibling, spakit: the small toolkit that handles how the apps move. URL changes, drawers that slide in, modals that close when you tap outside, the bottom sheet itself. About five hundred lines, total. Deliberately small.
Spakit grew out of pouch when the mobile and desktop apps both needed the same plumbing. Mytraces was the first app to push on it hard — denser screens, more moving parts. And like every spine, it pushed back. Last week was the pushing.
The bug, told plainly
You're on the map. You've tapped a place; a sheet slides up with details. You tap the back arrow at the top of the sheet. The sheet retreats into its simpler form — a list of the day's stops. So far, so good.
Then, a moment later, you tap something else anywhere on the screen, and a "what do you want to find nearby?" dialog fills the screen. Where did it come from?
We were sure we'd found the culprit the first time. There's a small chip in the top-left of the map — when no place is selected, it changes into a "discover nearby" button. We figured: the back arrow cleared the selection, the chip silently turned into a discover button at the same spot, the user's next tap landed on it. Cause found, fix shipped.
Still happening.
The actual culprit was a column of shortcut chips lower down on the map — "Eat nearby," "Save here." They're supposed to disappear when the bottom sheet is up. They looked like they disappeared. They were just transparent. The tap area was still there. Tapping in what looked like empty map space was landing on an invisible "Eat nearby" chip — and "eat nearby" opens the discover dialog.
Two words in the stylesheet had been arm-wrestling each other and lost track of who was supposed to win. We rewrote the rule, the chips actually hid, and the bug went away. Anticlimactic.
What stayed with us
The fix was easy once we found it. The chase wasn't. We'd gone after the wrong thing first because two different pieces of UI — the corner chip and the invisible bottom-left chip — could both look like "the thing the user just tapped after the back arrow." There was no single place to ask "what is the screen actually doing right now."
And there was a second bug riding along: picking a day from inside the bottom sheet to focus on its stops would sometimes also make the sheet disappear. A different surface, the same shape of problem. A tiny side-effect, attached to a routine operation, with a much larger blast radius than it should have had. Five steps across two files, each one technically correct on its own; the chain not.
The way to make this class of bug stop happening isn't more vigilance. It's giving each piece of the UI one place to keep its state, and asking it to mind its own business. The map keeps the map's state. The sheet keeps the sheet's state. Neither reaches into the other; if one needs to react to the other, it watches, doesn't poke.
What we changed
Three small surgeries, after the chase.
The topbar now tells you where you are: the trip, the day if you've focused on one, and the stop if you've tapped one. It reads like a quiet breadcrumb. It also doubles as a debug tool — if something unexpected happens to the state, the topbar shows it first. Cheap, useful both ways.
The map's markers know how to update themselves when you change which day you're looking at, without anyone having to tell them. They watch the "which day" value directly. One fewer thread for bugs to climb.
And the bottom sheet got the biggest surgery: its "what mode am I in / how tall am I / am I open" all became one piece of state instead of three. The sheet's actual appearance is now a faithful reflection of that state — nothing else writes to the sheet directly. If the user does something that should change how the sheet looks, the only route is through that one piece of state.
Where this lands
Mytraces production is running on the cleaner shape now. The bug is gone in a way that means cousins of it won't easily reappear, because the class of mistake that caused it isn't possible anymore in the parts we cleaned up. (It's still possible in other parts. We have a punch list.)
Mytraces itself, separately, is close to the moment where we'll publish it for a wider audience. mytraces.net goes live shortly — it'll join pouch as the second app in the Pointegrity family on its own subdomain. The curated ontology behind it now covers Taipei, Taichung, Kyoto, Tokyo, and a handful of smaller regions. The trip planning works. The map works. The bottom sheet — finally — works.
The thing this week most clarified isn't a feature. It's that when you grow a family of small apps off a shared spine, the apps push the spine and the spine pushes back. We sanded a seam. Both sides got a little sharper. There will be more weeks like this — every new app finds the shared bits' tender spots in its own way — and that's the work, when the spine is real.
← All journal posts