The mechanism fits in one sentence: **any word written between double curly braces in a text field makes a new input point appear on the block.** You punch a hole in your sentence, and Celestory builds the socket that will fill it. 🪄

---

## ✍️ The principle in three steps

In a Dialogue block, you type:

```plain text
Hello {{FirstName}}! You have {{Score}} points.
```

1. **You write.** Two inputs appear on the block: `FirstName` and `Score`.
1. **You connect.** They are points like any other: plug in a variable, another block's output, or type a hard-coded value.
1. **Celestory substitutes.** At runtime, each reference gives way to the value it received.

🔺 **A single curly brace triggers nothing.** `{FirstName}` will be displayed as is, literally.

🔺 **Creating the point is not enough, you have to wire it.** An input left dangling is replaced by **nothing at all**: your sentence becomes "Hello ! You have  points.", without the slightest error message.

---

## 🔤 What you are allowed to write between the braces

The name only accepts **unaccented letters**, **digits** and the **underscore** `_`. Everything else breaks detection **silently**: no input is created.

```plain text
{{FirstName}}     ✅ detected
{{Score_2}}       ✅ detected
{{Café}}          ❌ the accent breaks everything
{{my-score}}      ❌ the hyphen is not accepted
{{ FirstName }}   ❌ nor are the spaces
```

🔺 No, you **cannot** write `{{Café}}`. Put your accents in the rest of the sentence, never inside the braces.

🔺 Case matters: `{{Score}}` and `{{score}}` create **two different inputs**.

---

## 🔁 The same variable quoted several times

```plain text
Well played {{FirstName}}! Really, {{FirstName}}, what a game.
```

Celestory creates **only one point**, `FirstName`, not two. You wire it once, and **every** occurrence is replaced. ✅

---

## 🎚️ What type is the point that gets created?

The point is not locked to "Text". It accepts **Text**, a **Number**, a **Boolean**, a **Date**, a **Single select** or a **Multiple select** interchangeably, and the value is converted to text when displayed.

Two blocks also accept an **Object**: **Format text** and the **Dialogue** block of the Chatbot template. The object is inserted there in its raw form, which is useful for debugging but rarely elegant for a player.

The **HTML5** block, for its part, accepts two types the others don't: a **Color** (inserted in its `#1f5fd0` form) and a **CSS Unit** (inserted with its unit, `12px`). It accepts neither an Object, nor a Date, nor selections (what is new on this page applies to the nine other blocks). See **Parameterizing an HTML5 app from the Graph**.

### 🏷️ A selection is written with the label of the option

Connect a **Single select** or **Multiple select** variable to the point: the text shows **the label of the chosen option**, in the player's language if you translated the options. For a multiple selection, it is the labels of the checked options, separated by a comma and a space ("Book, Bow"), in the order of the option list. See [Selection variables (single and multiple)](lien:tool-elements/selection-variables.md).

### 📅 A date is written out in full

Connect a **Date** (a variable or a date block): the text shows the date and the time, with the month spelled out, **in the player's language**, otherwise in the project's language, otherwise in the device's language, and in the time zone of the player's device. For another format (weekday only, short format, custom pattern), go through the **Format a date** block first and connect its text.

---

## 🧱 The blocks concerned

The mechanism is not universal: it lives in ten blocks.

**Whatever the template:** **Format text** (the dedicated block, which does nothing else and returns the assembled text), **Notification**, and **HTML5**, where the braces go in the code, not in a text field.

**Chatbot template:** **Dialogue**, **Choice with dialogue**, **Narrator**, **Alert**.

**Visual Novel template:** **Dialogue**, **Alert**, **Slide**.

🔺 Everywhere else, `{{...}}` is nothing but ordinary text. Need a dynamic sentence in another block? Build it with **Format text** and wire its output wherever it is needed.

---

## ⚠️ Renaming a reference means losing its wire

A point is only recognised by its exact name. If you correct `{{FirstName}}` to `{{PlayerFirstName}}`, Celestory considers that the old point no longer exists: **it deletes it, and deletes the link that was plugged into it.** The new point appears blank. Likewise, removing `{{Score}}` from the sentence makes the `Score` input disappear.

So check your connections after every text tweak, especially on a block that holds five or six references.

---

→ Next step: open a **Format text** block, write `Hello {{FirstName}}, you have {{Score}} points.`, connect the two inputs to your variables and wire the output into a Dialogue block. You are holding the basic building block of all personalisation in Celestory.
