> For the complete documentation index, see [llms.txt](https://postica.gitbook.io/binding-system-3/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://postica.gitbook.io/binding-system-3/pipeline.md).

# The Pipeline

What happens to a value between the source and your field.

Between the source and the field sits a pipeline of four stages. It is the same pipeline in both directions, and every stage is optional.

## Where to go

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><strong>Converters</strong></td><td>Changing the type</td><td><a href="/binding-system-3/pipeline/converters.md">Converters</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2F5oTzTxhxBncZJoAnHYdZ%2FScreenshot%202026-09-27%20at%2009.02.41.png?alt=media&amp;token=51ff3467-922f-4568-b823-16d2bc0451ad">Screenshot 2026-09-27 at 09.02.41.png</a></td></tr><tr><td><strong>Modifiers</strong></td><td>Changing the value</td><td><a href="/binding-system-3/pipeline/modifiers.md">Modifiers</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2Fgit-blob-2ca76a6c3a7b1f7e0361e0aba8b959e8bb44c9cd%2Fcover-pipeline.svg?alt=media">cover-pipeline.svg</a></td></tr><tr><td><strong>Modifier Catalogue</strong></td><td>All of them, listed</td><td><a href="/binding-system-3/pipeline/modifier-catalogue.md">Modifier Catalogue</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2Fgit-blob-abd6224d763d874d022b96c3b50389a4e3144f39%2Fmodifier-math-expression.png?alt=media">modifier-math-expression.png</a></td></tr><tr><td><strong>Tweening and Control</strong></td><td>Easing and damping</td><td><a href="/binding-system-3/pipeline/tweening.md">Tweening and Control</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2FPDGm2b6JyXcilNgMg20Z%2FScreenshot%202026-09-26%20at%2016.02.01.png?alt=media&amp;token=f994ce40-5d93-470e-b46c-8c63d8eedf4d">Screenshot 2026-09-26 at 16.02.01.png</a></td></tr><tr><td><strong>Templates</strong></td><td>Save and reuse a modifier, a converter or a path</td><td><a href="/binding-system-3/pipeline/templates.md">Templates</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2FxUPSpQbDDLipoH5L8d5h%2FScreenshot%202026-09-28%20at%2011.30.09.png?alt=media&amp;token=e8c190f0-fd1b-4697-a3f2-e483f379c2cc">Screenshot 2026-09-28 at 11.30.09.png</a></td></tr><tr><td><strong>Standard Modifiers</strong></td><td>Generate them for your types</td><td><a href="/binding-system-3/pipeline/standard-modifiers.md">Standard Modifiers for Your Types</a></td><td><a href="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2Fgit-blob-9e654bbbbfb909a765f9214ac562f442692cb2e6%2Fcover-reference.svg?alt=media">cover-reference.svg</a></td></tr></tbody></table>

<figure><img src="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2Fgit-blob-828fb68dfb20b6365147dc31689fd770d238f2f0%2Fbind-pipeline.png?alt=media" alt="The bind pipeline"><figcaption></figcaption></figure>

## The stages

<table><thead><tr><th width="290">Stage</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Source and path</strong></td><td>Where the value comes from. See <a href="/binding-system-3/overview/sources.md">Sources</a> and <a href="/binding-system-3/overview/paths.md">Paths</a>.</td></tr><tr><td><strong>Pre-conversion modifiers</strong></td><td>Change the value while it is still the <em>source's</em> type. Clamp a float before it becomes a string.</td></tr><tr><td><strong>Converter</strong></td><td>Change the type. <code>float</code> to <code>string</code>, <code>Color</code> to <code>Gradient</code>, <code>int</code> to an enum.</td></tr><tr><td><strong>Post-conversion modifiers</strong></td><td>Change the value once it is your <em>field's</em> type. Format the string that the converter produced.</td></tr></tbody></table>

On a write the same four stages run in reverse, using each modifier's inverse pass and the write converter.

{% hint style="info" %}
The division of labour between the two middle stages is strict. A **converter** crosses a type boundary and only ever exists between two *different* types. A **modifier** stays inside one type. If a transformation takes a `float` and gives back a `float`, it is a modifier, no matter how conversion-like it sounds.
{% endhint %}

{% hint style="info" %}
An empty stage is not merely skipped at runtime: it is never built. A binding with no converter and no modifiers is one accessor call, which is why the system can be as fast as direct field access.
{% endhint %}

## Which side of the converter

The bind menu shows two modifier groups when a converter is present:

* **Add Modifier**: pre-conversion. Operates on the source type.
* **Add POST-Conversion Modifier**: post-conversion. Operates on the bind type.

With no converter, the two are the same thing and only one group appears.

Getting the side right is usually obvious from the type. A **Clamp Value** on a `float` source has to be pre-conversion; a **Text Template** has to be post-conversion, because the value is not a string until the converter has run.

## Converters

Automatic most of the time. When the source type and the field type differ, the system looks for a conversion, and if it finds exactly one it uses it silently. You only see a converter in the Inspector when there is a choice to make or an option to set.

```
Transform.position.x  (float)   →   Label.text  (string)
                                     ↑
                          Format String converter, "{0:F1}"
```

See [Converters](/binding-system-3/pipeline/converters.md).

## Modifiers

Around fifty in the box, covering maths, strings, colours, vectors, logic, timing, easing, control loops and logging. They stack, they are reorderable, and each one can have bindable parameters of its own.

```
Health.current  →  Normalize [0..100]  →  Clamp [0..1]  →  Image.fillAmount
```

See [Modifiers](/binding-system-3/pipeline/modifiers.md) for the concepts and [the catalogue](/binding-system-3/pipeline/modifier-catalogue.md) for the full list.

## The two directions in practice

A `ReadWrite` binding between a slider and a speed value, with a **Remap Range** modifier, behaves like this:

<table><thead><tr><th width="120">Direction</th><th>Example</th></tr></thead><tbody><tr><td>Read</td><td>Slider 0.5 → remap [0..1] to [0..720] → speed 360</td></tr><tr><td>Write</td><td>speed 360 → inverse remap [0..720] to [0..1] → Slider 0.5</td></tr></tbody></table>

That round trip is the property the whole design protects: a value that leaves the field and comes back is the value you set. Modifiers that cannot be inverted say so, and are only offered where they make sense.
