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
adbbinary 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
- Terminal:
- Windows (SmartScreen): "More info" → "Run anyway".
- Linux:
chmod +x ShieldOptimizer*.AppImagebefore running.
See the v2 README for setup and feature docs.