github bryanroscoe/shield_optimizer v2-2.2.0
Shield Optimizer v2-2.2.0

12 hours ago

Five reported bugs reach users for the first time, plus a Playback tab, an
expert shell, and a companion-app overhaul. Three of those fixes were written
without the reporter's hardware in hand — if you filed one of them, please say
whether this build works for you.

Playback

  • A new Playback tab reports what the TV says it can do: which video
    decoders it advertises, which display modes and HDR formats it lists, and
    what its audio passthrough settings are set to. It reads configuration, and
    it says so — an entry here is not proof that a codec is registered at
    runtime, hardware-accelerated, or good enough to play a given file.
  • Tweaks gained an Audio Passthrough control — Auto / Never / Always /
    Manual, with the per-format allow-list when Manual is selected. A format code
    the app doesn't have a name for is kept rather than quietly dropped from the
    device's list, one change is written at a time, and every row is re-read from
    the device afterwards, so what you see is what the TV reports, not what was
    asked for.
  • The Health tab now samples CPU load and per-interface network throughput.
    Rates are computed from the device's own clock over the sampling window, so
    a slow round-trip doesn't inflate them. The companion app samples on demand
    rather than polling; reads stay Free and writes need Pro.

Expert shell

  • A Shell tab for everything the curated screens don't cover, off until you
    turn it on and acknowledge what it is. Output and runtime are bounded (256 KiB
    per stream, 30 seconds), a non-zero exit and whatever output arrived first are
    both kept, and presets and bookmarks only fill the editor — nothing runs until
    you press Run.
  • It refuses the obvious ways to break a TV from a pasted command, but that
    check is an anti-footgun, not a guarantee: a shell expression can get around
    it. This is the one place in the app where the do-not-disable list is not
    enforced, and it says so on screen. The companion app does not have it.

Snapshots

  • A setting that was never set is now restored as never set. Snapshots used
    to record "unset" and "empty" the same way, so restoring one could not put a
    setting back to the device's own default. New snapshots record the difference
    and the preview shows what will be reset. Snapshots taken by earlier versions
    behave exactly as they did before — an omission in an old file still means
    "leave it alone", never "delete it".

Devices and pairing

  • Android 11+ devices are now discoverable. Scan Network used to sweep your
    subnet on port 5555 and nothing else. Modern wireless debugging listens on a
    random port that changes every time you toggle it, so newer TVs were
    invisible no matter what you did. The scan now also reads the mDNS services
    ADB has discovered, which is where the real port is published (#88).
  • A TV that is advertising only its pairing service is now reported as waiting
    to be paired, with its pairing address filled in for you, instead of being
    counted as a failed connection.
  • Pairing asks for the separate Connect IP:port from the Wireless debugging
    screen rather than guessing port 5555, the PIN is cleared after each attempt,
    and a successful pairing is no longer reported as a failure when the connect
    step fails (#88).
  • Connect IP accepts an mDNS service name and an IPv6 endpoint, so you can
    paste back what the scan showed you.
  • One TV is one row. ADB connects a paired device it finds over mDNS by
    itself, so scanning could attach the same device a second time by address and
    list it twice. The scan now skips anything ADB already holds, and the list
    collapses any duplicates it still finds — matching on the device's hardware
    id, never on its address.
  • Devices that report they are not an Android TV (a phone, say) are labelled as
    such and no longer open the TV tools. A device that hasn't reported anything
    yet is left alone — unreadable means unknown, not "not a TV".
  • A device connected over the network is no longer told to look for an
    "Allow USB debugging?" dialog.
  • For the record: there is no minimum or maximum Android version anywhere in
    this app, and there never was.

Launchers

  • Setting a default launcher now registers the new launcher before disabling
    anything.
    On Android 8 the commands this app used to discover a launcher's
    Home activity do not exist, so nothing was ever registered — and the first
    thing that actually happened was disabling the stock launcher, which then had
    no one to hand Home to. That is why the switch failed and rolled back (#87).
  • A failed switch offers Copy diagnostic details: every command that ran and
    what your TV replied. If a launcher switch still fails, that text is what
    makes it fixable.
  • Each failure names the stage it failed at, and the rollback says what it
    actually verified rather than claiming more than it knows.

macOS

  • The app no longer leaves a process holding the volume it was launched
    from.
    ADB's background daemon outlives the app and inherited the app's
    working directory, so launching from the DMG left something pinning
    /Volumes/... after you closed the window — which is what kept macOS asking
    for removable-volume access every few seconds (#89).
  • Locating the adb binary now resolves once instead of on every device
    refresh, and the app explains why it is asking for removable-volume access
    when it asks.
  • The Sideload tab remembers your APK folder and reads it only when you click
    Scan saved folder.

Backups

  • SmartTube backup search covers Documents/SmartTubeBackup, where current
    releases actually save (#86). SmartTube Beta is included too.
  • A search that could not run — because the TV stopped answering — now says so,
    instead of reporting "No matches, export from the app first" and sending you
    to redo an export that already worked.

Remote

  • You can paste into the Remote box now (#91). Use ⌘V / Ctrl+V with the
    typing area focused, or the new Paste button. The whole clipboard goes over
    in one shot rather than a character at a time, and line breaks arrive as
    Enter — which makes a long URL or password bearable.

Updates

  • See what an update changes before it installs. Update now opens the
    release notes with Install / Not now, instead of taking your word for it from
    a version number alone. The version in the header opens the full release
    history.
  • And after one lands. If the app updated itself while you weren't looking
    — or you upgraded through Homebrew — the first launch on the new version
    shows what you just got. Once, not every time, and never on a fresh install.

Device information

  • Diagnostics on the companion app gained an About this TV card: Android
    version and API level, manufacturer, model, codename, chipset, build ID,
    hardware ID, and total RAM and storage. The Android version also appears
    beside the TV name on the dashboard.
  • The desktop Profile now shows the hardware ID, so both apps report the same
    facts.
  • Fixed a long-standing bug in the device profile read: the results were parsed
    by position, and a TV that answered one query with nothing (or with an error)
    shifted every later value by one — so a device could report its model as its
    Android version. Each value is now read independently.

Health

  • Fixed: Top Memory Users never finished checking. Every row sat on
    "Checking" forever. Nothing threw and nothing logged — the verdicts were
    computed and then thrown away.
  • RAM and storage show a usage bar, not just a number, and network rates line
    up in columns when a device reports several interfaces.
  • The memory table says once, above it, that these are process names and the
    app behind each is unconfirmed — instead of repeating it on every row in
    column headings nobody could parse.

Safety

  • Every verdict now says where it came from. A bare "Unknown" was doing two
    jobs — "we rated this risky" and "we have never seen this package" — which
    read the same and mean very different things. There are now four verdicts:
    Protected (refused on every path), Caution (a known consequence,
    stated), Safe (in the reviewed catalog and rated safe to remove), and
    Unknown (no record). Click a verdict to see the reason and which list it
    came from.
  • Apps missing from the audited catalog are labeled Unknown with a reason
    instead of Safe. Unknown apps are never pre-selected for disable or uninstall;
    you choose them explicitly and the confirmation says so.
  • The App List and the Optimize wizard show the verdict alone, with the full
    reason behind a click. Spelling every reason out inline turned each row into a
    five-line block and cut the list from five apps on screen to three.
  • A failed inventory read no longer shows an app as Enabled.
  • The last enabled launcher is protected on every disable path, not just the
    launcher screen.

Mobile companion (beta)

  • Saved TVs are recognized by verified hardware identity, never by IP address
    alone; TVs that share an address stay separate.
  • Unknown-safety labels, an unknown-app diagnostics log, a system-app filter,
    full installed-app backup scope, and a guided Optional apps review where Keep
    is the default.
  • Scan results are ordered deterministically and lead with TVs this phone has
    not used. An address that answers on a different port is reported as such
    rather than as offline.

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/Shield Optimizer.app" (one-time, then double-click as normal)
    • GUI: System Settings → Privacy & Security → scroll to the "Shield Optimizer was blocked" message → Open Anyway → enter password
  • Windows (SmartScreen): "More info" → "Run anyway".
  • Linux: chmod +x ShieldOptimizer*.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.