The native extension is .flexure.json. Files are UTF-8 JSON and contain the
entire logical workspace, including all windows and tabs. Runtime caches, current
NT values, and recording payloads are not embedded.
{
"format": "flexure-workspace",
"version": 1,
"id": "workspace-id",
"name": "Competition",
"theme": {
"seed": "#00BAAD",
"mode": "dark"
},
"windows": [
{
"id": "window-main",
"tabs": ["tab-teleop"],
"activeTabId": "tab-teleop"
}
],
"tabs": [
{
"id": "tab-teleop",
"name": "Teleop",
"viewport": { "x": 0, "y": 0, "zoom": 1 },
"elements": [
{
"id": "voltage",
"kind": "widget",
"widgetType": "voltage-view",
"frame": { "x": 0, "y": 0, "width": 256, "height": 128 },
"z": 0,
"title": "Voltage",
"config": {
"topic": "/SmartDashboard/Voltage",
"period": 0.06
}
}
]
}
],
"recording": {
"selectionMode": "all",
"include": [],
"exclude": []
},
"extensions": {}
}IDs are stable opaque strings. Coordinates are logical CSS pixels in the
canvas world and are independent of monitor DPI. extensions and unknown
fields are retained across load/save cycles when possible.
Every tab is assigned to exactly one uniquely identified window. Window bounds store normal-position geometry plus maximized/fullscreen flags. Flexure validates these ownership rules on load, preventing a malformed file from duplicating a live tab across windows or leaving a tab inaccessible.
Elastic import is a migration input, never mistaken for a native workspace. The original Elastic object is retained in import metadata until the first successful explicit save.