## Summary
Removes the automated cleanup tooling for unused localization strings.
The detection script and CI checks remain to identify unused strings,
but removal is now a manual process.
**Deleted:**
- `Tools/remove_unused_strings.py` - Script that removed unused strings
from all `Localizable.strings` files
- `.github/workflows/clean_unused_strings.yml` - Monthly workflow that
created automated cleanup PRs
**Updated:**
- `Tools/README.md` - Removed `remove_unused_strings.py` documentation
- `UNUSED_STRINGS.md` - Removed removal script and workflow
documentation; renamed to focus on detection only
- `.github/workflows/ci.yml` - Updated PR comment to suggest manual
cleanup instead of referencing removed script
The `detect_unused_strings.py` script and CI integration continue to
function unchanged.
## Screenshots
N/A - No user-facing changes
## Link to pull request in Documentation repository
Documentation: home-assistant/companion.home-assistant#
## Any other notes
Detection of unused strings remains automated via CI checks on pull
requests. Only the removal automation has been eliminated.
<!-- START COPILOT CODING AGENT SUFFIX -->
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
> Delete remove_unused_strings.py and workflow
</details>
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
## Summary
Implements automated detection and removal of unused localization
strings. Currently identifies 37 unused L10n properties across the
codebase (onboarding flows, settings, thread credentials, widgets,
etc.).
**Components:**
- **Detection script** (`Tools/detect_unused_strings.py`): Parses
`Strings.swift`, searches all Swift source for L10n property usage and
direct key references, reports unused strings grouped by category
- **Removal script** (`Tools/remove_unused_strings.py`): Deletes unused
keys from all `*.lproj/Localizable.strings` files, regenerates
`Strings.swift` via SwiftGen
- **CI check** (`check-unused-strings` job): Runs on PRs, posts sticky
comment with unused string count and details
- **Automated workflow** (`clean_unused_strings.yml`): Monthly scheduled
run + manual trigger, creates PR with cleanup changes
**Usage:**
```bash
# Detect unused strings
python3 Tools/detect_unused_strings.py
# Remove unused strings and regenerate code
python3 Tools/remove_unused_strings.py
```
## Screenshots
N/A - No UI changes
## Link to pull request in Documentation repository
Documentation: home-assistant/companion.home-assistant#
## Any other notes
The detection algorithm checks three patterns to minimize false
positives:
1. Full L10n path usage (`L10n.About.title`)
2. Leaf property usage (`.title`)
3. Direct Localizable key usage (`"about.title"`)
Modified `.gitignore` to allow Python scripts in Tools directory. All
changes pass yamllint and CodeQL security checks.
<!-- START COPILOT CODING AGENT SUFFIX -->
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
> Tasks: 1 - Create a script that detects L10n (Strings.swift) unused
strings in the codebase 2 - From this list, extract the Localizable
string and double check if they are not used directly in the codebase 3
- If both are true, the script should delete these strings from all
localizable languages and L10n (Strings.swift)
> 4 - Add to the CI workflow a step which checks if that PR has unused
strings, if so, comment on the PR 5 - Create a workflow dedicated to
delete unused strings
</details>
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
## Summary
- Updates Firebase, Realm, Sentry, SwiftFormat, SwiftLint, Eureka, Sodium.
- Updates MaterialDesignIcons to 6.5.95. Fixes#1933.
- Updates Fastlane which now supports App Store Connect API keys for things like dSYM downloading.
## Summary
- Fixes e.g. HACS (which is `hacs:hacs`) icons showing the A/B icon. We now fall back to the outline cog.
- Hide panels without the "show in sidebar" option. We get them in the response, but e.g. the title is incorrect.
- Changes sort order in the automatic version to more closely align with the frontend.
- Fixes a case where chosen panels in the past would fail to be updated due to being at the tail end of the array in the API response, due to truncating to widget size _before_ updating.
## Screenshots

## Summary
- Upgrades the font, config, and adds a migration for renamed/removed icons.
- Migrates the one use of a renamed/removed one: `laptop-mac` -> `laptop`
## Any other notes
This change should also make it a little easier to do the migrations, since the Realm+Initialization part won't need to be touched, probably.
Adds new fastlane lanes:
- `fastlane lint` which checks the linters
- `fastlane autocorrect` which applies the linters which can autocorrect (Rubocop, SwiftFormat)
Adds a build step to the Codegen abstract target which runs SwiftFormat in lint mode, pointing out what it's going to change when run.
Applies SwiftFormat to nearly all code -- exempts a few externally-sourced files and generated code.
## Summary
First time bumping since moving to straight SwiftGen. Very easy. The next one will likely be hard as 6.x has migrations.
## Any other notes
This includes a new icon, `webcam-off`. Once core has it, it would be nice to switch the camera sensors to use it.
```
$ bundle exec pod outdated
MaterialDesignIcons up to date at version 5.8.55
Updating spec repo `trunk`
No pod updates are available.
```
First time I've seen this in this project. 😆
Also Add check for MDI release on GitHub during its execution for more informative logs.
Fixes#1244 and fixes#1139.
## Summary
Updates MaterialDesignIcons from 5.5.55 to 5.8.55. Between these two versions, there are no changes that require renaming any existing database entries.
## Screenshots
n/a
## Link to pull request in Documentation repository
n/a
## Any other notes
- Converts from using Iconic and a fork of SwiftGen to generate the MaterialDesignIcons.swift file to using SwiftGen and its JSON parsing. This hopefully gives us a much easier path to updating in the future, since it can be done by changing the shell script and nothing else.
- Updates the generated `MaterialDesignIcons` to be class-based rather than enum-based; moving to a `RawRepresentable` enum (which would reduce the size, see #1139) proved to be far too long to compile. This version is still about 1/3 the code size.
- Cleans up some of the icon selecting to (1) not generate icons too often, and (2) not go in and out of the non-String representation.
- Combines all .entitlements into either: App-iOS, App-catalyst, WatchApp, Extension-iOS or Extension-catalyst.
- Cleans up and renames all the schemes to match target names
- Moves around several folders and deletes some old files.
- Converts Podfile to be hierarchical, rather than calling shared methods.
- Always runs MaterialDesignIcons script; aborts early if it's up-to-date.
- Updates all dependencies.
- Updates the source font file to the latest version.
- Pulls in the migration/deleted naming from the frontend repo, applies as a migration to Actions and Watch Complications, the two places we store the icons by name.
- Manually executes Iconic. Once again with Robbie's fork of SwiftGen, the invocation looks like:
```bash
Vendor/SwiftGen/.build/x86_64-apple-macosx/debug/swiftgen run fonts --templatePath ./Source/stencil.stencil path/to/MaterialDesignIcons.ttf --param publicAccess=true >path/to/MaterialDesignIcons.swift
```
Fixes#877.
Updating to the tippy-top of MDI produces unloadable icons. Needs more investigation.
This partially reverts commit 7efb95eb6aefde7fc2f60de2482f17296820952e.
Refs #667.