Renamed to ATV Optimizer
- The desktop app is now called ATV Optimizer — same app, new name and a new
lime TV icon that matches the mobile companion. Nothing under the hood moved:
the application identifier (com.shieldoptimizer.app), theShieldOptimizer
data folder holding your snapshots and downloaded platform-tools, and the
auto-update channel are all unchanged, so this arrives as an ordinary update
and your saved devices and snapshots are exactly where they were. - Windows upgrades in place: the installer's upgrade code is pinned to the
one the old name derived, so the MSI replaces the existing install rather than
asking you to uninstall first. - macOS: Homebrew users get the renamed bundle on the next
brew upgrade --cask shield-optimizer(the tap and cask names are unchanged).
If you installed from the.dmg, the app you already have keeps the filename
Shield Optimizer.appuntil you reinstall from this release's DMG — after
that you can drag the oldShield Optimizer.appto the Trash. - Linux: the AppImage /
.deb/.rpmfilenames now start with
ATV.Optimizerinstead ofShield.Optimizer.
Fixed
- Forget didn't work the first time on a Wireless debugging device. adb often holds one
phone or TV under two connections (its mDNS name and itsIP:port), and Forget dropped
only the one the row showed, so the row stayed. Forget now drops every connection with
the same verified hardware id (never matched by address). If the device is still
advertising Wireless debugging, adb reconnects it within seconds; the app now says so,
shows it coming back, and explains how to stop that (turn off Wireless debugging, or
remove this computer under Paired devices on the device). - After Pair PIN, the device didn't appear until the pairing dialog was cancelled.
After a successful pair the app now asks you to close the pairing dialog, then watches
mDNS for up to 45 seconds for the device's advertised connect port and connects to it
by itself. It never guesses a port and never reuses the pairing port. When the device
connects, the pairing panel closes and the new row is scrolled to, briefly outlined, and
given an Open button (or Open anyway with a note for a device that isn't a TV).
Cancel, or 45 seconds without an advertisement, falls back to the connect box, already
filled in with the device's address. - Pair and connect errors were raw adb text. A mistyped IP showed "protocol fault
(couldn't read status message): Undefined error: 0". Unreachable addresses, a wrong PIN
and a closed or expired pairing dialog now get a plain sentence about what to check,
with adb's own words under Details. The pairing box also warns, without blocking,
when the address isn't on this computer's network ("typo?"). - Buttons on a "not an Android TV" row sat above the row's centre line. Open anyway,
Copy diagnostics and Forget now line up with the rest of the row. - Help text told people to run
adbin a terminal. The app bundles its own adb, and a
different one restarts the shared adb server and drops every connected device. The
"no authorization prompt" steps now say to wake the TV, use Forget and Add by IP, and
only then Revoke (which un-trusts every computer). The Wireless debugging "Forget this
computer" step is offered only for Wireless debugging connections. The pairing and
Devices copy no longer implies every Android 11+ device needs pairing. - A real Android TV was refused as "Not an Android TV"
(#120). 2.2.0 decided
from one property (ro.build.characteristics) and treated its absence as proof. The
app now also asks for theandroid.software.leanbackfeature, and only calls a device
"not a TV" when it positively says it is a phone, tablet, watch, car or emulator.
Anything in between opens normally with an "Unconfirmed TV" tag. - A device that positively said it is not a TV had no way in at all
(#120). It now offers
Open anyway behind a short confirm; the choice is remembered by hardware id
(never by address), so a re-recognized device opens directly next time and keeps a
muted NOT A TV tag. - A successful pairing dead-ended at a Connect IP field that wanted different
information (#88).
After Pair PIN succeeds, the connect box is now pre-filled with the paired host and
a trailing colon and takes focus, with a one-line prompt for the separate port from
the TV's Wireless debugging screen. - Setting a launcher as default could report failure and roll the stock launcher
back even though the switch had actually worked
(#122; onn 4K Pro).
Verification now polls for about 5 seconds with backoff instead of ~1.6s, treats
cmd role get-role-holdersnaming the target as confirmation on its own, and keeps
polling through a transient HOME holder (Google TV's Setup Wraith) instead of
treating it as a mismatch. The stock launcher is only re-enabled when it positively
still holds HOME once the window ends — never just because the resolver hasn't
caught up yet. - Dead-end "Update available" badge after every release
(#119). The GitHub-API
check no longer drives a clickable badge; only the in-app updater does. While a
release is propagating the header says "rolling out" and nothing more. - Optimize showed "Safety unavailable" on apps that were already disabled. The tab
never asked for their verdict. Every installed row is checked now, so a disabled
Live Channels Provider reads Caution, as it does on the App List. - Shell's Run button ignored the acknowledgement tick. The tick was re-read from
storage after every inventory load and, for a TV with no readable hardware id, never
stored at all. It is resolved once per device and holds for the visit; it is
remembered across visits only by hardware id, never by address, and a disabled Run
now says why on hover. - Icons sat below their labels in every button and heading. One global rule fixes
all of them, and a new test measures every icon-bearing control on every screen. - The Launcher tab listed ordinary TV apps as Home apps. PBS Kids, YouTube, Plex and
the Play Store all read "HOME APP", because every TV app's launch activity carries the
leanback category. Only apps that actually declare a Home screen are listed now. - A fresh snapshot always proposed a launcher change. The launcher only counts as a
change when it differs from the TV's current Home, and restoring skips the launcher
switch entirely otherwise. The preview's "Now" column shows the value already on the
TV instead of "—". - Health and the App List disagreed about the same app. Health downgraded a reviewed
app to Unknown; both now read the one verdict. - Optimize offered Uninstall on apps the Play Store can't give back. Those rows offer
Disable only. Sideloads such as SmartTube and TizenTube still offer Uninstall, and the
confirmation names where to reinstall them from and suggests backing up the APK. - "Select all safe" armed Caution and Unknown rows. It now arms only rows rated
Safe to remove. - Forget sat above the chevron on device rows, and fifteen other rows mixed buttons
and icons off one centre line. The alignment test now also checks that sibling
controls in a row share a centre line. - Play-installed Amazon and Google apps were filed as system apps under Everything
else. Only packages missing from the third-party list count as system now. - A file dropped on Files was also staged by Install APK, which stays mounted while
hidden. Each tab ignores drops unless it is the one showing.
Added
- Report a bug (the bug icon in the header): a diagnostics bundle you can copy or
paste into a GitHub issue, with app/OS/adb versions, the selected TV's properties
and TV evidence, its Home handlers, and the tail of the app log. Nothing is sent
automatically. A Debug logging switch raises the log level for adb calls; logs
live in the app data folder underlogs/(Open logs folder is in the same dialog). - Copy diagnostics on any device row the app cannot confirm or open.
- Monet Launcher (#121)
in the Launcher tab. The launcher catalog now lives inlaunchers.json, each custom
launcher has a Source site link to its developer's page, and the tab links to the
issue tracker for the next request. - Forget on every network device row, not only unreachable ones.
- Set another app as Home… under Launcher › Advanced: pick any installed app and
the app asks Android to make it Home, then reports honestly whether Android accepted
it. It never disables the stock launcher. That is a separate Disable stock
launcher button, enabled only once something else is Home, with a confirmation and
an offer to save a snapshot first. The TV always keeps at least one Home screen. - Open Play Store on TV for a missing launcher shows a success callout and refreshes
the list every few seconds for a minute, until the app appears. - Files drag and drop: drop files on the listing to upload them into the folder on
screen. Folders are refused with a message. - GitHub issue forms for bug reports, device support and launcher requests. Report a
bug opens the bug form and fills in the diagnostics field when the bundle fits in the
link; otherwise the dialog asks you to paste it. - Names and one-line descriptions for many more packages under Everything else. These
are descriptions only; the verdict stays Unknown. - A Screensaver tweak (#123)
on the Tweaks tab: readssecure.screensaver_components, offers AOSP's Basic
Daydream (present on every Android TV build), and can restore whatever was
configured when the tab loaded — without needing to know a vendor screensaver's
component name. Google TV's Ambient Mode is now in the app catalog too.
Changed
- The license is now all rights reserved
(#124). The package
manifests declared MIT, which contradicted the intent; they now say UNLICENSED
(npm) / LicenseRef-Proprietary (Cargo), backed by a rootLICENSEfile. Vendored
third-party code keeps its own license. - Health: Swap is a headline figure like CPU and Temperature, CPU has a meter, and
Temperature is coloured by tier with a plain-words tooltip on each. - App List and Optimize rows: the disclosure chevron sits at the left and the whole row
toggles the detail. Optimize's per-row action is a radio group with the plan's choice
labelled, and the header walks through review-then-run. - Every hover hint is instant and short; the long explanations moved into the detail
panels. - Remote: Paste sits inside the typing box; the explanation is one sentence.
- Install APK: the rail is "Popularly requested sideloads" with a link to suggest more.
- Catalog descriptions for 52 entries now say what the component does and what
disabling changes, instead of naming it. - One safety and recommendation vocabulary across the App List, Optimize and Health:
Protected, Caution, Safe to remove (was "Safe"), Unknown. Recommendations read
Uninstall only when the app can be reinstalled from the store, Disable
otherwise, and never "Remove". Apps worth removing only if unused read "Review:
disable if unused" or "Review: uninstall if unused". - Health › Top memory users: the Safety column is now Suggestion, showing the same
recommendation as the App List. Clicking a row opens that app on the App List. - Optimize: a labelled Mode: Optimize | Restore toggle, Run plan, a
"Recommended" pill on the suggested action, and review rows tinted amber with their
own pill. - Snapshots are marked Beta. "Preview apply" is now Preview restore, the preview
explains in one line what a restore does and doesn't do, and "Package states" is
"Disabled apps".
First-run warnings
These builds are unsigned. Your OS may complain on first launch:
- macOS (Gatekeeper): the first-launch dialog on macOS 15+ only offers "Move to Trash" or "Done" — click Done, then either:
- Terminal:
xattr -dr com.apple.quarantine "/Applications/ATV Optimizer.app"(one-time, then double-click as normal) - GUI: System Settings → Privacy & Security → scroll to the "ATV Optimizer was blocked" message → Open Anyway → enter password
- Terminal:
- Windows (SmartScreen): "More info" → "Run anyway".
- Linux:
chmod +x ATV.Optimizer*.AppImagebefore running.
See the v2 README for setup and feature docs.