essay · 7 December 2025 · 7 min read
Stack drift: how growing products forget their own story
On the moment a product still works but its logic stops cohering.
Some failures announce themselves loudly. You tap a button and nothing happens. A screen freezes. A page collapses under its own weight. You know what went wrong the moment it hits you.
But there’s another category — the quiet kind. The product still works. The flows still launch. Everything loads, more or less. Yet something feels off. You move around an app you once knew by heart, and suddenly you’re working harder to make sense of it. Users feel this immediately. They might not pinpoint a single flaw, so they say it in softer terms: they’re unsure, they can’t find things as easily, the experience doesn’t feel like itself anymore.
That’s stack drift.
And no, it isn’t just feature creep or UX debt. Those play their parts, but drift is a deeper fracture. It’s when the system stops speaking one language. Every feature works fine in isolation, yet together they fail to form a coherent world. You move through them like someone walking through rooms built by different architects who never compared notes.
I first understood this feeling in Milan, not inside an app, but in Malpensa airport.
Airports have a way of exposing bad architecture
I arrived early, half dazed, expecting the usual rhythm: follow the signs, trust the flow, exit without thinking. Instead, every corridor felt like it belonged to a different decade. One sign told me to head toward arrivals, another insisted I was already there, and the escalator chose a third opinion entirely. I ended up in a parking structure with no clear way back, then in a corridor that felt suspended from the rest of the building. Eventually I started asking random travelers, and each pointed vaguely in a different direction, as if the airport itself had become a rumor.
Nothing was malfunctioning. The lights worked. The elevators opened. The taxis were waiting right where they should be. But nothing belonged together. Malpensa had grown in pieces, each designed to solve a hyper-local problem without anyone rewriting the map of the whole. The airport didn’t guide me; it forced me to assemble its logic myself.
When your food app decides it’s also BestBuy
A few weeks later, back home, I opened Haat, my go-to food delivery app. I knew its rhythm. The red palette that stirs appetite, the playful loading animations, the gentle push toward adding dessert I didn’t need. Haat had a personality, and it stuck to it.
Then I saw a new tab: Haat Market.
Grocery. Books. Electronics. Household goods. All inside the same frame I associated with shawarma and burgers.
I hadn’t even placed an order there, but the presence of those categories was enough. My mental model cracked. The app was no longer a food app. It wanted to be a supermarket, an e-commerce platform, and a delivery service all at once. BestBuy, but in a red palette. Strategically, sure, you can justify it: expand the basket, attract new vendors, capture more verticals. But on the user’s side of the screen, the identity began to wobble.
The cracks widened when I tapped a Galaxy phone listing just out of curiosity. What I got was a model number dropped into the same layout used for fries. No specs. No warranty details. No compatibility notes. No sense that the template understood what it was describing.
A burger had more product information than a $500 device.
The palette didn’t help. Red makes sense for food; it nudges appetite and speed. It makes less sense for electronics, which usually lean on blues and silvers that signal reliability. Opening a phone page framed in order now, your fries are getting cold energy felt comical.
Maybe Haat Market brings in revenue. Maybe it increases user retention. But the existential question hangs in the air: once your identity starts stretching, where does it stop? If phones fit under a food app’s umbrella, then in theory anything does. Travel bookings. Loans. Insurance. Funeral services. The slope is not even slippery; it’s frictionless.
And we’ve seen this elsewhere. Snapchat began as disappearing messaging. Then came a news hub, a map of your friends, AR shopping, lenses, shows, monetization experiments. Each addition had a strategy deck behind it. But taken together, they blurred the original idea into something hard to name. Users didn’t riot. They just drifted too, unsure of what the product thought it was anymore.
Haat is nowhere near that scale, but the shape is familiar: an experience that still loads, still functions, yet no longer feels centered. That is what stack drift basically is.
Consistency isn’t a cure
Design teams tend to worship consistency. Same spacing, same buttons, same tokens, same grid. All important, all helpful, all good hygiene. But consistency alone can’t save a drifting product.
You can build a perfectly consistent interface that is totally incoherent.
Coherence is deeper. It’s the alignment between what a product says it is and how its features behave together. Coherence gives users a stable mental model; they know what world they’re in and how it works. Once coherence cracks, users start carrying that interpretive burden themselves. They pause more. They question whether a tap will lead where they expect. They negotiate contradictions silently.
What is stack drift?
Stack drift is the slow unraveling of a product’s internal logic. It happens when features are added layer after layer without a unifying story to hold them together. Everything still works on its own, yet the system as a whole stops feeling like one world. Users sense the fracture before anyone else; the product hasn’t broken, but the meaning binding it has slipped out of alignment. Drift isn’t chaos or failure. It’s quiet disorientation — the moment a product forces people to navigate contradictions it never intended to create.
Compositional growth
The antidote to drift isn’t minimalism or resisting growth. It’s compositional growth: expansion that strengthens the story instead of fracturing it. Growth is inevitable. The question is whether the architecture can absorb the new weight without buckling.
Compositional growth forces harder questions:
- Does this feature reinforce the identity or pull it sideways?
- Will the user’s mental model stretch or break?
- Should this live inside the same app, or beside it as a sibling brand?
- If it must live here, what new templates does it require?
Haat could have grown Market as a companion interface. Shared accounts, shared couriers, but a different skeleton for retail. Or, if everything needed to stay in one app, each domain deserved its own structure: food flows built for appetite, grocery flows built for clarity, electronics flows built for specs and trust. Even the palette could have expanded modularly without abandoning the core identity.
Some products pull this off beautifully: Figma added FigJam and somehow made it feel obvious, as if the tool had always planned for it. WeChat absorbed messaging, payments, services, commerce, mini-apps, and still feels like one coherent world because the interaction language never breaks. Even Facebook, as bloated as people claim it is, never really loses its anchor: your social graph.
Because once a product has a clear anchor, it can grow without drifting.
Drift always starts in the org chart
It’s easy to blame components or flows, but drift rarely originates inside Figma. It usually begins with structure. Teams split by verticals, each chasing their own KPIs, start shipping experiences that subtly contradict one another. Conway’s Law does the rest: products mirror the organizations that build them.
That’s why coherence must be owned above the feature level. Someone has to protect the architectural story. Design systems help, but only when they evolve into governance. A library of polished components can still be used to create a disjointed world.
And the metrics matter. If teams earn praise for velocity, they’ll optimize for more. If their targets revolve around local engagement, they’ll optimize for depth in their silo, not resonance between silos. Coherence needs its own scoreboard, its own incentives, its own language of success — to the point where a feature removal is celebrated with the same excitement as a launch, simply because it made the whole system clearer.
What stays in memory
When I picture Malpensa now, I don’t remember any hardware. I remember the disorientation, the moment the map dissolved. When I think about Haat, I don’t recall a bug. I recall the instant a food app tried to sell me a phone with the enthusiasm of a shawarma vendor.
Both systems worked. Both delivered what they promised. Yet both left a residue of cognitive friction.
That residue is the cost of stack drift.
Growth will keep coming. Markets demand it. Teams chase it. Roadmaps fill themselves effortlessly. The only real choice is how that growth lands: whether it tightens the system’s identity or quietly unravels it.
A product can expand without losing its voice. Or it can expand until the voice becomes noise.
That’s the whole story of drift. And the warning.
And next time I’m going to Milano, I’m landing in Bergamo, not Malpensa. That’s for sure.
Comments