github bryanroscoe/shield_optimizer v2-2.3.0
ATV Optimizer v2-2.3.0

one hour ago

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), the ShieldOptimizer
    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.app until you reinstall from this release's DMG — after
    that you can drag the old Shield Optimizer.app to the Trash.
  • Linux: the AppImage / .deb / .rpm filenames now start with
    ATV.Optimizer instead of Shield.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 its IP: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 adb in 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 the android.software.leanback feature, 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-holders naming 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 under logs/ (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 in launchers.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: reads secure.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 root LICENSE file. 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
  • Windows (SmartScreen): "More info" → "Run anyway".
  • Linux: chmod +x ATV.Optimizer*.AppImage before running.

See the v2 README for setup and feature docs.

Don't miss a new shield_optimizer release

NewReleases is sending notifications on new releases.