> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://documentation.celestory.io/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Variable

# 🟦 Variable

${frame}[Video: anatomy of the Variable block](https://celestory-docs-videos.netlify.app/en/anatomie-bloc/variable.html)

The **Variable** block materialises one of your project's declared variables inside the graph, so you can wire it to other blocks: either to read its value, or to designate which variable a block should modify.

It is a "label" block: it does not sit on the flow path and has no ▶ point. You drop it next to the blocks that need it and pull a wire from the point on its right. A single Variable block can feed several blocks at once.

## 📥 Inputs

*   *No input* : this block receives neither flow nor value. Everything it holds is fixed when you create it, by picking the project variable it stands for.

## 📤 Outputs

*   **(single point, Variable type)** : the block's only point, on its right. Its value type is that of the chosen variable (Text, Number, Boolean, Image, Background image, List, File, Object). The point carries no label: it is the block's name — automatically taken from the variable's name — that identifies it on the canvas.

This single point wires up in two ways:

*   to a **Variable** input (the `variable` point of the Assign, Multiple assign, Increment, Decrement… blocks): you then designate *which* variable the block must modify;
*   to a **Value** input of a compatible type: you then pass the variable's *current value* (for example to a Condition, Expression or Format text block).

## 💡 Example of use

${frame}[Video: the Variable block, with Assign and Increment](https://celestory-docs-videos.netlify.app/en/graphe-blocs/variable.html)

**Scenario: a health counter displayed then decremented**

1. In the variable browser, you create a `HealthPoints` variable of type Number, initialised to 100.
2. In the graph, right-click on the canvas → the **Add block** menu opens; scroll down to the **Variables** section at the bottom of the list and click `HealthPoints`. A small blue block named `HealthPoints` appears.
3. You wire its right-hand point to the `variable` input of a **Decrement** block, and set that block's `value` to 10: every pass of the flow will remove 10 health points.
4. You drop a second `HealthPoints` Variable block next to a **Dialogue** block, and wire its point to the input created by `{{HealthPoints}}` in the dialogue text: the character will announce the up-to-date value.
5. The flow continues: the player reads "You have 90 health points left."

## ⚙️ Technical Details

*   **Internal identifier** : `variable`
*   **How to add it (important)** : the Variable block **does not appear in the block list** of the *Add block* menu, and searching for the word "Variable" will not surface it: the block list explicitly filters it out. You add it from the **Variables** section at the bottom of that same menu, which lists one entry per project variable (typing the *variable's name* in the search field does filter that section). Consequence: if the project declares no variable, the section is absent and the block cannot be added.
*   **Other way to add it** : pulling a wire from a block's value input and releasing it on empty canvas opens the completion menu, which directly offers the project variables of a compatible type; picking one creates the Variable block already wired.
*   **Graph-type variables are excluded** : they correspond to blackboxes and are not offered in the Variables section (they are offered as an *Open a graph* block instead).
*   **Not reachable by transformation** : the command that changes an existing block's type (right-click on a selected block) never offers the Variables section.
*   **One block, several wires** : unlike stream points (▶), which accept only one outgoing connection, a Variable block's point can be wired to as many blocks as needed.
*   **Tightly bound to the variable** : the block only stores the variable's identifier (`variableUid`); its name and its point's type are derived from it. Renaming the variable renames the block. **Deleting the variable in the variable browser deletes every Variable block that represents it, across all the project's graphs**, along with their connections.
*   **Value read at runtime** : the block stores no value of its own. When read, it returns the variable's current value in the player state — that is, the last value written by the Assign / Increment blocks that ran before it in the flow.
*   **Custom canvas rendering** : this block is drawn in a compact form (a pill with the name and a single point on the right), without the header and point list of ordinary blocks.