Scott
Scott

Published on Oct 03, 2026, updated on Oct 04, 2026

Design tokens make repeated decisions visible: a color role, spacing step, type scale, or elevation value can be reused across components and platforms. The difficult part begins when a token is wrong, ambiguous, or no longer fits the product. Renaming it or replacing its value in a single sweep can break contrast, layout, documentation, and code at the same time.

A safer approach treats token change as a migration. First discover where the old decision is used, then introduce a clearer replacement, move consumers in small groups, and retire the old name only when evidence says it is safe. This is different from creating a token set from scratch. It is a maintenance practice for teams that already have a design system and need it to evolve.

For foundations, see the existing guide for design tokens and the overview of design tokens in Pixso. This article narrows the problem to deprecation, ownership, and migration evidence.

One ambiguous text token splits into separate roles for readable helper text and an inactive button

Why token changes become risky

An old token can appear in more places than a search result reveals. A semantic color may feed a button, chart, disabled state, and a partner brand theme. A spacing token may be copied into a component override or translated into a platform-specific constant. A name such as blue-500 may look harmless until people use it as a success color in one product and an accent color in another.

Migration risk usually comes from four gaps:

  1. The team does not know the token’s consumers.
  2. The replacement changes meaning as well as value.
  3. Design and code move on different schedules.
  4. No one defines what “done” means for the old token.

The remedy is not to freeze the system. It is to make the dependency and decision visible before a replacement is announced.

Inventory tokens by role, not just by name

Start with a table that describes intent and usage. Include the token name, category, semantic role, supported modes, consuming components, owner, and proposed action. Do not infer a semantic role from a hex value alone. Two tokens with the same value may serve different jobs, while a single token may need different values in light and dark themes.

FieldExample question
Current nameIs the name stable, descriptive, and unique?
RoleDoes it describe intent such as surface-raised or only a raw value?
ConsumersWhich components, templates, and product surfaces use it?
ModesWhat changes in dark, high-contrast, or brand themes?
OwnerWho can approve the replacement and answer questions?
ActionKeep, alias, replace, or remove?

Record evidence instead of trying to perfect the taxonomy on the first pass. A small, accurate inventory is more useful than a large list with guessed dependencies. The design token naming guide can provide naming principles, but the migration decision still belongs to the team that owns the consuming products.

Decide whether to rename, alias, or replace

These actions solve different problems.

Rename for clarity

Use a rename when the token’s meaning is sound but its name is misleading or inconsistent. Keep an alias from the old name to the new name for a defined transition period. A rename should not silently change contrast or spacing at the same time; otherwise the team cannot tell which change caused a regression.

Alias for compatibility

A compatibility alias lets an old name keep resolving while its consumers move to a replacement. Give that particular alias an owner and a retirement condition. Keep this separate from a permanent semantic reference: a token such as text-secondary can legitimately refer to a foundation color for the life of the system. Referencing another token does not by itself make either token deprecated.

Replace the semantic decision

Replace the semantic decision when a single name covers incompatible uses. Suppose text-muted appears on both readable form guidance and disabled button labels. Split it into text-secondary for supporting information and text-disabled for inactive controls. The old name cannot map correctly to both through one global replacement; review each use by its role.

Existing use of text-mutedReplacementDecision to verify
“Choose a date” helper texttext-secondaryThe guidance is available to read and still meets the applicable text contrast requirement
“Save changes” on an inactive buttontext-disabledThe control is actually unavailable, and its inactive appearance remains understandable
Unknown or undocumented useKeep temporarily pending reviewAn owner identifies the role before the reference changes

Remove only after the consumer set is empty

Deletion is the final step. If an old token is still used by a package that the team cannot inspect, record that boundary and keep the token deprecated. A missing token that causes a build fallback is not proof of successful cleanup.

Create a replacement that can be evaluated

The replacement should have a one-sentence definition, allowed contexts, modes, and examples of correct and incorrect use. If it changes a value, show the before and after on real components rather than only as swatches. Review focus, hover, disabled, selected, error, and high-density states; token defects often hide in states that are not shown in the default component.

Design token deprecation checklist covering inventory, migration, validation, and removal

Supporting text still has to be readable; a lighter tone is not permission to ignore contrast. WCAG’s inactive-control exception is tied to the actual control state, not to a token name containing “disabled.” For other token categories, inspect line wrapping, spacing, focus visibility and theme behavior on the consuming component. A value that works in a swatch may fail in its context.

Add a migration note beside the replacement:

text-muted is deprecated for new use. Map readable supporting copy to text-secondary and labels on inactive controls to text-disabled. Keep existing consumers on the old value until their component is reviewed. The component owner records each migration and confirms when the compatibility path can be removed.

Specific scope keeps the note useful for designers, developers, and reviewers who encounter an old reference in a pull request.

In a focused Pixso file, compare the same settings card before and after separating text-muted into text-secondary and text-disabled. Keep the layout and wording fixed: “Choose a date” must remain readable, while “Save changes” represents an unavailable action. Annotate which role each label uses, then review the two components with the implementation owner. Record the corresponding code mapping separately and publish the approved design-library update when the review is complete.

Before-and-after component comparison in Pixso separating supporting text from disabled text styles
Compare the same component before and after one text role becomes two distinct styles.

Compare a style replacement in Pixso →

Migrate consumers in meaningful slices

Choose slices that can be reviewed and rolled back: one component family, one product surface, or one theme. Moving every token in a large file may look efficient but makes visual regressions hard to localise. Start with a representative component that exercises the token across normal, interactive, disabled, and error states.

For each slice, record:

  • the old and new token names;
  • the affected components and states;
  • the expected visual or semantic change;
  • design and code owners;
  • verification screenshots or links;
  • the date the slice can leave the alias path.

This is where a shared design workspace helps the team compare states and review decisions. The existing design-system examples and scaling design systems articles provide broader context; the migration record should stay concrete and tied to the current components.

Check semantic and visual regressions separately

Visual comparison is necessary but not sufficient. A replacement can look close while changing meaning, contrast, focus indication, or a code consumer’s fallback. Use two checklists.

Semantic checks

  • Is the token used only in the documented role?
  • Does the value meet the project’s contrast and state requirements?
  • Does the token behave consistently in each supported theme?
  • Are exported names and platform mappings stable?
  • Is an unsupported use rejected or at least visible in review?

Visual checks

  • Do text lines wrap differently at expected widths?
  • Are borders, dividers, and focus rings still distinguishable?
  • Do overlays and menus keep the intended hierarchy?
  • Does a data-heavy screen retain density and scanability?
  • Do mobile and desktop components remain aligned?

The two checklists keep a pleasing screenshot from hiding a serious state or accessibility regression. Attach evidence to the component review, then update the token’s status only after both lists pass.

Communicate deprecations as a product change

Give consumers a concrete migration notice: the old name, the reason for changing it, the replacement rule, affected components, owner and intended removal release. If your token files use the Design Tokens Format Module, $deprecated can mark a token and carry an explanation. That metadata communicates status; it does not discover consumers or move their references for you.

Use a status vocabulary that the whole team understands:

StatusMeaning
ActiveApproved for new work and existing consumers
TransitionalExisting consumers may remain; new use is discouraged
DeprecatedA replacement exists; migration is required
RemovedNo supported consumer remains and the old name is unavailable

Keep the status next to the token and in the release note. The design token release documentation can be linked from the team’s internal migration index, but project-specific dates should not be implied by a generic product page.

Retire the old token with evidence

Before removal, run a final consumer search in design files, code packages, documentation, and exported assets. Ask owners of external or archived surfaces to confirm their boundary. Check generated files as well as source files; a build may continue to pass while a generated package still carries the old name.

Define a clear exit record:

  1. No supported consumer still requires the old name. If an exception remains, retain a compatible path for that consumer before removing the token from other packages.
  2. The replacement has passed semantic and visual checks in all supported modes.
  3. The alias and migration note have an announced removal date.
  4. Documentation, examples, and code autocomplete no longer recommend the old name.
  5. A rollback path exists if a late consumer appears.

Remove the old token only from a package whose supported consumers have migrated. Keep the last working package version, mapping and verification examples together so a rollback restores the previous contract. If a late consumer appears, restore compatibility while its owner reviews the mapping; do not silently substitute a visually similar value.

Keep an exception register

Some consumers cannot migrate on the same schedule. A mobile release may be frozen, a partner package may expose a public token name, or a legacy theme may not support the replacement yet. Record each exception with its owner, affected surface, reason, and review date. An exception is safer when it is explicit and temporary than when the team quietly leaves an alias in place.

The register should also say what users will see during the transition. If a legacy theme keeps the old value, document the expected difference and the states that have not been validated. When the owner confirms that the boundary has changed, update the consumer inventory and remove the exception rather than allowing a second, undocumented migration path. This habit keeps token governance honest as products and packages evolve independently.

Close the migration at the consumer level

For the settings card, closure means the helper text and disabled label use their documented roles in both design and implementation, the supported themes have been reviewed, and no supported instance still depends on text-muted. Keep any unresolved consumer on the migration record. The old name can leave the package when those dependencies are gone, rather than when the new token looks finished in isolation.

Further reading

Back to top
Share on X
Share on Facebook