Where the Map Ends

When you integrate a design system into a legacy product, you learn to be patient. The codebase we were working in had been growing for over two decades. Inline CSS next to string-concatenated templates next to JavaScript tangled up in business logic. Nobody could tell where one ended and the other began. You don't fix that in a quarter. You don't fix it in a year.

So we took a different approach. We built a modern frontend layer underneath the existing UI and styled it to look identical to what was already there. Same colors, same spacing, same components. Product teams could use our design system without fighting the old infrastructure. Customers never noticed anything had changed. That was the point. Early on, the work was about earning a foothold within the software, without triggering resistance.

It worked. Slowly, then all at once, teams started building with the new tools. It turned out the disguise was the perfect cover. Nobody questioned the work because nothing on the surface seemed to be changing. Behind that surface, we had quietly replaced most of the frontend stack: the components teams reached for, the styling that held them together, the JavaScript underneath, the build pipeline that shipped it all. The foundation was solid.

And then we started running into the limits of our own disguise.

The design system could do more than the old interface allowed, but nobody could see or use that, because the disguise required everything we shipped to look and behave like what came before. The gap kept growing. Meanwhile, signals were accumulating that the dated UI was costing us. Conversations with potential customers. Feedback from sales. The occasional lost deal where the product could do the job, but the way it looked made customers doubt its capabilities.

Nobody had touched the visual design in over a decade. Not because nobody cared. Because nobody wanted to be the ones to try.

Not laziness, not indifference. It's organizational inertia, the tendency of systems and the people inside them to stay exactly where they are, or to keep moving in the direction they've always moved, not through active resistance but through the sheer accumulated weight of everything that came before. The longer a system has been running, the harder it is to change course. Ours had been running for over two decades.

The hidden preparation

At some point we realized the invisible approach had taken us as far as it could. As long as we kept the design system hidden, its potential stayed locked. Inside the team, we had a new visual direction ready: modern, simple, unobtrusive. A safe bet. Something that could earn trust before asking for anything. But it was sitting in a drawer. The disguise had served its purpose. It had let us build without triggering the inertia that would have stopped us earlier. Now it was in the way.

We mapped out which conversations needed to happen, and in what order. We did a pre-mortem on everything that could go wrong. If this fails six months from now, what was the reason? The list was long. A codebase with unknown traps around every corner. No established way to communicate changes to sales. No infrastructure to collect real feedback from users. We were confident we could navigate it, but humble enough to know there were things we couldn't see yet.

None of this was visible to the rest of the organization. But it meant that when the moment came, we weren't starting from zero. We had a direction, a sequence, and an honest picture of the risks.

Then leadership started asking the same questions we had been quietly sitting on. The product was costing deals. The dated UI was no longer something the company could keep absorbing. They had arrived at the same place we had, just from a different direction. That kind of alignment doesn't happen often. When it does, you act.

Aligning with leadership meant agreeing on a direction. The word we landed on was beauty. The immediate work was narrower than the word suggests. The product would stop working against itself. Cluttered surfaces would clear. Dated metaphors would go. Real beauty was a longer arc.

What we didn't have was a picture of what that beauty would actually look like. That question came up constantly once we started. We never fully answered it, because we genuinely didn't know yet. We wanted to react to feedback rather than defend a fixed plan. That turned out to be the right call and also the hardest part to hold. People don't love "we'll know when we get there" as an answer. But it was the honest one.

Starting without a net

We started with things that were easy to reverse.

Change the background color from a muddy beige to a clean neutral. Update the font from Arial to Inter, like every other product on the internet. We picked the simplest, safest changes we could. Not because we lacked ambition, but because we knew that every change was a step into territory we hadn't fully mapped. Anything else risked triggering the inertia.

There was another reason to be careful. The codebase had its own logic. Over a decade of features had been added without anyone stepping back to look at the whole. Workflows that made sense if you had used the product for years were invisible traps to anyone new. Some things that looked like bugs were actually decisions. Edge cases someone had handled years ago for a specific customer, never documented, never explained. You don't learn that from reading code. You learn it from breaking things and dealing with the fallout.

So we kept each change small enough that if something went wrong, we could pull it back within hours. It was the only responsible way to move inside a system this size without a complete map of what everything touched.

Every break taught us something the code wouldn't. Some of it was technical, like styles bleeding into unexpected corners of the product. But the most important ones were human. Every change that shipped was a test of how much the organization could absorb without losing confidence in us. We were learning the tolerance of the system, not just the code.

Problems you manage, not fix

Technical problems are solvable. You break something, find the cause, fix it, move on. Social, political and organizational problems work differently. You don't fix them and move on. You manage them, and they keep demanding attention. There is no definitive solution, only the next version of the problem.

Take sales, for example. We had been communicating changes, but not every detail, not weeks in advance, not in the level of granularity that would have let people lock in opinions before anything had shipped. That was a deliberate choice. The inertia in a system this old is immense. Give people too much time to anticipate a change and they will find a hundred reasons to stop it before it even starts. We used velocity as a form of protection. Slowness gives the inertia time to work.

We knew that the people who pushed back hardest were also the people who cared most. Sales had been demoing the same screens for years. They knew every flow, every quirk, every odd corner of the old interface. When we changed things, we changed their pitches. Their resistance wasn't irrational. It was information. These were exactly the people we needed to be talking to.

So we brought them in earlier. Still on our terms, but early enough that their objections could shape the work. This slowed us down slightly, the very thing we had been guarding against. We took the trade on purpose. People who help shape a change start moving with it. Bringing sales in didn't just get us better feedback. It turned them from drivers of inertia into drivers of the work.

They caught things we had missed, like features that were technically still present but harder to find, or flows that made sense when you knew the product but were disorienting to someone seeing it for the first time. Their feedback was occasionally delivered with more heat than was strictly necessary. We answered every question anyway. That's where the trust came from: not from having the right answers, but from not flinching when the questions were hard.

That seemed to settle it. It didn't. People would skim through testing and sign off, then come back with serious objections after something went live. We had solved the communication problem and inherited a new one. Inertia doesn't surface when you ask people what they think. It surfaces when they have to live with the answer.

Other times, we'd ship a change that worked well for the majority of users, only to find out that a small group, often top-tier customers with the most at stake and the least patience, used the product in a way nobody had accounted for. We had improved things for most people and made them worse for exactly the people we couldn't afford to disappoint.

Learning to live with that, to keep moving anyway, takes a certain kind of stubbornness. At some point you stop trying to make the discomfort go away and start treating it as part of the job. Because the alternative was to wait for certainty that was never coming.

We learned that the hard way when we set out to make the app layout more responsive. After a while we'd developed a feel for which changes would cause friction and which wouldn't. At least we thought we had. The responsive layout felt safe. It wasn't fixing anything visible. It was just bringing the product in line with what people expect on smaller devices. We didn't expect a reaction.

It came anyway. And fast. Which was jarring, because the change had a legitimate purpose. Large tables had been breaking the layout for years. The product had never been truly usable on mobile, and making it responsive was supposed to be the first step toward changing that. What we hadn't accounted for was how people were actually navigating around that brokenness. They had turned a limitation into a feature, and in doing so, made it theirs.

Nobody knew, including the users themselves, how much the product's daily use had been shaped by its own limitations. The interface had never been built for mobile. On phones and tablets it was technically broken: tables overflowing, elements colliding. But users had found a way. They zoomed out to see the whole table at once, then panned across to read what they needed. The data was tiny at full zoom and barely readable, but they could take in the whole picture. They had been doing it for years. It was awkward, but it worked and they relied on it. When we made the layout responsive, we took that away. The zooming behavior changed. The tables they had been zooming and panning across were now locked inside a responsive container. They had to scroll horizontally instead, and the container clipped the data they needed to see.

We reverted the change immediately.

This was the sharpest lesson of the whole year. The broken thing was the workflow. A decade of workarounds had quietly become the product. Users hadn't asked for it to be fixed because to them it wasn't broken. It was just how the software worked. We thought we were reading the territory. We were still reading the map.

Moving through it

You only learn things like that by moving. Even when it feels like motion for its own sake. The workflows users build inside the broken parts of a system are easy to miss in research or in conversations. They surface when you take them away.

You can't think your way past inertia. You have to move through it. Every small change we shipped was a conscious act against it, and a source of information we couldn't have gotten any other way. In a system this old, you don't know what it will tolerate until you touch it. You don't know what users actually need until something breaks.

After a year, the visible signs were strong. The codebase had stopped resisting change. Features that used to take months took weeks. A small customer survey on the visual refresh came back strongly positive. But none of that came from a plan we could defend in advance. It came from calls with executives, sessions with sales teams whose demos kept changing under them, conversations with colleagues about decisions that lived nowhere in the documentation. Edge cases added years ago for a specific customer. Behaviors that looked like bugs but were actually decisions. Treating this as a pure technical migration would have lost all of it.

Small reversible steps. The discomfort of shipping something you might have to take back. That was the price of moving.

2026 Sebastian Sebald