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"] ]}Minimal-diff writes
Section titled “Minimal-diff writes”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.
Git history for free
Section titled “Git history for free”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.
