Skip to content

The Pipeline

Dispersa processes design tokens through a pipeline from resolution to rendered output. Tokens flow from a resolver document through shared stages (run once) and per-output stages (run for each output), being resolved, filtered, transformed, and formatted along the way.

Resolve → Preprocess → Parse → Global Filter → Global Transform → Filter → Transform → Render

Click any stage below to see what it does:

CSSJSON...
Resolve

Loads the DTCG resolver document, merges sets in order, and applies modifier contexts (themes, platforms, densities) to produce the raw token tree for each permutation.

Input:Resolver document + modifier inputs
Output:Raw token tree per permutation
StageScopeDescription
1. ResolveSharedLoad the resolver document, merge sets, apply modifier contexts
2. PreprocessSharedRun optional preprocessors on the raw token tree
3. ParseSharedResolve references, flatten groups to dot-paths, resolve aliases
4. Global FilterSharedRemove tokens globally before per-output processing
5. Global TransformSharedTransform all tokens before per-output processing
6. FilterPer-outputFurther narrow tokens for each specific output
7. TransformPer-outputConvert token values and names for the target platform
8. RenderPer-outputFormat tokens into CSS, JSON, JS, Tailwind, Swift, Kotlin, etc.

Stages 1-5 run once for the entire build and produce a resolved, flat token set. Stages 6-8 run per output, so each output can have its own filters, transforms, and renderer.

  1. Resolve — Loads and parses the resolver document. Merges sets in order, then applies modifier contexts (themes, platforms, densities) to produce the raw token tree for each permutation.

  2. Preprocess — Runs optional preprocessors on the raw token tree. Use this to strip vendor metadata, inject computed tokens, or normalize legacy formats before parsing.

  3. Parse — Resolves JSON Pointer $ref references (including external files), flattens nested groups to dot-path keys (e.g. color.brand.primary), inherits group-level $type, and resolves {token.name} alias references with circular dependency detection.

  4. Global Filter — Global filters from BuildConfig reduce the token set for all outputs. Tokens excluded here never reach any output.

  5. Global Transform — Global transforms from BuildConfig run on all tokens (e.g. nameKebabCase()). These apply before any per-output transforms.

  1. Filter — Per-output filters from each OutputConfig further narrow the globally transformed set for that specific output.

  2. Transform — Per-output transforms run after global transforms (e.g. colorToHex() for CSS). They convert token values and names for the target format.

  3. Render — The renderer formats the final tokens into the target output: CSS custom properties, JSON, JS/TS modules, Tailwind @theme blocks, Swift/SwiftUI, Kotlin/Compose, or any custom format via defineRenderer.

await dispersa.build({
// Global: applied to ALL outputs (stages 4-5)
filters: [byType('color')],
transforms: [nameKebabCase()],
outputs: [
css({
name: 'css',
// Per-output: applied AFTER global (stages 6-7)
transforms: [colorToHex()],
}),
json({
name: 'json',
// Per-output: different transforms for this output
transforms: [colorToRgb()],
}),
],
})