Scaling Design Systems with Living Tokens [Draft]

In most design systems, tokens are implemented as static variables. While effective, this approach becomes increasingly difficult to maintain as products grow adaptive features like density modes, dark/light themes, accessibility requirements, and white-label customization.

Here, I present a case study comparing two token management strategies: Static and Living token definitions and their impact on token volume, maintenance effort, and compliance.

32px (Medium)48px (Large)TextSizeRadius24px (Title)16px (Body)Spacing16px (Padding)8px (Gap)TextColor#000000 (Primary)#76778C (Secondary)BackgroundColor#FFFFFF (Panel)

1. Static Tokens

When implementing static systems, each token variation in the design system becomes a concrete value. For example, given the card component above, to support different density modes (comfortable, compact, regular) and different schemes (light, dark), we would need to define individual tokens for each combination.

1.1 Implementation Mapping

Here is a representation of padding and colors mapping to CSS variables:

Figma DesignPaddingSmallMediumLargeComfortableCompactRegular4px12px20px8px16px24px12px20px28pxBgColorMainPanelDarkLight#FFFFFF#DEDEDE#000000#0F1117FgColorPrimarySecondaryDarkLight#FFFFFF#A1A3B3#000000#76668CScale(Size, Name)Variant(Mode, Density)*=N(Variables)--padding-small-compact: 4px;--padding-small-regular: 8px;--padding-small-comfortable: 12px;--padding-medium-compact: 12px;--padding-medium-regular: 16px;--padding-medium-comfortable: 20px;--padding-large-compact: 20px;--padding-large-regular: 24px;--padding-large-comfortable: 28px;--bgColor-main-dark: #FFFFFF;--bgColor-main-light: #000000;--bgColor-panel-dark: #DEDEDE;--bgColor-panel-light: #0F1117;--fgColor-primary-dark: #FFFFFF;--fgColor-primary-light: #000000;--fgColor-secondary-dark: #A1A3B3;--fgColor-secondary-light: #76668C;

1.2 Challenges

This approach leads to several challenges, specially if token definition is part of the implementation cycle, some of the potential issues include:

1.3 Static Token Lifecycle

Adding new variation requires multiple steps across design and engineering teams, increasing the time and effort needed to implement changes.

Example: Introducing dense mode (ultra-compact) to existing system.

Add VariantFigmaExport VariablesApplyVariablesAuditWeb(CSS)AuditAuditSwift(iOS)XML(Android)ReadytoUse{Static}
Lifecycle of static tokens when adding a new variation.

Each new variation multiplies future maintenance.

1.4 Complexity

Static tokens encode rules like:

Rules and relationships are hidden in token names and values, manually documented making the system hard to use. Token count is not the problem.

Change amplification and Usage complexity are.

2. Living Tokens

To allow for more adaptive systems, we can define tokens as functions that compute values based on parameters like density, theme, and accessibility settings. This could be for example a rule systems based on a TypeScript API that generates the necessary values at runtime or build time.

2.1 Implementation

Instead of defining each token variation explicitly, we define a set of base tokens and rules for how they should adapt based on context. This drastically reduces the number of tokens needed shifting complexity from token count to token logic.

type Density = 'comfortable' | 'compact' | 'regular';
type Schemes = 'light' | 'dark';

const baseUnit = 4;
const padding = {
  small: {
    confortable: baseUnit * 3, // 12px
    compact: baseUnit * 2, // 8px
    regular: baseUnit * 4, // 16px
  },
  medium: {
    confortable: baseUnit * 5, // 20px
    compact: baseUnit * 3, // 12px
    regular: baseUnit * 6, // 24px
  },
  large: {
    confortable: baseUnit * 7, // 28px
    compact: baseUnit * 5, // 20px
    regular: baseUnit * 8, // 32px
  },
};

2.2 Living Token Lifecycle

When adding new variations, we only need to update the token logic, not create new tokens. the token logic can be packaged to produce platform-specific implementations, ensuring consistency across platforms.

AddVariantFigmaExport VariablesLivingTokensAuditWeb(CSS)Swift(iOS)XML(Android)ReadytoUse{Transformer}
Lifecycle using living tokens approach.

3. Conclusion

This article shows the challenge in design token systems is not usage or rendering, but where complexity is expressed. Static tokens encode adaptation by duplicating values, which amplifies maintenance and drift across platforms. Living Token systems centralize logic, allowing a single change to propagate safely and consistently everywhere.

For highly customizable, multi-platform systems, the most effective design tokens are not static variables, they are rules that generate variables. Design systems that scale treat tokens as decisions, not just values.