Changed
- Per-row action dropdown in the Optimize / Restore wizard. The old
Apply/Skip checkbox is now a dropdown so you can choose what happens to each
app: Disable / Uninstall / Skip (Enable / Skip in Restore mode). It
defaults to the catalog's recommended action — so you can downgrade an
Uninstall to a safer Disable, or skip individual rows, without giving up the
recommendation. The do-not-disable safety list still gates every action.
Changed
- Snapshot apply now shows a clear preview table instead of a text dump.
Applying a snapshot (from the global Snapshots page) opens a panel listing
each package and what will happen — Disable / Set as launcher / Set setting,
with already-disabled and not-installed rows clearly de-emphasized — mirroring
the Optimize wizard. Apply happens from the reviewed panel. - In the Optimize wizard, terminal rows (not installed / already in target
state) now read as a neutral pill, visually distinct from a user-chosen
"Skip".
Fixed
- "Play Store" buttons only show for apps that are actually on the Play
Store. Every catalog package was audited against Google Play; the button
now appears only for the 33 packages with a real listing. System components
and defunct apps (Print Spooler, Google Feedback, Funimation, Stadia, Quibi,
Nvidia system packages, region/Fire-TV-only ids, …) no longer show a button
that leads to a 404. - Optimize wizard defaults are no longer dangerously aggressive. The wizard
pre-selected an action for every installed app, so streaming apps (Netflix,
Prime Video, Hulu, …) and anything not on the curated default list defaulted
to Disable/Uninstall. It now respects each app's default the way v1 does:
only default-optimize entries are pre-selected for action; everything else
defaults to Skip (you can still pick Disable/Uninstall per row from the
dropdown). Restore mode mirrors this with default_restore. - App descriptions are back in the App List. Each app shows its inline help
text ("Print service — irrelevant on a TV", etc.) under the name again,
instead of only as a hover tooltip. - System keyboards added to the do-not-disable list. Gboard, the Leanback
keyboard, and the AOSP IME can no longer be disabled (from the memory table,
a snapshot, or anywhere) — disabling the active keyboard removes all
on-screen text input. - Accurate success reporting for device actions. Apply-snapshot,
disable/restore-stock-launchers, and Emergency Recovery judged success by
scanning only stdout — butadb shellexits 0 even when the on-device
command fails, andpm/settingswrite failures to stderr on many builds.
They now inspect both streams, so a package or setting that didn't actually
change is reported as failed instead of silently "done." - Apply-snapshot no longer claims settings were written when they weren't.
Settings are now applied one at a time and each is checked, so the summary
reflects what actually took (previously every key was reported written as
long as the shell ran). - Hardened package-name and snapshot-value handling. Package names from
manual-entry paths are validated before they reach the shell, and snapshot
setting values are rejected if they contain shell metacharacters (matching
the existing Tweaks guard). - Minor: the launcher-set error message no longer gets overwritten by benign
empty output, and per-device state is fully reset if the device view ever
switches devices without unmounting.
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.