Authoring design tokens in the DTCG format (2025.10 stable)
How to write portable token files: any object with $value is a token, any without is a group; $type cascades from groups; aliases use {group.token}; colours are objects with colorSpace/components/hex; dimensions are {value, unit}; files end in .tokens.json. The spec reached its first stable version on 28 Oct 2025; Style Dictionary v4 reads DTCG, full 2025.10 support is in progress for v5.
Overview
What. The Design Tokens Community Group (DTCG) format is the vendor-neutral JSON format for design tokens. Its Format Module reached a first stable version (2025.10) on 28 October 2025 (verified 2026-09-24). Authoring tokens in this shape keeps them portable across Figma plugins, Style Dictionary and platform outputs.
Why. Tokens exist so that a design decision is authored once and referenced everywhere; a standard file format is what lets tools rely on the same definitions at scale. Writing tokens in an ad-hoc JSON shape ties you to one build tool and blocks design-tool sync.
Use when: any new token set; migrating hand-written CSS variables into a build pipeline; exchanging tokens between design and code.
Do not use when: you have three colours and one spacing scale in a throwaway prototype — plain CSS custom properties are fine until a second theme or platform appears.
Implementation
- Tokens vs groups. A token is any JSON object with
$value; a group is any object without one. Optional$type,$description,$deprecated,$extensions. - Type inheritance. Set
$typeonce on a group; children inherit unless they declare their own. - Aliases. Reference another token with
{path.to.token}; tools resolve chains to a final value and must reject circular references. - Typed values (2025.10):
{ "color": { "$type": "color", "blue": { "600": { "$value": { "colorSpace": "oklch", "components": [0.45, 0.20, 260], "hex": "#2451c9" } } } }, "space": { "$type": "dimension", "4": { "$value": { "value": 16, "unit": "px" } } }, "radius": { "$type": "dimension", "md": { "$value": { "value": 6, "unit": "px" } } }, "motion": { "duration": { "$type": "duration", "base": { "$value": { "value": 200, "unit": "ms" } } } } }Semantic tier:
{ "color": { "action": { "primary": { "$value": "{color.blue.600}", "$description": "Primary button background" } } } }. - Colour spaces.
oklchis one of the natively supported spaces; author new palettes in OKLCH so perceptual lightness is consistent and output to shadcn/Tailwind needs no conversion. Includehexas a fallback for tools that cannot read the object form. - Files. Use
.tokens.json; split by tier (primitive/,semantic/,component/) and by theme when the semantic tier varies. - Deprecation. Mark with
"$deprecated": "Use color.action.primary"rather than deleting; remove only after a warn → wait → remove cycle (seesys-versioning-and-deprecation-sequence). - Tool status (verified 2026-09-24): Style Dictionary v4 has first-class DTCG support; full 2025.10 support is described as work in progress for v5. Validate your file against the spec version your build tool understands.
Verification
- Every token has
$value; every group lacks it; a JSON-schema or linter check passes. - No component file references a primitive token path directly; all references resolve through semantic aliases.
- Colour tokens include
colorSpaceandcomponents(andhexfallback); dimension tokens use{value, unit}. - Alias resolution has no cycles (build passes with reference resolution enabled).
- Deprecated tokens carry
$deprecatedand still build for at least one release. - The build tool's DTCG version support is recorded in the repo README.
Sources:
Limitations
- The DTCG spec is a W3C Community Group report, not a W3C Recommendation; tool support for the newest typed values still varies.
- Figma has no confirmed native DTCG import/export in the sources reviewed; the bridge is a plugin (commonly Tokens Studio) or a script.
- Native platforms consume tokens through generated Swift/Kotlin outputs; dynamic type and platform theming still need hand mapping.