OmniMotion®
GuideDraft

Data sources

Lists — named tables of data that repeaters, streams, text, images, maps, sentences and the host page all read.

A list is a named table of data your scene owns — products you typed, a feed from a URL, rows the page embedding your scene pushes in. You make it once in the Variables tab under Lists, and everything reads it by name. A Data Repeater is not the list — it prints one card per row. Change the list and every reader follows.

In expressions, sentences and the host page the same thing is called a Data source: On Data, Set Data, Data field, data('Products', …). It is the same list.

01Making a list

Open the Variables tab in the left panel and switch its top to Lists. Press + and pick the type of the first field — Number, Text, Toggle or Color. A list called List appears with one item; click the name to rename it. Renaming updates every reader in the scene.

The Lists face of the Variables tab: a list called Products with its row count, the ··· options button, and two items with name, price and featured fields

The items are listed one under another, numbered from 0. Each field shows its type icon, its name and its value:

ToDo
Add a row+ Item
Add a field+ Field, then pick its type
Rename a fieldClick its name
Change a field's type, or remove itClick its type icon — the types, then Remove field
Delete a rowThe trash icon on that item

The number next to the list's name is its row count. Every edit is one undo step. Data that is not a table of rows — a single object, nested JSON — shows as JSON text instead.

02Where the rows come from

··· (List options) on the list picks where its rows come from, and holds its switches:

OptionWhat it does
TableRows you type here (the default)
URLA JSON or CSV feed. A URL row appears with Fetch; the rows it brings in are read-only. Until the first fetch the list says Fetch to fill this list.; a failed fetch shows its error under the URL
PageThe page embedding the scene pushes the rows in — see The host page. Until it does, the list says Waiting for the page.
PersistThe player keeps this list after a refresh — a cart. The file still holds the design rows, not the visitor's
Exposed to hostThe embedding page can read and write the list by name
Delete listRemoves it

A switched-on option reads Persist · on / Host · on.

The last successful fetch is saved inside the scene file. Open the scene with no network and every reader shows those rows until a fetch succeeds.

A named slice of a list — Featured, sorted by price, the first eight — is a View; see Lists and views.

03Reading a list

Everything reads by name plus a dotted path into the data: Products.0.name, Stats.cpu, Menu.items.length. Arrays take a number for the index; length works on any array.

Cards — Data Repeater

In a Data Repeater, set Data to List and pick the list. The number of copies follows the rows. Two repeaters can read the same list — a grid and a ticker of the same products, one fetch.

A repeater that has its own JSON or URL can hand it over with Share as list: a list is created from it and the repeater switches to it.

A mesh with a Data Repeater and Clones → Gallery takes one photo per row: the Gallery says Bound on Data Repeater and follows the list live — the 3D twin of the cards above.

Numbers — streams

Wherever a stream source is picked (the ∿ badge, a value in a sentence, a sequence driver), the Data group offers Data field: pick the Source (the list), pick or type the Path. The result is a number, so the transform chain applies — map a 0…100 load to 0…360°, smooth a price. In a hand-written expression the same read is data('Stats','cpu'); the segments can be separate arguments, and a String variable can be one of them: data('Strings', text('lang'), 'title').

Two extra path words exist for a list that feeds a repeater: clicked and hover — the row of the copy the visitor last clicked or is pointing at. data('Products','clicked','price') is the price on the clicked card; one rule on the template is enough for a detail panel.

Text and images — templates

Text is not a number, so text comes from a template. Select a text layer and click From… on its Content row; pick a variable or a list, then write the text with placeholders in braces (× on the row goes back to plain text):

{Products.0.name} — {Products.0.price|2} ₺
Now {$now|HH:mm} · {Products.length} items
{Products.clicked.name}
PlaceholderGives you
{Source.path}The value at that path — text as is, numbers as they are, arrays as their length
`{Source.path\2}`A number with 2 decimals · `\,2 thousands separator · \%1 percent · \int` rounded
`{Source.path\time} \date \datetime \HH:mm \DD.MM.YYYY \ddd D MMM`A date value (a timestamp or an ISO text) formatted — pattern words: YYYY MM M DD D HH H mm ss ddd MMM
{$name}A scene variable's text · `{$score\%0}` formats a number variable
`{$now\HH:mm:ss}`The current time
{{ }}A literal brace

An Image or Video layer has ∿ From data… next to its source: a template that resolves to a URL (or a library asset:12). An empty result leaves the current image alone.

The same placeholders work in a sentence's Set Text and Set Image actions, and in the URL and body of Send request and Open URL.

Markers — maps

A map layer's Markers section has ∿ Markers from data…: pick the source, the array path, and which fields hold longitude, latitude and, optionally, a label, a colour (#hex) and an icon URL. Markers you added by hand stay; the data ones refresh with the source. Both kinds are now saved with the scene.

Reacting — sentences

Sentence partWhat it does
On Data (trigger)A list was written — by a fetch, the host, or a Set Data action. Watch Updated (any write), Row count changes, or A field changes with a path
Every N seconds (trigger)Repeats while the scene plays — rotate a headline, tick a clock
After idle (trigger)Fires once after N seconds without pointer, keyboard or signal input; any input re-arms it — a kiosk returning home
Refresh DataRe-fetches a URL list (or a repeater's own URL)
Set DataWrites into a list: Set a field, Append row, Remove at index, Clear. The value is =expression for a number, JSON text for an object or row, anything else as template text
Send requestGET / POST / PUT / DELETE a URL with an optional JSON body; the response can land in a list
Open URLOpens a link (new tab by default)
Go to artboardPlays another artboard — the page of your app — in Play, Preview and the player, with a transition — Moving between artboards

A cart is three sentences: On click → Set Data Cart Append row {"id": {Products.clicked.id}}, a text bound to {Cart.length} items, and On click → Send request POST with {"items": {Cart}} into Receipt.

The host page

A page embedding the scene can read a list marked Exposed to host with getData('Products'), push any JSON value with setData('Products', value), and list what is exposed with listDataSources(). See Embedding.

04The ✦ Assistant

The assistant sees your lists and their shape in the scene, and can create them — including Views: "make a product grid from this URL, show the clicked product's price in the panel, flash the heading when the list changes" lands as one list, one repeater, one template, one On Data rule.

05Shortcut recap

MakeVariables tab → Lists → + → first field type
Rows+ Item · + Field · type icon → type or Remove field · trash deletes a row
Source··· → Table / URL / Page · Persist · Exposed to host
Text / image from dataContent row → From… · Image → ∿ From data…
Number from dataany ∿ picker → Data › Data field
CardsData Repeater → Data → List
Checked against the tool on 2026-09-30.