1.6.9
What's changed
Changes since 1.6.8
🚀 New features
- #2206 - Raise the upload lane to 4 slots, 7 on esphome 2026.8+ (@bdraco)
- #2256 - Support TLS MQTT brokers in device discovery (@bdraco)
- frontend#1339 - Link the remote build pairing issue form from the feedback dialog (@bdraco)
- frontend#1334 - UI/UX modifications for the tour (@stvncode)
- frontend#1345 - Add a report-an-issue kebab menu to the ESPHome Web header (@bdraco)
- frontend#1366 - Move toasts to the bottom-right corner (@stvncode)
- frontend#1337 - Ask desktop installs how they'll be used before the experience step (@stvncode)
🐛 Bug fixes
- #2237 - Gate MQTT discover broadcasts on dashboard subscriber presence (@bdraco)
- #2239 - Resubscribe on broker reconnect and move MQTT teardown off the event loop (@bdraco)
- #2247 - Retarget the generated fallback-AP SSID on clone, rename, and friendly-name edits (@bdraco)
- #2261 - Report remote build as disabled on a fresh HA add-on install (@bdraco)
- #2265 - Key the OTA address-cache lookup on the configuration filename (@bdraco)
- #2267 - Filter unspecified addresses from device state ingestion (@bdraco)
- #2273 - Type int-keyed catalog enums as integer via live introspection (@bdraco)
- frontend#1338 - Run the leave guard before Escape pops history in the device editor (@bdraco)
- frontend#1335 - Reveal the fresh clone: clear the search and highlight the new device (@bdraco)
- frontend#1355 - Ship unparseable FLOAT values verbatim from the add-component coercer (@bdraco)
- frontend#1352 - Mirror the single-value numeric widgets in list rows (@bdraco)
- frontend#1351 - Validate scalar multi_value lists per item (@bdraco)
- frontend#1347 - Round-trip substitution references in numeric list rows (@bdraco)
- frontend#1341 - Wrap long dialog titles instead of ellipsizing them (@bdraco)
- frontend#1344 - Edit a pin mode substitution shorthand as text (@bdraco)
- frontend#1342 - Show substitution references in long-form pin fields (@bdraco)
- frontend#1340 - Mention Firefox in the web.esphome.io unsupported-browser message (@bdraco)
- frontend#1389 - Treat a string-opening hash as a comment only when the colon had a separator (@bdraco)
- frontend#1387 - Carry nested flow-list style and comment on the value via YamlFlowList (@bdraco)
- frontend#1386 - Parse comment-only values as empty and re-append their comment on edit (@bdraco)
- frontend#1383 - Splice mapping lists per item so row comments survive edits (@bdraco)
- frontend#1380 - Re-emit edited flow lists in flow style with their trailing comment (@bdraco)
- frontend#1377 - Splice block scalar lists per item so comments survive edits (@bdraco)
- frontend#1376 - Bail color fields to editable text when the value is not #rrggbb (@bdraco)
- frontend#1375 - Route both wa-select emit paths through coerceValueToEntryType (@bdraco)
- frontend#1374 - Fall through to the flag group when a nested scalar shorthand is cleared (@bdraco)
- frontend#1370 - Keep unparseable boolean values editable instead of clobbering on toggle (@bdraco)
- frontend#1369 - Fix duplicate key when filling a hand-typed bare key in the structured editor (@bdraco)
- frontend#1367 - Ship non-finite float-with-unit input verbatim and keep junk strings editable (@bdraco)
- frontend#1364 - Guard the remaining numeric emit paths against non-finite and prefix-parsed input (@bdraco)
- frontend#1362 - Coerce scalar-field numerics and normalize the visibility gates (@bdraco)
- frontend#1359 - Parse plain numeric list items as numbers (@bdraco)
- frontend#1358 - Route backend list-item errors to the offending row (@bdraco)
- frontend#1357 - Ship unrecognised BOOLEAN values verbatim from the add-component coercer (@bdraco)
- frontend#1391 - Gate experience_level off the remote-builder onboarding path (@bdraco)
🔄 Refactor
- #2243 - Consolidate the presence-gated loops onto one shared primitive (@bdraco)
- #2249 - Parse esphome meta once per content string in the device mutation paths (@bdraco)
- #2252 - Consolidate cancel-on-exit task teardowns into a shared running_task helper (@bdraco)
- #2254 - Migrate firmware test teardowns onto running_task (@bdraco)
- frontend#1382 - Consolidate per-key section metadata into one KeyMeta record (@bdraco)
🧹 Maintenance
- #2231 - Point web.esphome.io reporters at the frontend issue form (@bdraco)
- #2234 - Trim the two slowest tests without losing coverage (@bdraco)
- #2250 - Consolidate the test suite's condition-polling helpers (@bdraco)
- #2255 - Await real signals instead of polling in two test suites (@bdraco)
- #2263 - Add an issue form for remote build pairing problems (@bdraco)
- frontend#1330 - Correct the Web Serial browser support note (@bdraco)
- frontend#1328 - Add a web.esphome.io issue form and route the chooser (@bdraco)
- frontend#1336 - Switch package manager from npm to pnpm (@stvncode)
⬆️ Dependencies / CI
9 changes
- #2226 - ci: bump actions/setup-python from 6.3.0 to 7.0.0 (@dependabot[bot])
- #2227 - ci: bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 (@dependabot[bot])
- #2229 - Adopt the uv-managed Python composite for every CI job but CodSpeed (@bdraco)
- #2230 - Run CI utility jobs on Python 3.14 (@bdraco)
- #2232 - Cache CI venvs and stop pruning the uv wheel cache (@bdraco)
- #2233 - Cache the managed interpreter independently of dependency files (@bdraco)
- #2235 - Enable ccache for the native ESP-IDF e2e job (@bdraco)
- #2258 - ci: bump actions/checkout from 7.0.0 to 7.0.1 (@dependabot[bot])
- #2270 - ci: bump astral-sh/setup-uv from 8.3.2 to 9.0.0 (@dependabot[bot])