Updated documentation: Variables overview, board variables, component variables, attributes, and the current JSON export structure.
Engine and runtime guides: Unity, Unreal Engine, Godot, and custom Arcscript interpreters.
Arcweave 5.11, released on September 2, 2026, introduces component variables and unifies board- and component-scoped values under the attributes data model. This makes reusable, scoped state possible across boards and components, but it also changes the JSON representation consumed by custom integrations.
You should review this guide if you:
If you only author and play projects inside Arcweave, no manual migration is required in most cases. Existing board variables are migrated automatically. One known exception is a migrated board string variable whose authored default was empty: it may be stored as null, which Arcscript does not accept as a variable value. If you used empty-string board defaults—or if an existing variable is missing or behaves differently—contact Arcweave support rather than recreating it manually.
Before 5.11, global and board variables were stored together in the top-level variables object. A board referenced its variables through a variables array.
From 5.11 onward:
variables object;attributes arrays;customId is its Arcscript member name;customId is its Arcscript scope; andFor example, castle.drawbridge_open still uses castle as its scope and drawbridge_open as its member name. Only its exported storage representation has changed.
The following are simplified excerpts that show only the records relevant to this migration. Real exports also include root and folder records in variables; loaders should ignore entries with root or children.
{
"boards": {
"board-uuid": {
"name": "Castle",
"customId": "castle",
"variables": ["variable-uuid"]
}
},
"variables": {
"variable-uuid": {
"name": "drawbridge_open",
"type": "boolean",
"value": false,
"cType": "boards",
"cId": "board-uuid"
}
},
"attributes": {}
}
{
"boards": {
"board-uuid": {
"name": "Castle",
"customId": "castle",
"attributes": ["variable-uuid"]
}
},
"variables": {},
"attributes": {
"variable-uuid": {
"name": "drawbridge_open",
"customId": "drawbridge_open",
"cType": "boards",
"cId": "board-uuid",
"value": {
"type": "boolean",
"data": false
}
}
}
}
The object key variable-uuid is unchanged. Integrations should continue to treat that key as the stable identity of the value.
| Before 5.11 | From 5.11 | Notes |
|---|---|---|
board.variables |
board.attributes |
The array still contains stable IDs. |
variables[id].name |
attributes[id].name and attributes[id].customId |
customId is used as the Arcscript member name. |
variables[id].type |
attributes[id].value.type |
Supported variable types are unchanged. |
variables[id].value |
attributes[id].value.data |
Plain empty strings may be represented as null. |
variables[id].cType |
attributes[id].cType |
boards or components for scoped values. |
variables[id].cId |
attributes[id].cId |
The owning board or component UUID. |
An attribute is a scoped Arcscript variable when all of the following are true:
customId.customId.boolean, integer, float, or string with plain: true.Rich-text strings, component lists, and asset lists remain regular attributes; they are not Arcscript variables.
{
"customId": "display_name",
"cType": "components",
"cId": "hero-component-uuid",
"value": {
"type": "string",
"data": "Ada",
"plain": true
}
}
If the component has customId: "hero", the corresponding Arcscript name is hero.display_name.
A compatible loader should inspect two top-level sources:
variables object, which contains global variables and, in pre-5.11 exports, board variables. Skip root and folder records.attributes object, which contains eligible scoped variables in 5.11 and later.For a transition period, we recommend accepting the old board-variable shape as well as the new attribute-backed shape. This lets a project load exports created on either side of the release.
In language-independent terms, the loader should:
variables = empty collection
for each (id, variable) in project.variables:
skip it if it has a root or children field
if variable.cType is global or missing:
variables.add(id, variable.name, normalize(variable.type, variable.value))
continue
if variable.cType is boards:
resolve the board through variable.cId
skip it unless board.customId is present
scriptName = board.customId + "." + variable.name
variables.add(id, scriptName, normalize(variable.type, variable.value))
for each (id, attribute) in project.attributes:
skip it unless its owner type is boards or components
skip it unless it is boolean, integer, float, or a plain string
resolve the owner through attribute.cType and attribute.cId
skip it unless both owner.customId and attribute.customId are present
scriptName = owner.customId + "." + attribute.customId
defaultValue = normalize(attribute.value.type, attribute.value.data)
variables.add(id, scriptName, defaultValue)
Normalize null plain strings to "". Do not use truthiness to decide whether a value exists: false and numeric zero are valid defaults.
If your models mirror the export structure, also retain:
board.attributes;component.customId;attribute.customId; andattributes object.Use a plugin version compatible with Arcweave 5.11 and generate a fresh export after updating it.
| Integration | Compatible release | Required action |
|---|---|---|
| Unity | 3.0.0 or later | Recreate imported project assets and test existing runtime variable saves. |
| Godot | 3.0.0 or later | Replace the complete plugin directory, rebuild the C# project, and reinitialize the Arcweave asset. |
| Unreal | 2.0.0 or later | Update the plugin, headers, and bundled native libraries together. |
The updated plugins use stable IDs when reporting variable changes and saving runtime state. If game code reads these dictionaries directly or stores them externally, update and test that code before shipping. Back up existing saves first, and do not assume that every legacy scoped-variable save can be mapped by name without knowing its owning scope.
Test migration on a copy of the project and keep a last-known-good export. Verify all of the following before updating a production build:
variables.show(...) expressions update correctly.reset(...) and resetAll(...) restore the authored defaults.false and numeric zero are not treated as missing; for migrated empty-string board defaults, verify the known null issue described above.Arcweave is a hosted application and does not currently offer a per-project switch to an older editor version. Reverting an editor build alone is also not safe after project data has been migrated to the new representation.
If an upcoming milestone prevents an immediate integration update, contact the Arcweave team on our Discord server or send us a Support request email. Provide:
We can then verify the data migration and help produce a targeted integration guide. Avoid manually recreating variables before that comparison, because doing so can make stable ID and save-state recovery harder.
Export formats are production APIs. Future breaking JSON changes will ship under an explicit schema or API version, with advance notice, example fixtures, a compatibility period, and migration documentation published before the change becomes the default.
For additional reference, see the Arcweave variables documentation, attributes documentation, and the integration guides for Unity, Unreal Engine, and Godot.