Dermot Duffy
8f953547b1
fix: Connect the microphone when an inbound call is *answered* ( #2609 ) ( #2612 )
...
- Closes : #2609
2026-07-25 20:56:07 -07:00
Dermot Duffy
2a84f199de
fix: Size the expanded dialog and grid columns to their content ( #2611 )
...
- Closes #2607
2026-07-25 13:46:31 -07:00
Dermot Duffy
5f2c7f5e4e
fix: Prevent the media grid from collapsing when its cells are unchanged ( #2608 )
...
- For: #2306
2026-07-24 18:06:35 -07:00
Dermot Duffy
0a763b73a6
docs: Add config example for problematic doorbells ( #2604 )
2026-07-24 10:55:45 -07:00
Dermot Duffy
f419798e8e
fix: Exponentially back off initialization-error retries ( #2579 ) ( #2605 )
...
- Closes #2579
2026-07-24 10:54:31 -07:00
Dermot Duffy
54f75beb9d
fix: Improve media_query retry behavior ( #2603 )
2026-07-23 22:19:17 -07:00
Dermot Duffy
6817d27c91
fix: Guard the ha provider MJPEG stream URL against a missing access_token ( #2602 )
...
- Closes : #2601
2026-07-23 09:42:05 -07:00
Dermot Duffy
cd53ebd3c8
fix: Correctly bind MJPEG stream URL in the ha live provider ( #2305 ) ( #2600 )
...
- Closes : #2305
2026-07-22 22:00:47 -07:00
Dermot Duffy
448fa2d9f1
feat: Surface the provider's error cause in the media_unavailable notification ( #2599 )
...
- Closes : #2592
2026-07-22 20:45:49 -07:00
Dermot Duffy
5a549c0326
fix: Prevent microphone auto-disconnect during calls and restore the removed microphone connected condition ( #2597 )
...
- Closes : #2590
2026-07-22 16:12:31 -07:00
Dermot Duffy
8c36637092
fix: Only report a live error from the visible ha-camera-stream player ( #2596 )
...
- Closes : #2583
2026-07-22 13:45:46 -07:00
Dermot Duffy
7d66c5f005
chore: Replace ts-prune with knip ( #2595 )
...
- Closes : #2593
2026-07-22 13:26:34 -07:00
Dermot Duffy
2ca4aa95e5
chore: Replace deprecated 'node' module resolution with 'bundler' and tighten compiler options ( #2594 )
2026-07-22 12:12:00 -07:00
Dermot Duffy
87ecbc7e45
feat: Trigger automations on call answered, rejected and hung up ( #2591 )
2026-07-22 11:11:57 -07:00
dependabot[bot]
2400e20134
chore(deps): bump release-drafter/release-drafter from 7.5.1 to 7.6.0 ( #2585 )
...
Bumps
[release-drafter/release-drafter](https://github.com/release-drafter/release-drafter )
from 7.5.1 to 7.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-drafter/release-drafter/releases ">release-drafter/release-drafter's
releases</a>.</em></p>
<blockquote>
<h2>v7.6.0</h2>
<h1>What's Changed</h1>
<h2>New</h2>
<ul>
<li>feat: resolve release commitish refs to commit SHAs (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1649 ">#1649</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
<li>feat: add new contributors list (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1645 ">#1645</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
<li>feat: support pull request co-authors (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1646 ">#1646</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
<li>feat: support per-key merge strategies in <code>_extends</code> (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1642 ">#1642</a>)
<a
href="https://github.com/ReneWerner87 "><code>@ReneWerner87</code></a>,
<a href="https://github.com/cchanche "><code>@cchanche</code></a>, <a
href="https://github.com/jetersen "><code>@jetersen</code></a></li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>fix: .github in legacy <code>_extends</code> refs (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1650 ">#1650</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
<li>fix: normalize release target branch refs (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1648 ">#1648</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
<li>fix: duplicate and skipped release contributors (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1644 ">#1644</a>)
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
</ul>
<h2>Maintenance</h2>
<ul>
<li>chore(deps): update dependency typescript to 7.0.2 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1667 ">#1667</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>ci(deps): update github/codeql-action digest to 7188fc3 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1654 ">#1654</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>ci(deps): update actions/stale digest to 1e223db (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1653 ">#1653</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore(deps): update dependency <code>@types/node</code> to 24.13.3
(<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1661 ">#1661</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore(deps): update vitest to 4.1.10 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1656 ">#1656</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore(deps): update graphql-codegen (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1663 ">#1663</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore(deps): update dependency vite to 8.1.4 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1662 ">#1662</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a>,
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a></li>
<li>chore(deps): update dependency nock to 14.0.16 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1655 ">#1655</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore(deps): update dependency <code>@biomejs/biome</code> to 2.5.3
(<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1660 ">#1660</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>ci(deps): update actions/checkout action to v7.0.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1669 ">#1669</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>ci(deps): update actions/setup-node action to v7.0.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1670 ">#1670</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
<li>chore: update generated GraphQL types (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1641 ">#1641</a>)
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a>,
<a href="https://github.com/jetersen "><code>@jetersen</code></a></li>
</ul>
<h2>Dependency Updates</h2>
<ul>
<li>fix(deps): update dependency graphql to 16.14.2 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1657 ">#1657</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a>,
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a></li>
<li>fix(deps): update dependency yaml to 2.9.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1666 ">#1666</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a>,
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a></li>
<li>fix(deps): update dependency semver to 7.8.5 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1659 ">#1659</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a>,
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a></li>
<li>fix(deps): update dependency ignore to 7.0.6 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1658 ">#1658</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a>,
<a
href="https://github.com/apps/github-actions "><code>@github-actions[bot]</code></a></li>
<li>chore(deps): update dependency <code>@biomejs/biome</code> to 2.5.3
(<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1660 ">#1660</a>)
<a
href="https://github.com/apps/renovate "><code>@renovate[bot]</code></a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/ReneWerner87 "><code>@ReneWerner87</code></a>
made their first contribution in <a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1642 ">#1642</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-drafter/release-drafter/compare/v7.5.1...v7.6.0 ">https://github.com/release-drafter/release-drafter/compare/v7.5.1...v7.6.0 </a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/eada3c96a64734dd381cfbda23511034e328ddb0 "><code>eada3c9</code></a>
chore: release v7.6.0</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/4621843980a0844866eefbe4d5f92e680fce5d81 "><code>4621843</code></a>
migrate biome config</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/e9aeda788e59684f9fe90b4ca1a32f60f0b3bf29 "><code>e9aeda7</code></a>
chore(deps): update dependency typescript to 7.0.2 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1667 ">#1667</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/c943e7c8b72b3d6c5fab33cfd024317893d5c320 "><code>c943e7c</code></a>
fix(deps): update dependency graphql to 16.14.2 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1657 ">#1657</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/b9af92564053e016d0bf080da7c24704c159ee4e "><code>b9af925</code></a>
fix(deps): update dependency yaml to 2.9.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1666 ">#1666</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/f4aa1589c4bd889abd152b42a03071c0695716b8 "><code>f4aa158</code></a>
ci(deps): update github/codeql-action digest to 7188fc3 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1654 ">#1654</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/93973850c385e1ad1901d254003cf654b2fb7f4a "><code>9397385</code></a>
ci(deps): update actions/stale digest to 1e223db (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1653 ">#1653</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/5dd9f212bc0430df55c6f9b360720a2d08ddc157 "><code>5dd9f21</code></a>
chore(deps): update dependency <code>@types/node</code> to 24.13.3 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1661 ">#1661</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/903a9a10909a48b47c20e26c545bac26676d69cd "><code>903a9a1</code></a>
chore(deps): update vitest to 4.1.10 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1656 ">#1656</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/2796d1b6a0ad34872845939207b3af9aac1b346f "><code>2796d1b</code></a>
fix(deps): update dependency semver to 7.8.5 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1659 ">#1659</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/release-drafter/release-drafter/compare/v7.5.1...v7.6.0 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-21 22:31:53 -07:00
Dermot Duffy
f28b16a4b5
feat: Compress related editor fields into grid rows ( #2589 )
2026-07-21 22:31:13 -07:00
Dermot Duffy
e29c0826cf
feat: Add a simple mode to the visual card editor ( #2588 )
2026-07-21 19:13:29 -07:00
Dermot Duffy
b6e1de5999
feat: Modernize the visual card editor. ( #2586 )
2026-07-20 20:44:16 -07:00
Dermot Duffy
e204ec183f
fix: Correct status bar alignment in Safari ( #2581 )
...
- Closes #2578
2026-07-15 14:28:47 -07:00
Dermot Duffy
c02c692f68
feat: Add experimental rewrite of go2rtc live provider (MSE/WebRTC/MP4/MJPEG) ( #2580 )
...
- Closes #2556
- Closes #2450
**Key intended features:**
- go2rtc compatible
- 100% test coverage to significantly improve ability to test, maintain
and work around browser weirdnesses (e.g. Safari).
- Written from the ground up in the style of the rest of the project.
**To use:**
- Change `live_provider` from `go2rtc` to `go2rtc-experimental`.
2026-07-14 14:22:41 -07:00
Dermot Duffy
5662e48c22
test: Add regression test for media info stability ( #2571 )
...
- Relates to: #2563
2026-07-08 11:24:18 -07:00
Dermot Duffy
fb1bbc739e
feat: Automatically recover from frozen live streams ( #2569 )
...
- Closes : #2099
2026-07-07 21:37:24 -07:00
Dermot Duffy
9f956fe89f
fix: Match state trigger/condition semantics to HA ( #2565 )
...
* Closes #2530
2026-07-04 10:23:51 -07:00
Dermot Duffy
3494706225
fix: Use auto_unmute as input to stream selection for HA ( #2562 )
...
- Closes #2479
2026-07-03 08:19:11 -07:00
Dermot Duffy
6a6d65d5c5
fix: Highlight folder icon for correct folder / media ( #2560 )
...
- Closes : #2128
- Closes : #2129
2026-07-02 10:26:30 -07:00
dermotduffy
3bb5ccd14f
chore: Add missing close keyword: close #2529 ( #2427 )
2026-06-30 21:40:44 -07:00
dermotduffy
8ebb88cde9
chore: Add missing close keyword: close #2438 ( #2468 )
2026-06-30 21:40:44 -07:00
dermotduffy
3a78a8d3e9
chore: Add missing close keyword: close #2525 ( #2553 )
2026-06-30 21:40:43 -07:00
Dermot Duffy
937ba647a7
fix: Fix audio for cameras with mixed WebRTC/HLS capabilities ( #2557 )
...
- Closes #2479
2026-06-30 17:45:13 -07:00
Dermot Duffy
5c97e55a56
fix: Honor configured home preset / merge presets. ( #2553 )
...
- Closes:
https://github.com/dermotduffy/advanced-camera-card/issues/2525
2026-06-30 17:45:13 -07:00
Dermot Duffy
d833edb65b
perf: lazy-load js-yaml (~107KB) as needed ( #2551 )
...
- Closes : #2532
2026-06-30 17:45:13 -07:00
Dermot Duffy
3fe5e4004a
fix: prevent infinite re-render loop from issue retry callbacks ( #2550 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
c3d3dd3934
chore: Update ha-nunjucks to 1.6.2 ( #2549 )
...
- Replaces:
https://github.com/dermotduffy/advanced-camera-card/pull/2515
2026-06-30 17:45:13 -07:00
dependabot[bot]
015fb1876d
chore(deps): bump release-drafter/release-drafter from 7.4.0 to 7.5.1 ( #2547 )
...
Bumps
[release-drafter/release-drafter](https://github.com/release-drafter/release-drafter )
from 7.4.0 to 7.5.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-drafter/release-drafter/releases ">release-drafter/release-drafter's
releases</a>.</em></p>
<blockquote>
<h2>v7.5.1</h2>
<h1>What's Changed</h1>
<h2>Bug Fixes</h2>
<ul>
<li>fix: use PR changed files as the source of truth for path filtering
(<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1640 ">#1640</a>)
<a href="https://github.com/cchanche "><code>@cchanche</code></a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-drafter/release-drafter/compare/v7.5.0...v7.5.1 ">https://github.com/release-drafter/release-drafter/compare/v7.5.0...v7.5.1 </a></p>
<h2>v7.5.0</h2>
<h1>What's Changed</h1>
<h2>New</h2>
<ul>
<li>feat: align increments to semver lib from 0.0.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1636 ">#1636</a>)
<a href="https://github.com/cchanche "><code>@cchanche</code></a></li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>fix: require actual matches for category mode <code>only</code> (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1639 ">#1639</a>)
<a href="https://github.com/cchanche "><code>@cchanche</code></a></li>
</ul>
<h2>Dependency Updates</h2>
<ul>
<li>build(deps): bump undici from 6.24.1 to 6.27.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1637 ">#1637</a>)
@<a href="https://github.com/apps/dependabot ">dependabot[bot]</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-drafter/release-drafter/compare/v7.4.0...v7.5.0 ">https://github.com/release-drafter/release-drafter/compare/v7.4.0...v7.5.0 </a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/4d75298e00d9e34c483e5ff8c68d0ea1c1940c1e "><code>4d75298</code></a>
chore: release v7.5.1</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/87be2bf2a7828522f897c087bb709b00e6669aa1 "><code>87be2bf</code></a>
fix: use PR changed files as the source of truth for path filtering (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1640 ">#1640</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/73b95fa1c286dfd6802a4f949b07dad6149f2b0f "><code>73b95fa</code></a>
chore: release v7.5.0</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/46fd41568419e5085b7f73f064d37982152c91dd "><code>46fd415</code></a>
Fix/align increments to semver lib from 0.0.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1636 ">#1636</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/ee0257248ae4c676c2ee86fecb6066e21168acb8 "><code>ee02572</code></a>
chore: upgrade various deps</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/cd9144557b96e626dd10682b6f9167d89cf51e84 "><code>cd91445</code></a>
build(deps): bump undici from 6.24.1 to 6.27.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1637 ">#1637</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/33c969bc903b50ba04f9dd14d0074d2a6b4dfee6 "><code>33c969b</code></a>
fix: require actual matches for category mode <code>only</code> (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1639 ">#1639</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/5d6d314b663c77dcb159adaeba42fa0170ab0ddb "><code>5d6d314</code></a>
ci: support label 'dependencies' for dependabot</li>
<li>See full diff in <a
href="https://github.com/release-drafter/release-drafter/compare/v7.4.0...v7.5.1 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 17:45:13 -07:00
Dermot Duffy
ea251ca988
perf(bundle): lazy-load the nunjucks template engine ( #2535 )
...
Closes #2531 .
## Summary
The full `nunjucks` templating engine (~226KB) plus `ha-nunjucks`
(~46KB) — roughly **272KB, ~13% of the eager entry chunk** — was
statically imported and downloaded by every card on initial load, even
though templates only apply when a config value contains a `{{ … }}` /
`{% … %}` delimiter. Most cards use no templates and never need the
engine.
This defers the engine behind a dynamic `import('ha-nunjucks/dist')` so
it ships in a separate, on-demand chunk instead of the eager
`card-*.js`.
## Approach
The render path (`TemplateRenderer.renderRecursively`) is **kept
synchronous** — it is called from many synchronous hot paths
(condition/trigger evaluators, picture-elements rendering, actions,
folder matchers), and making it async would be a large, high-risk
refactor of the evaluation core.
Instead:
- **New `src/card-controller/templates/engine.ts`** — a module-level
singleton lazy loader (`loadTemplateEngine()` / `getTemplateEngine()`)
shared across all `TemplateRenderer` instances, plus a
`containsTemplate()` delimiter helper.
- **Delimiter gating** — strings without a delimiter never touch the
engine (the overwhelming majority of renders).
- **Pre-warm at config time** — because every template string originates
in the config, a new mandatory `TEMPLATE_ENGINE` initialization aspect
loads the engine before first render whenever the config contains a
delimiter. This **guarantees no raw `{{ … }}` flash**: content/condition
rendering is blocked until the engine is present for template-using
cards. Cards without templates never load it.
## Result
- nunjucks + ha-nunjucks move out of the eager chunk into a separate
chunk fetched only when a card actually uses templates.
- No change to the synchronous public render API; condition/trigger
evaluation core untouched.
## Tests
- New `engine.ts` loader coverage (concurrent load, cached reuse,
not-loaded fallback).
- The 11 existing test files that render real (delimiter-bearing)
templates declare their dependency explicitly via
`beforeAll(loadTemplateEngine)` — no global/implicit setup hook.
- Full suite green (4764 tests), lint and ts-prune clean, per-file 100%
coverage maintained for the affected directories.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
https://claude.ai/code/session_016ykWemdkZrgywvC71pHc6c
---
_Generated by [Claude
Code](https://claude.ai/code/session_016ykWemdkZrgywvC71pHc6c )_
2026-06-30 17:45:13 -07:00
Paul Bottein and dermotduffy
b33c034810
feat: Add card picker suggestion for camera entities ( #2517 )
...
Selecting a camera entity in the dashboard card picker now suggests
Advanced Camera Card under the Community section, so you can add it in
one click without searching for it manually.
Requires Home Assistant 2026.6 or later.
Docs:
https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card#suggesting-your-card-for-an-entity
---------
Co-authored-by: dermotduffy <dermot.duffy@gmail.com >
2026-06-30 17:45:13 -07:00
Dermot Duffy
7dc29865b8
chore: Enforce consistent type imports via @typescript-eslint/consistent-type-imports ( #2545 )
2026-06-30 17:45:13 -07:00
dependabot[bot]
8f4ebcc0de
chore(deps): bump release-drafter/release-drafter from 7.3.1 to 7.4.0 ( #2524 )
...
Bumps
[release-drafter/release-drafter](https://github.com/release-drafter/release-drafter )
from 7.3.1 to 7.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-drafter/release-drafter/releases ">release-drafter/release-drafter's
releases</a>.</em></p>
<blockquote>
<h2>v7.4.0</h2>
<h1>What's Changed</h1>
<h2>New</h2>
<ul>
<li>feat: unify category config around change classification (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1558 ">#1558</a>)
<a href="https://github.com/cchanche "><code>@cchanche</code></a></li>
</ul>
<h2>Maintenance</h2>
<ul>
<li>chore: update generated GraphQL types (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1629 ">#1629</a>)
@<a
href="https://github.com/apps/github-actions ">github-actions[bot]</a></li>
</ul>
<h2>Documentation</h2>
<ul>
<li>docs: document github enterprise server support (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1627 ">#1627</a>)
<a href="https://github.com/cchanche "><code>@cchanche</code></a></li>
</ul>
<h2>Dependency Updates</h2>
<ul>
<li>build(deps-dev): bump vite from 8.0.13 to 8.0.16 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1634 ">#1634</a>)
@<a href="https://github.com/apps/dependabot ">dependabot[bot]</a></li>
<li>build(deps-dev): bump js-yaml from 4.1.1 to 4.2.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1633 ">#1633</a>)
@<a href="https://github.com/apps/dependabot ">dependabot[bot]</a></li>
<li>build(deps-dev): bump shell-quote from 1.8.3 to 1.8.4 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1632 ">#1632</a>)
@<a href="https://github.com/apps/dependabot ">dependabot[bot]</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-drafter/release-drafter/compare/v7.3.1...v7.4.0 ">https://github.com/release-drafter/release-drafter/compare/v7.3.1...v7.4.0 </a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/ed4bc48ec97379be2258e7b7ac2624a3e26ab809 "><code>ed4bc48</code></a>
chore: release v7.4.0</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/0cc23b4878edb4924aae8c9ce2b39766cef66033 "><code>0cc23b4</code></a>
chore: update generated GraphQL types (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1629 ">#1629</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/091a8c83088ce6d694d28ad1024aff1235127ee5 "><code>091a8c8</code></a>
build(deps-dev): bump vite from 8.0.13 to 8.0.16 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1634 ">#1634</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/5e296d69e2244af2f2ddf8a50c4ae8313f5c210b "><code>5e296d6</code></a>
build(deps-dev): bump js-yaml from 4.1.1 to 4.2.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1633 ">#1633</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/86a47c9c8e6620a64feb3a362f3ffd9f6f808f6a "><code>86a47c9</code></a>
build(deps-dev): bump shell-quote from 1.8.3 to 1.8.4 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1632 ">#1632</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/bf75d71215edb5f1fff8c68bcfafc338f5e61056 "><code>bf75d71</code></a>
docs: document github enterprise server support (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1627 ">#1627</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/cff71867e24849ec3c235e40896fe71a8a0895bf "><code>cff7186</code></a>
feat: unify category config around change classification (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1558 ">#1558</a>)</li>
<li>See full diff in <a
href="https://github.com/release-drafter/release-drafter/compare/v7.3.1...v7.4.0 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 17:45:13 -07:00
dependabot[bot]
1761db7b58
chore(deps): bump actions/checkout from 6 to 7 ( #2526 )
...
Bumps [actions/checkout](https://github.com/actions/checkout ) from 6 to
7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/releases ">actions/checkout's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>block checking out fork pr for pull_request_target and workflow_run
by <a href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2454 ">actions/checkout#2454</a></li>
<li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the
minor-actions-dependencies group across 1 directory by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2458 ">actions/checkout#2458</a></li>
<li>Bump flatted from 3.3.1 to 3.4.2 by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2460 ">actions/checkout#2460</a></li>
<li>Bump js-yaml from 4.1.0 to 4.2.0 by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2461 ">actions/checkout#2461</a></li>
<li>Bump <code>@actions/core</code> and
<code>@actions/tool-cache</code> and Remove uuid by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2459 ">actions/checkout#2459</a></li>
<li>upgrade module to esm and update dependencies by <a
href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2463 ">actions/checkout#2463</a></li>
<li>Bump the minor-npm-dependencies group across 1 directory with 3
updates by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2462 ">actions/checkout#2462</a></li>
<li>getting ready for checkout v7 release by <a
href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2464 ">actions/checkout#2464</a></li>
<li>update error wording by <a
href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2467 ">actions/checkout#2467</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2454 ">actions/checkout#2454</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0 ">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0 </a></p>
<h2>v6.0.3</h2>
<h2>What's Changed</h2>
<ul>
<li>Update changelog by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2357 ">actions/checkout#2357</a></li>
<li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a
href="https://github.com/yaananth "><code>@yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2414 ">actions/checkout#2414</a></li>
<li>Fix checkout init for SHA-256 repositories by <a
href="https://github.com/yaananth "><code>@yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2439 ">actions/checkout#2439</a></li>
<li>Update changelog for v6.0.3 by <a
href="https://github.com/yaananth "><code>@yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2446 ">actions/checkout#2446</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/yaananth "><code>@yaananth</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2414 ">actions/checkout#2414</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v6...v6.0.3 ">https://github.com/actions/checkout/compare/v6...v6.0.3 </a></p>
<h2>v6.0.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Add orchestration_id to git user-agent when ACTIONS_ORCHESTRATION_ID
is set by <a
href="https://github.com/TingluoHuang "><code>@TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2355 ">actions/checkout#2355</a></li>
<li>Fix tag handling: preserve annotations and explicit fetch-tags by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2356 ">actions/checkout#2356</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v6.0.1...v6.0.2 ">https://github.com/actions/checkout/compare/v6.0.1...v6.0.2 </a></p>
<h2>v6.0.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Update all references from v5 and v4 to v6 by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2314 ">actions/checkout#2314</a></li>
<li>Add worktree support for persist-credentials includeIf by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2327 ">actions/checkout#2327</a></li>
<li>Clarify v6 README by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2328 ">actions/checkout#2328</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v6...v6.0.1 ">https://github.com/actions/checkout/compare/v6...v6.0.1 </a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/blob/main/CHANGELOG.md ">actions/checkout's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>v7.0.0</h2>
<ul>
<li>Block checking out fork PR for pull_request_target and workflow_run
by <a href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2454 ">actions/checkout#2454</a></li>
<li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the
minor-actions-dependencies group across 1 directory by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2458 ">actions/checkout#2458</a></li>
<li>Bump flatted from 3.3.1 to 3.4.2 by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2460 ">actions/checkout#2460</a></li>
<li>Bump js-yaml from 4.1.0 to 4.2.0 by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2461 ">actions/checkout#2461</a></li>
<li>Bump <code>@actions/core</code> and
<code>@actions/tool-cache</code> and Remove uuid by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2459 ">actions/checkout#2459</a></li>
<li>upgrade module to esm and update dependencies by <a
href="https://github.com/aiqiaoy "><code>@aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2463 ">actions/checkout#2463</a></li>
<li>Bump the minor-npm-dependencies group across 1 directory with 3
updates by <a
href="https://github.com/dependabot "><code>@dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2462 ">actions/checkout#2462</a></li>
</ul>
<h2>v6.0.3</h2>
<ul>
<li>Fix checkout init for SHA-256 repositories by <a
href="https://github.com/yaananth "><code>@yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2439 ">actions/checkout#2439</a></li>
<li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a
href="https://github.com/yaananth "><code>@yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2414 ">actions/checkout#2414</a></li>
</ul>
<h2>v6.0.2</h2>
<ul>
<li>Fix tag handling: preserve annotations and explicit fetch-tags by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2356 ">actions/checkout#2356</a></li>
</ul>
<h2>v6.0.1</h2>
<ul>
<li>Add worktree support for persist-credentials includeIf by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2327 ">actions/checkout#2327</a></li>
</ul>
<h2>v6.0.0</h2>
<ul>
<li>Persist creds to a separate file by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2286 ">actions/checkout#2286</a></li>
<li>Update README to include Node.js 24 support details and requirements
by <a href="https://github.com/salmanmkc "><code>@salmanmkc</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2248 ">actions/checkout#2248</a></li>
</ul>
<h2>v5.0.1</h2>
<ul>
<li>Port v6 cleanup to v5 by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2301 ">actions/checkout#2301</a></li>
</ul>
<h2>v5.0.0</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc "><code>@salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226 ">actions/checkout#2226</a></li>
</ul>
<h2>v4.3.1</h2>
<ul>
<li>Port v6 cleanup to v4 by <a
href="https://github.com/ericsciple "><code>@ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2305 ">actions/checkout#2305</a></li>
</ul>
<h2>v4.3.0</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss "><code>@motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971 ">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail "><code>@mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977 ">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells "><code>@benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043 ">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross "><code>@joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044 ">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89 "><code>@nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194 ">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang "><code>@TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224 ">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc "><code>@salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236 ">actions/checkout#2236</a></li>
</ul>
<h2>v4.2.2</h2>
<ul>
<li><code>url-helper.ts</code> now leverages well-known environment
variables by <a href="https://github.com/jww3 "><code>@jww3</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/1941 ">actions/checkout#1941</a></li>
<li>Expand unit test coverage for <code>isGhes</code> by <a
href="https://github.com/jww3 "><code>@jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1946 ">actions/checkout#1946</a></li>
</ul>
<h2>v4.2.1</h2>
<ul>
<li>Check out other refs/* by commit if provided, fall back to ref by <a
href="https://github.com/orhantoy "><code>@orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1924 ">actions/checkout#1924</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/checkout/commit/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 "><code>9c091bb</code></a>
update error wording (<a
href="https://redirect.github.com/actions/checkout/issues/2467 ">#2467</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/1044a6dea927916f2c38ba5aeffbc0a847b1221a "><code>1044a6d</code></a>
getting ready for checkout v7 release (<a
href="https://redirect.github.com/actions/checkout/issues/2464 ">#2464</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/f0282184c7ce73ab54c7e4ab5a617122602e575f "><code>f028218</code></a>
Bump the minor-npm-dependencies group across 1 directory with 3 updates
(<a
href="https://redirect.github.com/actions/checkout/issues/2462 ">#2462</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/d914b262ffc244530a203ab40decab34c3abf34d "><code>d914b26</code></a>
upgrade module to esm and update dependencies (<a
href="https://redirect.github.com/actions/checkout/issues/2463 ">#2463</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/537c7ef99cef6e5ddb5e7ff5d16d14510503801d "><code>537c7ef</code></a>
Bump <code>@actions/core</code> and <code>@actions/tool-cache</code>
and Remove uuid (<a
href="https://redirect.github.com/actions/checkout/issues/2459 ">#2459</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/130a169078a413d3a5246a393625e8e742f387f6 "><code>130a169</code></a>
Bump js-yaml from 4.1.0 to 4.2.0 (<a
href="https://redirect.github.com/actions/checkout/issues/2461 ">#2461</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/7d09575332117a40b46e5e020664df234cd416f3 "><code>7d09575</code></a>
Bump flatted from 3.3.1 to 3.4.2 (<a
href="https://redirect.github.com/actions/checkout/issues/2460 ">#2460</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/0f9f3aa320cb53abeb534aeb54048075d9697a0e "><code>0f9f3aa</code></a>
Bump actions/publish-immutable-action (<a
href="https://redirect.github.com/actions/checkout/issues/2458 ">#2458</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/f9e715a95fcd1f9253f77dd28f11e88d2d6460c7 "><code>f9e715a</code></a>
block checking out fork pr for pull_request_target and workflow_run (<a
href="https://redirect.github.com/actions/checkout/issues/2454 ">#2454</a>)</li>
<li>See full diff in <a
href="https://github.com/actions/checkout/compare/v6...v7 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 17:45:13 -07:00
Dermot Duffy
a87e5b8eeb
chore: Enforce interfaces for object types ( #2544 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
c8e7fdd808
chore: Add typechecking and pruning to CI ( #2543 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
a96dc2e863
chore: Enforce import order via @ianvs/prettier-plugin-sort-imports ( #2542 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
95f35bd326
refactor: Accept unknown in errorToConsole to drop as Error casts ( #2541 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
fcef48e75a
test: Silence superfluous console output during test runs ( #2540 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
921d45e577
chore: Enforce a few house rules via eslint ( #2539 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
5572ec728e
refactor: Centralize template render type assertion ( #2538 )
2026-06-30 17:45:13 -07:00
Dermot Duffy
a31816c168
feat: Add event-based automation triggers ( #2537 )
2026-06-30 17:45:13 -07:00
Dermot Duffy and Claude Opus 4.8
b701366762
feat: Align automations with Home Assistant triggers and conditions ( #2527 )
...
Split automations into HA-style `triggers`, ongoing `conditions`, and
`actions`, with compatibility migrations for existing Advanced Camera
Card configs.
## Summary
At a glance (details below):
- **Added** `triggers:` -- a required, HA-shaped block: stock `state` /
`numeric_state` / `template` plus card-specific triggers (`camera`,
`view`, `fullscreen`, ...).
- **Added** the HA-native `if` / `then` / `else` action.
- **Removed** `actions_not` (replaced by `if` / `then` / `else`).
- **Removed** the ambient `advanced_camera_card` template namespace (use
`acc` instead).
- **Changed** the trigger template surface to a top-level `trigger.*`
variable (as in HA); the nested `acc.trigger.*` paths are removed.
- **Changed** `conditions:` to ongoing gates only -- they no longer wake
an automation, and change-only forms (`config`, valueless `camera` /
`view` / `state`) become triggers, not conditions.
- **Changed** action templates to render per step, so a later action
sees state an earlier one changed.
- **Compatibility:** HA-shaped YAML is accepted (singular keys,
single-or-list, `and` / `or` / `not` shorthand, `entity` / `entity_id`).
- **Migration:** existing configs upgrade automatically; anything that
cannot be converted faithfully is recorded under `__UPGRADE_FAILURE__`
for manual fixup.
## Breaking Changes
### 1. Automations now require triggers
Before this PR, `automations[].conditions` served two roles:
- They decided whether the automation should run.
- They also acted as the thing that woke the automation up.
After this PR:
- `triggers` wake the automation.
- `conditions` only gate it at the instant a trigger fires.
Most existing automations are migrated automatically from `conditions:`
to `triggers:`.
### 2. `actions_not` is retired
Legacy `actions_not` is replaced by an HA-style `if` action with `then`
/ `else`.
Faithful conversions are automatic. Cases that cannot be faithfully
converted are recorded under `__UPGRADE_FAILURE__.automations` and must
be migrated manually.
### 3. Template surface aligned with Home Assistant
Two related template changes, both auto-migrated:
- **Top-level `trigger.*`.** Automation actions now receive a top-level
`trigger` template variable, like Home Assistant. Legacy nested paths
such as `acc.trigger.state.to` and
`advanced_camera_card.trigger.camera.to` are migrated automatically when
they appear inside template strings.
- **The ambient `advanced_camera_card` template namespace is removed.**
The long-form ambient namespace (`advanced_camera_card.camera`,
`advanced_camera_card.view`, `advanced_camera_card.config`) is retired
in favour of its shorter `acc` alias -- supported since v7.1.0, and the
only spelling the new trigger surface uses. Existing templates are
migrated automatically by rewriting the `advanced_camera_card.` prefix
to `acc.`.
### 4. Trigger-only condition forms are no longer valid conditions
Some legacy "conditions" were really change detectors. These are now
triggers only:
- `condition: config`
- valueless `camera`
- valueless `view`
- valueless `state` / picture-elements state condition with neither
`state` nor `state_not`
These are automatically promoted in automations and stripped from
overrides/elements where they would no longer be meaningful as ongoing
conditions.
### 5. Template truthiness now follows Home Assistant behavior
Template conditions and template triggers intentionally use different
truthiness rules, matching HA:
- A template condition passes only when the rendered value is `true`
(case-insensitive), matching HA's `condition.py`.
- A template trigger uses HA's broader `result_as_boolean` coercion: a
non-zero number, or `1` / `true` / `yes` / `on` / `enable`
(case-insensitive), counts as true.
### 6. Action templates render when each action executes
Action templates are now rendered per action step, not once for the
whole sequence. This means a later action can see card-local state
changed by an earlier action in the same sequence.
The `trigger` context is fixed for the automation run. HA entity state
updates still depend on the frontend receiving updated HASS state over
the websocket.
## Automatic Migrations
### Automation `conditions:` to `triggers:`
Simple legacy automation:
```yaml
# Before
automations:
- conditions:
- condition: fullscreen
fullscreen: true
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
```
```yaml
# After, automatic
automations:
- triggers:
- trigger: fullscreen
fullscreen: true
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
```
State conditions become HA-style state triggers:
```yaml
# Before
automations:
- conditions:
- condition: state
entity_id: binary_sensor.front_door
state: 'on'
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: live
```
```yaml
# After, automatic
automations:
- triggers:
- trigger: state
entity_id: binary_sensor.front_door
to: 'on'
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: live
```
Multiple conditions become both triggers and ongoing conditions:
```yaml
# Before
automations:
- conditions:
- condition: camera
cameras: [front_door]
- condition: fullscreen
fullscreen: true
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
```
```yaml
# After, automatic
automations:
- triggers:
- trigger: camera
cameras: [front_door]
- trigger: fullscreen
fullscreen: true
conditions:
- condition: camera
cameras: [front_door]
- condition: fullscreen
fullscreen: true
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
```
The flattened trigger list is an implicit OR. The retained `conditions:`
list is an implicit AND checked when any trigger fires.
### Trigger-only legacy conditions
Legacy `config` conditions become `config` triggers:
```yaml
# Before
automations:
- conditions:
- condition: config
paths: [menu.style]
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: status_bar
```
```yaml
# After, automatic
automations:
- triggers:
- trigger: config
paths: [menu.style]
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: status_bar
```
Trigger-only leaves are removed from retained `conditions:` blocks
because they no longer describe an ongoing state.
### `actions_not` to `if` / `then` / `else`
```yaml
# Before
automations:
- conditions:
- condition: state
entity_id: input_boolean.camera_alerts
state: 'on'
actions:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: live
actions_not:
- action: none
```
```yaml
# After, automatic
automations:
- triggers:
- trigger: state
entity_id: input_boolean.camera_alerts
actions:
- if:
- condition: state
entity_id: input_boolean.camera_alerts
state: 'on'
then:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: live
else:
- action: none
```
If the legacy automation had no conditions, or only trigger-only
conditions, `actions_not` is dropped because the old `else` branch could
not be reproduced as an ongoing predicate.
### Trigger template paths
```yaml
# Before
message: 'Door is {{ acc.trigger.state.to }} from {{ acc.trigger.state.from }}'
```
```yaml
# After, automatic
message: 'Door is {{ trigger.to_state.state }} from {{ trigger.from_state.state }}'
```
Path rewrites performed automatically:
| Old path | New path |
| -------------------------- | -------------------------- |
| `acc.trigger.state.entity` | `trigger.entity_id` |
| `acc.trigger.state.from` | `trigger.from_state.state` |
| `acc.trigger.state.to` | `trigger.to_state.state` |
| `acc.trigger.camera.from` | `trigger.from_acc.camera` |
| `acc.trigger.camera.to` | `trigger.to_acc.camera` |
| `acc.trigger.view.from` | `trigger.from_acc.view` |
| `acc.trigger.view.to` | `trigger.to_acc.view` |
| `acc.trigger.config.from` | `trigger.from_acc.config` |
| `acc.trigger.config.to` | `trigger.to_acc.config` |
The same rewrites are applied for the older
`advanced_camera_card.trigger.*` namespace.
### Ambient template namespace
Any remaining long-form ambient `advanced_camera_card.*` references
(outside the trigger surface) are rewritten to the `acc.*` alias:
```yaml
# Before
title: 'Now viewing {{ advanced_camera_card.camera }}'
```
```yaml
# After, automatic
title: 'Now viewing {{ acc.camera }}'
```
## Manual Migration Cases
### `__UPGRADE_FAILURE__.automations`
If a legacy automation cannot be converted faithfully, the original
automation is recorded under:
```yaml
__UPGRADE_FAILURE__:
automations:
- ...
```
These entries require manual migration.
The main known case is legacy `actions_not` with a condition whose
trigger can only fire on a rising edge, such as:
- `condition: template`
- `condition: screen`
- `condition: numeric_state` without an entity-backed state to watch
Those conditions can start the `then` branch, but cannot reliably start
the `else` branch when they stop matching.
### Unsupported HA conditions and triggers
This PR aligns the card with HA where supported, but it is not a full HA
automation engine.
Unsupported HA condition families include:
- `time`
- `zone`
- `sun`
- `location`
- `device`
- `condition: trigger`
Unsupported HA trigger platforms include:
- `event`
- `time`
- `time_pattern`
- `sun`
- `zone`
- `calendar`
- `webhook`
- `tag`
- `device`
- `mqtt`
The card-specific camera `triggers:` feature (which auto-selects and
wakes the card on camera events such as motion) is a separate feature
from automation `triggers:`, despite the shared word.
### Trigger IDs and variables
HA keys such as `id`, `alias`, and `variables` are accepted so pasted HA
YAML validates, but they are ignored by the card. There is no
`trigger.id` support in this PR.
## New Compatibility Features
This PR also makes card config more forgiving for HA-style YAML:
- `trigger`, `condition`, and `action` singular keys are accepted and
normalized to `triggers`, `conditions`, and `actions`.
- Single trigger, condition, and action objects are accepted where lists
are expected.
- `if`, `then`, and `else` accept a single item or a list.
- Composite condition shorthand is accepted:
- `{ and: [...] }`
- `{ or: [...] }`
- `{ not: [...] }`
- `{ condition: [...] }` as an implicit AND
- State conditions resolve expected state values that name another
entity, matching HA/Lovelace behavior.
- Both `entity` and `entity_id` are accepted on state and numeric
conditions and triggers (a superset of HA's two dialects), so there is
no forced rename.
- `state_not` remains supported as a card/Lovelace-friendly extension.
## Trigger Payloads
Automation action templates receive a top-level `trigger` object.
For stock `state` and `numeric_state` triggers:
```yaml
trigger.platform
trigger.entity_id
trigger.entity
trigger.from_state
trigger.to_state
```
For template triggers:
```yaml
trigger.platform
```
For card-specific triggers:
```yaml
trigger.platform # "acc"
trigger.type
trigger.from_acc
trigger.to_acc
```
The card does not currently expose HA's `id`, `idx`, `for`, `attribute`,
`above`, `below`, or `alias` trigger fields.
BREAKING CHANGE: Automations now follow Home Assistant's `triggers:` /
`conditions:` / `actions:` model. Automations require a `triggers:`
block and `conditions:` no longer wake an automation; `actions_not` is
removed in favour of an `if` / `then` / `else` action; the nested
`acc.trigger.*` template paths and the ambient `advanced_camera_card`
template namespace are removed (use the top-level `trigger.*` surface
and the `acc` alias); trigger-only condition forms (`config`, valueless
`camera` / `view` / `state`) are no longer valid conditions; and
template-condition vs template-trigger truthiness now follow HA.
Existing configs are upgraded automatically where a faithful conversion
exists; anything that cannot be converted is recorded under
`__UPGRADE_FAILURE__` for manual migration.
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-30 17:45:13 -07:00
Dermot Duffy
209c873c58
docs: Add worked examples for showing a folder as a camera's media ( #2521 )
...
Related: #2498
2026-06-30 17:45:13 -07:00
Dermot Duffy
12ae3b216c
refactor: Restructure condition evaluation into per-type evaluator classes ( #2518 )
2026-06-30 17:45:13 -07:00