UX Design
September 10, 2026

Technical debt your users can see

Ana Pérez Casajús

A button that looks different depending on the screen. An old page that feels disconnected from the rest of the product. A new component implemented differently from the way it was originally designed. Sometimes the inconsistency is obvious. Sometimes users cannot quite explain what feels wrong. But they notice that something does not belong. These are technical decisions surfacing as inconsistency, friction, and ultimately a loss of trust.

As individual designers, we can be detail-oriented and thoughtful in the decisions we make. But when a design system, branding or guideline is shaped by too many small, independent decisions without clear ownership or governance, consistency becomes difficult to maintain.

Technical debt is visible

Visible debt can take many forms. Sometimes it is easy to spot: old branding living next to a new visual identity, different versions of the same component, outdated imagery, inconsistent spacing, or pages that look like they belong to different stages of the product.

Other times, it is less about appearance and more about behavior. Similar actions may work differently depending on where users encounter them. A familiar interaction pattern may suddenly change in a legacy flow. A component that looks almost identical may require a different action to complete the same task.

In both cases, users are seeing the consequences of decisions that happened somewhere else.

I experienced this during a rebranding project. The new system itself was prepared, including the assets and guidelines needed to make the transition. The challenge was maintaining the transition once the project moved across teams and priorities changed.

The more difficult problem emerged elsewhere: the new system itself started drifting during implementation. Once ownership of the project became fragmented, decisions were made without a single person responsible for checking whether the system was being implemented as intended. Some changes were made for practical reasons, some because of time constraints, and some simply because different people approached the work differently.

You can be paying off old debt while creating new debt at the same time.

Why does visible debt matter?

Not every inconsistency has the same effect on users. A visual discrepancy and an inconsistent interaction pattern can both be symptoms of a fragmented system, but they create different kinds of problems.

It affects perceived quality and trust

When users encounter old branding next to new branding, components that do not match, or pages that clearly do not belong to the same visual system, the product can start to feel outdated or poorly maintained.

The product may still work perfectly well. The inconsistency may not prevent anyone from completing a task. But people do not judge products only by whether they technically function. They are making judgments based on what they can see. A collection of small discrepancies can therefore become signals of something larger: that the product is not fully under control.

It increases cognitive load and friction

The impact becomes more serious when inconsistency affects functionality.

If similar components behave differently, users have to stop relying on what they have already learned. A familiar pattern in one part of the product may not apply somewhere else. Instead of recognizing an interaction, they have to interpret it again.

This increases cognitive load and reduces predictability. Visual inconsistency can make a product feel unreliable and behavioral inconsistency can make it harder to use.

Not every visible debt is the same

One of the easiest mistakes during a cleanup effort is treating every inconsistency as equally urgent. In reality, visible debt has different levels of severity and different consequences.

Visual debt

Visual debt includes outdated branding, imagery, typography, iconography, spacing, colors, and other elements that no longer align with the current system.

Its primary impact is usually on perceived quality, brand coherence, and trust. These issues can be important, especially when they accumulate, but they do not always create immediate functional problems.

Behavioral debt

Behavioral debt appears when similar patterns behave differently across the product.

This can affect predictability, efficiency, and cognitive load. Users may need to relearn interactions or hesitate because they cannot rely on familiar patterns.

When an inconsistency changes how people complete tasks, it generally deserves a higher priority than a purely cosmetic discrepancy.

Accessibility debt

Accessibility needs to be part of this conversation from the beginning.

A component can look consistent and still create serious problems if it cannot be perceived, understood, or used by everyone who needs to interact with it. Low contrast, unreadable controls, inaccessible interaction patterns, or implementations that do not meet accessibility requirements can all become visible symptoms of a deeper gap between the intended system and the actual product.

When prioritizing debt, accessibility should sit at the top of the list. A product cannot be considered truly consistent if parts of its experience are inaccessible.

Systemic debt

There is also debt that users may never see directly but that creates the conditions for the rest.

This includes:

  • Unclear ownership
  • Fragmented decision-making
  • Production drifting away from the design source of truth
  • Undocumented exceptions
  • Changes made directly in production without updating the system
  • Teams working without a shared understanding of what the current system actually is.

Users see the symptoms. The causes often sit deeper in the organization.

How to audit a product for visible debt

An audit should start from the situation you are dealing with. Auditing a product that already has a defined design system is different from auditing a product before building or rebuilding one.

When a design system already exists

If the system already exists and the problem is implementation drift, the central question is:

How far has the product drifted from the system?

A practical starting point is to capture the product as it exists in production and compare it against the source of truth in Figma or another design environment.

  • Capture the relevant screens and flows from the live product.
  • Compare production with the intended designs.
  • Identify discrepancies between the design system and the implemented experience.
  • Create an inventory of the components defined in the system.
  • Check whether those components exist in production and whether they were implemented correctly.Document the gaps, exceptions, and deviations.

This is particularly important because a design system can be perfectly defined in a design file while the product itself slowly becomes something different.

Figma and production can become two different versions of the same product.

When you are auditing before creating or rebuilding a system

The process changes when there is no reliable system to compare against.

In that case, the first goal is to understand what actually exists. That may involve comparing design files and production, identifying repeated components with different variants, reviewing the most important user flows, and documenting patterns that have evolved independently.

A useful audit can include:

  • Identify repeated components with multiple variants
  • Reviewing the most important user flows
  • Identifying functional and visual inconsistencies
  • Comparing design files with production
  • Building an inventory of existing components and patterns in figma and comparing that to what is developed.
  • Checking accessibility throughout the process.

It is necessary to  understand which inconsistencies are systemic, which are intentional exceptions, and which create real problems for users.

Prioritize what to fix

Finding visible debt is only the first step. Large products can contain far more inconsistencies than a team can realistically fix at once.

There’s no need  to update everything immediately. The goal is to understand what you are carrying and make deliberate decisions about what to address first.

A useful order of priority is:

1. Accessibility

Start with issues that prevent or significantly limit people's ability to use the product.

If a control is difficult to read, a pattern cannot be accessed properly, or an implementation fails to meet accessibility requirements, that should take priority over cosmetic differences.

2. Functionality and behavioral consistency

Next, focus on inconsistencies that create friction or make the product harder to understand.

Ask whether similar patterns behave predictably and whether users can rely on what they have already learned elsewhere in the product.

3. Visual consistency

Visual debt still matters. It affects how users perceive the quality and reliability of the product. But when resources are limited, purely visual updates should generally be prioritized after accessibility and functional issues.

This is particularly relevant during large migrations. It may be completely reasonable for older content or assets to remain temporarily if there is a clear strategy for how and when they will be updated.

Maintain the system

Auditing and fixing debt is not enough if the conditions that created it remain unchanged.

A design system is not a project that reaches a final state and stays there. Products change. Teams change. Requirements change. New needs emerge.

Give the system clear ownership

Someone needs to maintain a complete view of the system.

That does not mean one person needs to design every component or approve every small decision. It means there should be clear ownership over the health of the system and how it evolves.

That responsibility can include:

  • Understanding the current state of the system
  • Reviewing significant changes
  • Tracking implementation drift
  • Managing exceptions
  • Helping teams understand how changes should enter the system.

Without ownership, maintenance often becomes everyone's occasional responsibility. Different designers and developers make decisions based on the immediate needs of their work, while no one has enough context or time to protect the system as a whole.

Without ownership, the cost of maintaining the system gets distributed across everyone. Eventually, that means nobody has enough context or time to maintain it properly.

Keep the Design System ahead of production

One of the most important lessons from implementation drift is that production should not become the place where the system is invented.

A healthier flow is:

  1. New need  
  2. Design - Design System
  3. Implementation

The opposite flow is much harder to maintain:

  1. New need
  2. Production shortcut
  3. Eventually update the Design System

When changes go directly into production, the product can start accumulating components and variants that do not exist in the current system. At that point, designers are no longer using the system to guide the product. They are trying to catch up with what has already been built.

Design starts chasing the product instead of guiding it.

Review implementation

A component being approved in Figma does not guarantee that it exists in production in the same way. Implementation reviews and design QA can help catch discrepancies before they become part of the product's long-term debt.

This is especially important during large migrations, when small implementation decisions can multiply quickly across multiple screens and teams.

Maintain a visible backlog of debt

Not every inconsistency needs to be fixed immediately, but it should not disappear simply because nobody is working on that part of the product right now.

A dedicated backlog gives the team a place to record:

  • Implementation discrepancies
  • Legacy components
  • Accessibility issues
  • Undocumented production variants

The backlog should be accessible to anyone who finds an issue. Ownership then becomes responsible for reviewing, prioritizing, and making sure the list remains useful rather than becoming another forgotten document.

Define how changes enter the system

Flexibility is necessary. Products cannot evolve if every change is blocked by a rigid process. But unrestricted changes can quickly fragment a system.

Teams need clear rules for questions such as:

  • When can an existing component be modified?
  • Who reviews a significant change?
  • When should a one-off solution become part of the system?
  • How should temporary exceptions be documented?
  • What needs to change in the system before something reaches production?

Local decisions should not quietly create global inconsistency.

Final thoughts

Products are never static.

A rebrand may take months to complete. Legacy content may be too large to update all at once. Teams may have limited capacity. Priorities will compete. Components and flows will continue to evolve.

None of that is necessarily a failure.

Old and new versions can coexist temporarily. Some inconsistencies can be reasonable trade-offs. A team does not need to stop everything else to make every historical screen look current.

The problem begins when those trade-offs stop being managed as part of a system.

Visible technical debt is not just a collection of old screens or inconsistent components. It can be evidence that the product has changed faster than the processes, ownership, and resources responsible for keeping it coherent.

Users may never know why the inconsistencies exist. They will not see the shifting priorities, the handoffs, or the capacity constraints behind them. They will see what those decisions leave behind.

Products evolve constantly, but we need to make sure that change is strategic,  intentional and properly supervised, so it doesn’t end up in a technical debt that will take resources in the future.

If your product is showing signs of design debt, inconsistencies, or implementation drift, contact us and let’s explore how we can help you bring your system back into alignment.