CASE STUDY

Muse · Color system · Design tokens

Semantic Color Architecture across Muse products

I redesigned Muse color semantics so one structure could support six product systems across Web and App, including four products with theming.

RoleDesign System DesignerScopeSix products · Web + AppOutcomeOne semantic structure
CONTEXT

Overview

How I redesigned Muse color semantics so one structure could support six product systems, Web and App, including four products with theming — without encoding every component and state into the token system.

6 products · Web & App · 4 themed products · 1 semantic structure

My role: author of the shared cross-product semantic structure and naming logic; co-author of the shared opacity-state model; maintainer of product Core adoption.

OVERVIEW

01 — The old model described accumulated cases

When I joined the product, color tokens had grown around individual use cases. Names mixed roles, components, themes, states and hierarchy: Main, Text, Icon, Dark/Text, Dark/Button, Hover, Disable, 1, 2, 3.

The problem was not only naming. The structure made it hard to predict where a new token should go, and every new product could create another branch of exceptions.

The system described existing cases rather than a reusable model of the interface.

Legacy color palette across Muse products
CHALLENGE

02 — My first structure fixed the chaos, but not the abstraction level

My first semantic model introduced predictable groups such as Text, Icon, Action, Surface, Edge, Alert, Overlay and Additional.

This was a major improvement, but it still encoded too much context. Text and Icon duplicated similar roles, while Action / Primary / Hovered and similar tokens tied color semantics directly to component states.

As the Design System expanded across products, this explicit model started to scale poorly.

Project diagram
STRATEGY

03 — Designing semantics around decisions, not components

I reframed the question from “Which token is meant for this exact use case?” to “What kind of visual role am I choosing?”

The shared model became:

Content · Accent · Background · Stroke · Status · Overlay · Exception

A component now interprets the semantic role instead of being encoded into it. Content / Secondary can be used for text, an icon or another foreground element. Background / Raised does not need to know whether the surface is a card, panel or future component.

The naming inside each group follows the decision designers actually make:

  • Content: hierarchy — Primary → Secondary → Tertiary → Quaternary
  • Background: surface levels — Base → Subtle → Surface → Raised → Elevated → Highest
  • Stroke: intensity — Subtle → Moderate → Strong → Emphasis → Intense

Accent, Status, Overlay and Exception follow the same principle but use naming appropriate to their own role. Overlay, for example, covers semi-transparent compositional layers such as modal backdrops and image veils.

I also treated naming as part of usability: token names had to remain short, easy to scan, visually distinguishable in lists and practical in full token paths for both designers and developers.

A consistent taxonomy does not require the same naming pattern everywhere. Each group should reflect the relationship between its values.

Project diagram
ARCHITECTURE

04 — Separating interaction state from color

The idea of using opacity for interaction states already existed in Ultimate Guitar. Our architect suggested taking it into the shared system.

I challenged the approach with engineering, then refined the irregular product values into a consistent shared scale and added the missing Loading state:

Default 100% · Hovered 80% · Loading 70% · Pressed 60% · Disabled 40%

This removed the need to create separate color tokens for every role/state combination.

Before: semantic color × component role × state

After: semantic color + shared state opacity

My contribution was evaluation, refinement, standardisation and cross-product adoption rather than the original invention of the idea.

Project diagram
DECISION

05 — One semantic skeleton across products and themes

The same semantic names are used across Product Cores. What changes are the aliases to each product's primitive palette.

A component can always use Content / Primary. In a light theme it may resolve to a dark primitive; in a dark theme it resolves to a light primitive. The component and semantic token remain unchanged.

Products without theming use the same structure with a single mode, so themed and non-themed products do not require separate semantic architectures.

Product-specific semantics stay in Additional, extending the Product Core without changing the shared model.

Same naming → same semantic model → different aliases.

Project diagram
EXECUTION

06 — What changed for designers

The practical goal was to make color selection easier without removing useful constraints.

Before: find the token created for the exact use case.

After: choose the visual role, then choose the hierarchy or intensity.

Foreground → Content

Surface → Background

Boundary → Stroke

Brand emphasis → Accent

System feedback → Status

The main rule is simple: do not use Background tokens for content or Stroke tokens as backgrounds. Within the correct semantic group, designers can choose the value that best fits the composition without borrowing colors from unrelated roles.

Project diagram
GOVERNANCE

Outcome

One semantic structure now covers six product systems across Web and App, including four products with theming.

Light/Dark differences are handled through aliases. Interaction states use one shared opacity scale instead of duplicated color tokens. Product-specific semantics remain local in Additional.

For designers, the mental model changed from memorising exact use-case tokens to choosing role → hierarchy / intensity.

NEXT CASE

Cian · Design systems · Iconography

Building a Unified Icon System for Cian