Releases: SH1FT-W/flode
Releases · SH1FT-W/flode
Release list
v1.5.1
Bug Fixes
- Fixed dialog scrolling being silently blocked inside the FLODE panel (Shadow DOM): scrollable content in dialogs (e.g. the automation list in "Open Automation") no longer ignores wheel/trackpad scroll. Root cause was Radix Dialog's default scroll lock breaking under Shadow DOM event retargeting; dialogs are now non-modal for scroll-locking purposes while still dimming/blocking the background.
- Fixed incorrect colors on native Home Assistant form fields and dropdowns (e.g. the entity picker field, select dropdowns) in dark mode.
v1.5.0
New features
- The node property panel's ID field now works correctly for triggers, so
{{ trigger.id }}templating andchoose:/condition: triggerrouting can be set up entirely from the canvas. - FLODE now warns (inline in the property panel and with a badge on the canvas node) if two triggers in the same automation end up with the same ID, since that would make routing ambiguous or fail to load in Home Assistant.
Bug fixes
- Fixed the ID field silently producing an invalid save ("extra keys not allowed") when set on action, delay, wait, or set_variables nodes — Home Assistant's schemas only support a per-step
id:on triggers, so the field is now scoped to trigger nodes only.
v1.4.0
Added
- Quick-add menu on empty-canvas connection drop — drag a connection from a node's handle and release it on empty canvas to get a searchable node picker at the drop point instead of losing the connection. Picking a type creates that node there and auto-wires the dragged connection to it. Direction-aware: dragging from a source handle excludes Trigger (it has no target handle to satisfy the drag); dragging from a target handle offers Trigger but not compound blocks (no single well-defined exit point to wire).
Fixed
- Compound-block entry point was assumed to be the first node, which was wrong for
repeat_while— its first node is the loop body, not the while-condition that actually runs first (found while wiring quick-add's auto-connect for compound blocks).parallelalso has two independent branches with no single entry at all.block-factories.tsnow returns an explicitentryNodeIdsper block instead of callers guessingnodes[0].
v1.3.2
Added
- Undo/Redo on the canvas — Cmd+Z / Cmd+Shift+Z (also Ctrl+Y), plus buttons in the canvas toolbar. Tracks graph content (nodes, edges, name, description, metadata) only — selection, simulation, and clipboard state never create or get reverted by a history entry. Rapid bursts of changes (dragging a node, a run of keystrokes) coalesce into a single undo step instead of one per pointer-move frame. Opening a different automation, or clearing the canvas, resets history so you can't undo into a previous automation.
Fixed
- Externally-controlled value in a log format string (CodeQL
js/tainted-format-string) — the deep-link automation ID and a batch-fetch automation ID were interpolated directly intoconsole.warnmessages; a crafted ID containing%s/%dcould garble the logged output. Passed as a separate%sargument instead.
v1.3.1
Added
- Theme toggle in the header — force FLODE into Home Assistant's own light or dark palette independently of your HA profile's theme, or leave it on "Automatic" to keep following your real HA setting as before. Persisted per browser via
localStorage.
Fixed
- Native HA components (pickers, selectors, ...) ignored FLODE's theme entirely, always showing the real HA theme regardless of what FLODE's own chrome displayed — they read Home Assistant's CSS variables directly, which the light/dark override now also overrides in addition to FLODE's own aliased tokens.
- Text color leaked in from the real Home Assistant page instead of FLODE's own theme in panel mode, because FLODE's base color rule targeted
body, which doesn't exist inside FLODE's Shadow DOM there — invisible on any override that diverged from the actual HA theme (e.g. forcing light while signed into a dark HA profile). Fixed by declaring the color/background explicitly on FLODE's own root element instead of relying on inheritance. - Fallback light/dark colors didn't match Home Assistant's real palette — several were approximated by hand and had drifted (
primary-color,primary-text-color,secondary-text-color), and the status colors (error/warning/success/info) were incorrectly varied between light and dark when real HA keeps them constant. Values are now read directly fromhome-assistant/frontend's theme source.
v1.3.0
Added
- Save-dialog metadata — set icon, category, labels, and area directly when saving an automation, matching HA's own automation editor. Prefills from the entity registry when editing an existing automation, without clobbering fields you're already editing.
- Full action targeting — Action nodes can now target by label and floor, in addition to the existing entity/device/area support.
- Native more-info dialogs — clicking an entity name on a node (trigger, condition, or action target) opens HA's own more-info dialog with history and controls, without leaving FLODE.
- Trace overlay on the canvas — load the last automation run and see it highlighted directly in the diagram: executed nodes in green, errors in red, unreached nodes grayed out, plus trigger/timestamp details in the Debug tab.
- Deep links —
/flode?automation=<entity_id>opens FLODE with that automation loaded,/flode?new=1starts a blank one, making "Edit in FLODE" dashboard buttons possible. FLODE also fires aflode_automation_savedevent with the entity_id after every save. - Diagnostics download — standard HA diagnostics (FLODE version, HA version, config options, panel status) via Settings → Devices & Services → FLODE.
- Repair issues for lossy imports — if importing a YAML automation doesn't round-trip losslessly, FLODE now files a persistent Repair issue (Settings → System → Repairs) instead of only a one-time toast.
- Language override — FLODE's integration options (Settings → Devices & Services → FLODE → Configure) now let you pin FLODE's own UI language independent of Home Assistant's active language.
- Exit confirmation — leaving FLODE back to Home Assistant now asks for confirmation first.
Changed
- Toasts use HA's native notification system when FLODE is running as a real panel, falling back to FLODE's own toasts only in standalone dev mode.
- Mobile sidebar toggle now reacts to HA's real
narrowstate instead of only the browser window's width. - "Exit" moved into FLODE's own sidebar, above the node palette, styled to match the palette buttons — previously a header button.
- Removed the "by SH1FT-W" credit line from the sidebar footer.
Fixed
- Integration options were unreachable — a leftover
config_panel_domainsetting made the integration's gear icon always jump into the FLODE panel instead of opening the options dialog, so the new language override had no way to be configured. Removed.
Internal
- Removed the unused
vite-plugin-css-injected-by-jsdependency — the Shadow DOM CSS injection has used Vite's native?inlineimport for a while, this package hadn't been wired into the build in months. - Bumped Yarn from 4.12.0 to 4.17.0.
- Evaluated js-yaml 5 — rejected: it removes the
quotingType/forceQuotesdumper options FLODE relies on for exact YAML formatting, in favor of a new presenter/tag API. Staying on 4.x until that's worth a dedicated migration. - Fixed the automation-trace-to-node mapping, which previously guessed node order from canvas Y-position and broke on any manual repositioning — now walks the graph's actual topology.
v1.2.1
Internal
- Pinned transitive dependencies to patched versions via
resolutions—tar,lodash,minimatch,@isaacs/brace-expansion,uuid,ip-address,picomatch, anddiffwere all resolving to versions flagged by Dependabot advisories through indirect dependencies (build tooling only —node-gyp,graphlib,glob,socks-proxy-agent,ts-node,tinyglobby); none were reachable from the shipped frontend bundle, but all are now forced to the fixed releases.
v1.2.0 — Native Home Assistant UI
Added
- Native Home Assistant theming — FLODE now mirrors HA's active theme (light/dark, custom themes, corner-radius scale) into its own UI at runtime instead of using fixed Tailwind colors.
- Native Home Assistant components everywhere — entity/device/area/service pickers, dropdowns, toggles, and text/number/date/time/duration/template/object fields now use HA's own web components (the same ones you see in HA's built-in automation editor) instead of hand-built equivalents. Falls back automatically to FLODE's previous components when a native one isn't available.
- Shadow DOM panel mount — the panel now shares HA's document via Shadow DOM instead of an iframe, which is what makes loading native components possible in the first place.
- One-time compatibility notice — if a native HA component fails to load or breaks at runtime, FLODE shows a single toast instead of silently degrading field by field, and logs the running HA version once per session to help diagnose future incompatibilities.
Changed
- Duration fields always use the native object picker — the string/object toggle for Delay/Wait duration values was removed now that the object form has full native UI support; existing string-form durations are still read correctly.
- Minimum Home Assistant version raised to 2025.8.0 (previously 2024.6.0) — required for the multi-entity state/attribute selector support the new UI depends on.
Fixed
- Native time picker no longer loses in-progress input — a re-render bug was overwriting object/array field values on every render even when their content hadn't changed, which reset HA's time selector mid-keystroke.
- Delay/Wait/Set-Variables palette entries no longer render white-on-white — a
:rootCSS selector that never matches inside Shadow DOM silently dropped several color tokens; fixed by targeting:root, :host. numeric_statecondition's attribute field now autocompletes correctly against the selected entity's actual attributes.
Internal
- Dependency refresh: patch/minor updates across Radix UI, Tailwind, Vite, Turbo, i18next, Biome, and
@types/node.js-yamlandvite-plugin-css-injected-by-jswere deliberately left on their current major versions pending a dedicated compatibility review. - Trimmed the README (removed the redundant Project Structure and Node Types sections) and refreshed its screenshots and badges for the current UI.
v1.1.0 — Flow-Control Blocks, Performance & Hardening
Added
- Flow-control blocks in the node palette — the Home Assistant control structures that previously couldn't be added from the palette are now first-class draggable blocks: Choose (Fallunterscheidung), If / Else (Wenn / Sonst), Repeat While (Wiederholen solange), Repeat N× (N× Wiederholen) and Parallel. They are created as ready-to-wire compound blocks (correct nodes, edges and handles) and round-trip to the matching HA YAML (
choose:/if-then-else/repeat.while/repeat.count/parallel:) - Grouped palette section — the new blocks live under an "Ablauf-Steuerung / Flow Control" heading, sub-grouped logically into Branching, Loops and Concurrency
- Dedicated "repeat count" field — the N× Repeat block now has a proper number input in the properties panel instead of requiring raw JSON editing
- Labelled exit button — the bare back-arrow in the header is now an explicit "Exit / Beenden" button
Changed
- Much faster initial load via code-splitting — the main bundle shrank from ~3.3 MB to ~408 KB. The transpiler + ELK layout engine and the YAML code editor are now lazy-loaded on demand, and React / React Flow / Radix / i18next are split into long-term cacheable vendor chunks
- Cleaner loop rendering — the Repeat-While block now lays out as action → condition with the loop-back edge routed cleanly around the nodes (a detour over the top) instead of cutting diagonally through them, even when the loop body contains multiple nodes
- The "Beta" status markers were removed from the README and landing page now that the project is stable and well-covered by tests
Fixed
- Type-safety hardening in the Home Assistant bridge —
contexts/HassContext.tsxno longer relies on anyas/as unknown ascasts (13 → 0). Frontend-only fields the editor never reads are now optional on theHomeAssistanttype, registry fetches use the genericsendMessagePromise<T>boundary, and the duplicated registry-loading logic was consolidated
Internal
- Added round-trip tests for the palette block factories (structural + transpile checks for all five blocks); the suite now stands at 292 tests across all packages
- Migrated the Biome configuration to 2.5.0 and applied a repo-wide safe autofix (formatting / import & class sorting only)

v1.0.0 — Major Dependency Overhaul & Choose Block Fixes
Changed
- Major dependency upgrade across the whole monorepo: React 18 → 19, Tailwind CSS 3 → 4, Vite 5 → 8, Vitest 2 → 4, TypeScript 5.7 → 6.0,
@vitejs/plugin-react4 → 6, i18next 25 → 26, react-i18next 16 → 17,custom-card-helpers1.9 → 2.0,lucide-react0.577 → 1.21,uuid13 → 14,commander12 → 15 - Building from source now requires Node.js ≥20.19 (Vite 7+ requirement) — only affects contributors building the frontend, not end users
- Migrated
vitest.workspace.tsto thetest.projectsfield in a rootvitest.config.ts(the standalone workspace file was removed in Vitest 4) - Migrated Tailwind config from
tailwind.config.tsto CSS-native@themeinindex.css, switched from the PostCSS plugin to@tailwindcss/vite
Fixed
- Choose block: first case had no visible connection to its trigger — every other case showed a fan-out hint edge back to the trigger, but the first case's structural edge was invisible by design with no visible substitute. All cases now consistently show the connection (gap noticed while verifying cafe-hass #201)
- Choose block: a choice with
conditions: []was silently dropped on import — Home Assistant treats an empty conditions array as vacuously true, but FLODE filtered such choices out before processing, discarding their actions with no warning. They're now folded into the default branch; a genuinely ambiguous case (multiple empty-condition choices, or a clash with an explicitdefault:) produces a warning instead of silent data loss (fixes cafe-hass #181) - Tailwind v4 dark mode was broken — the canvas stayed on the light background/grid colors instead of switching to dark. Root cause:
@theme { --color-background: hsl(var(--background)) }gets resolved against:rootat build time in Tailwind v4 instead of being re-evaluated per element; switched to@theme inline - Two latent bugs surfaced by the Vitest 4 upgrade: an ineffective
tsconfig.jsonexclude pattern (__tests__only matched the project root, not nested folders, so compiled test files leaked intodist/), and missingnodeambient types in the transpiler'stsconfig.json
Tests
- 282 tests, all green across the full dependency upgrade