Skip to content

Wiring

Each flow is one .json file in data/wiring/: a name, a map of nodeId -> {block, config}, and a list of ["node.port", "node.port"] wires. This file is the single source of truth — the editor writes it, an IDE can edit it directly, and it diffs cleanly in git.

{
"name": "hallway_lights",
"nodes": {
"motion": {
"block": "@hass/trigger",
"config": { "entity": "binary_sensor.hallway_motion" }
},
"debounce": {
"block": "debounce",
"config": { "ms": 30000 }
},
"set_light": {
"block": "@hass/action"
}
},
"wires": [
["motion.changed", "debounce.signal"],
["debounce.stable", "set_light.call"]
]
}

The editor does not regenerate wiring files from memory. Every mutation patches only the specific JSON path that changed (via jsonc-parser, the same library VS Code uses for settings.json), so a no-op produces byte-identical output and a config edit is a single-token replacement. Your formatting survives.

Every write to data/blocks or data/wiring — from the editor, an external edit, or the embedded agent — is auto-committed to a dedicated git repository (data/.git), separate from your project’s own history. Undo/redo is derived from this log, so it survives coordinator restarts, and the editor’s History panel can restore any point in time as a new forward commit.