The classic schema primitive → semantic → component is not always good. For a team with one product and one theme, the third level is often excessive — it adds an abstraction layer that nobody reads, and maintaining it requires twice as many files.
| Criterion | 2 level (primitive → component) | 3 level (primitive → semantic → component) |
|---|---|---|
| Product with one theme, no rebranding | Suitable | Excessive |
| Support for light/dark, multi-brand | Does not work without rewriting components | Required — as in Material Design 3, where theme switching occurs through semantic substitution without changing component logic |
| Team of up to 5 developers | Sufficient, below entry threshold | Overhead at the start |
| Product line across multiple platforms | Quickly runs into duplication | Justified, the semantic layer untangles the platforms |
The rule is simple: if there is a theme, rebrand, or multibrand in the roadmap — take three levels at once; the transition from two to three levels retroactively is painful and requires manual migration of all links.
Here, the top of the search results is usually limited to the phrase 'set up synchronization via a plugin,' but the problem is not in the setup, but in its fragility. Tokens Studio remains the only plugin with full bidirectional synchronization with a Git repository, and even there, discrepancies occur regularly — due to branch conflicts, manual edits in the code 'around' the tokens, and different merge orders.
A telling case is the Figma Dev Mode 2.0 incident in October 2024 year: automatic removal of prefixes from token names caused collisions and desynchronization in 12 production components. The lesson is simple — any automatic name transformation must be tested on a copy of the production set before updating the plugin, rather than trusting the tool's default settings.
All three issues are solved not by the tool, but by the process: CI check that blocks merge if the token value in code does not match the source in Git, and a ban on direct edits of tokens in Figma without a pull request.
Francesco Improtta precisely formulates the core of the problem: token systems degrade not due to tools, but due to the lack of a governance process. Without a component layer owner, without an approval workflow, and without a deprecation strategy, the system collapses within months — developers start creating local variables 'because it's too slow via tokens,' and duplication grows unnoticed.
The difference between a working and a broken system is not in the beauty of documentation, but in specific numbers. Knapsack in the 2023 study showed: teams with a consistent naming convention solve design-to-code handoff problems 38% faster than teams without standards — this is a measurable, not an abstract effect.
| Metric | Good system | Bad implementation |
|---|---|---|
| Share of hardcoded values in component code | Close to zero, there is a lint rule | Grows over time, nobody tracks it |
| Token naming | By role: color-action-primary | By appearance: primary-500 — breaks during rebranding |
| Figma/code synchronization | Automatic, with CI check | Manual, 'once per sprint' |
| System owner | Assigned, there is an approval process | No one, anyone adds tokens as they wish |
It is worth remembering a architectural mistake that is barely noticeable at the start: naming a token by appearance instead of role. primary-500 works while the product has one brand and one theme. During rebranding or launching a second brand, such a name requires rewriting all references, because the token's meaning is tightly bound to a specific shade, not to a function.
Tetrisly ran into a telling problem — 500+ tokens just for one Button component, if you multiply all states, variants, and themes. At this point, the abstraction loses meaning: searching for the right token takes longer than writing the value directly, and the very idea of reuse falls apart.
You can avoid this only by consciously limiting combinatorics, rather than automatically generating a token for every parameter intersection:
This is the conclusion that rarely appears in articles about setup, and for no good reason. If the product is a landing page with a single theme, without plans for rebranding, without multiple platforms, and without a team of designers that changes — tokens will add overhead that will never pay off. Three levels of abstraction, a pipeline for transformation through Style Dictionary, synchronization with Git — this is infrastructure justified only where the style changes more than once a year, or is used simultaneously in multiple products.
The storage format should also be chosen based on actual needs, not trends: the W3C Design Tokens Community Group standardizes the JSON format, but most systems on the market use it only partially — and that is normal if the internal team has agreed upon a unified convention and follows it without exception. A standard is needed where tokens will be transferred between tools from different vendors; for a closed internal system, discipline is more important than compliance with the specification.
The classic schema primitive → semantic → component is not always good. For a team with one product and one theme, the third level is often excessive — it adds an abstraction layer that nobody reads, and maintaining it requires twice as many files.
| Criterion | 2 level (primitive → component) | 3 level (primitive → semantic → component) |
|---|---|---|
| Product with one theme, no rebranding | Suitable | Excessive |
| Support for light/dark, multi-brand | Does not work without rewriting components | Required — as in Material Design 3, where theme switching occurs through semantic substitution without changing component logic |
| Team of up to 5 developers | Sufficient, below entry threshold | Overhead at the start |
| Product line across multiple platforms | Quickly runs into duplication | Justified, the semantic layer untangles the platforms |
The rule is simple: if there is a theme, rebrand, or multibrand in the roadmap — take three levels at once; the transition from two to three levels retroactively is painful and requires manual migration of all links.
Here, the top of the search results is usually limited to the phrase 'set up synchronization via a plugin,' but the problem is not in the setup, but in its fragility. Tokens Studio remains the only plugin with full bidirectional synchronization with a Git repository, and even there, discrepancies occur regularly — due to branch conflicts, manual edits in the code 'around' the tokens, and different merge orders.
A telling case is the Figma Dev Mode 2.0 incident in October 2024 year: automatic removal of prefixes from token names caused collisions and desynchronization in 12 production components. The lesson is simple — any automatic name transformation must be tested on a copy of the production set before updating the plugin, rather than trusting the tool's default settings.
All three issues are solved not by the tool, but by the process: CI check that blocks merge if the token value in code does not match the source in Git, and a ban on direct edits of tokens in Figma without a pull request.
Francesco Improtta precisely formulates the core of the problem: token systems degrade not due to tools, but due to the lack of a governance process. Without a component layer owner, without an approval workflow, and without a deprecation strategy, the system collapses within months — developers start creating local variables 'because it's too slow via tokens,' and duplication grows unnoticed.
The difference between a working and a broken system is not in the beauty of documentation, but in specific numbers. Knapsack in the 2023 study showed: teams with a consistent naming convention solve design-to-code handoff problems 38% faster than teams without standards — this is a measurable, not an abstract effect.
| Metric | Good system | Bad implementation |
|---|---|---|
| Share of hardcoded values in component code | Close to zero, there is a lint rule | Grows over time, nobody tracks it |
| Token naming | By role: color-action-primary | By appearance: primary-500 — breaks during rebranding |
| Figma/code synchronization | Automatic, with CI check | Manual, 'once per sprint' |
| System owner | Assigned, there is an approval process | No one, anyone adds tokens as they wish |
It is worth remembering a architectural mistake that is barely noticeable at the start: naming a token by appearance instead of role. primary-500 works while the product has one brand and one theme. During rebranding or launching a second brand, such a name requires rewriting all references, because the token's meaning is tightly bound to a specific shade, not to a function.
Tetrisly ran into a telling problem — 500+ tokens just for one Button component, if you multiply all states, variants, and themes. At this point, the abstraction loses meaning: searching for the right token takes longer than writing the value directly, and the very idea of reuse falls apart.
You can avoid this only by consciously limiting combinatorics, rather than automatically generating a token for every parameter intersection:
This is the conclusion that rarely appears in articles about setup, and for no good reason. If the product is a landing page with a single theme, without plans for rebranding, without multiple platforms, and without a team of designers that changes — tokens will add overhead that will never pay off. Three levels of abstraction, a pipeline for transformation through Style Dictionary, synchronization with Git — this is infrastructure justified only where the style changes more than once a year, or is used simultaneously in multiple products.
The storage format should also be chosen based on actual needs, not trends: the W3C Design Tokens Community Group standardizes the JSON format, but most systems on the market use it only partially — and that is normal if the internal team has agreed upon a unified convention and follows it without exception. A standard is needed where tokens will be transferred between tools from different vendors; for a closed internal system, discipline is more important than compliance with the specification.