You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
File viewer — hover "View" button or double-click any file in the File Explorer tree to open a glass modal with syntax-highlighted content (JSON, XML, HTML, CSS, JS, YAML, shell scripts). Ctrl+A / Cmd+A inside the viewer selects only the content for easy copying. Close via X button, click outside, or Escape key.
adb_read_file Rust backend command — reads any device file via adb exec-out su -c cat with plain cat fallback.
Screenshot preview modal — capture device screen via adb exec-out screencap -p | base64 and render inline in a glass modal. Save/Save As buttons with native file dialog. New Rust commands: adb_screencap_base64, write_base64_file.
Logcat highlight rules — per-tab panel with text match / regex / color picker input. Rules persist to localStorage per tab (logcat_hl_<tabId>). Matching lines get a semi-transparent background highlight while preserving the log level foreground color. Toggle panel via Highlight button in toolbar.
Package actions — Launch, Force Stop (am force-stop), Clear Data (pm clear), and Clear Cache (su rm -rf cache/*) buttons on each package row. Clear Data and Uninstall have glass confirmation dialogs.
Fixed
Slow logcat tab switching — flushOutput() now checks offsetParent before reading scroll properties. Hidden tabs (display: none) skip forced layout on thousands of off-screen lines.
Highlight panel input white background — added -webkit-appearance: none, background, border, color, outline, and :focus state to highlight panel text inputs — matches toolbar input styling cross-platform.
File viewer close button not working — replaced inline onclick="closeViewer()" (inaccessible from module scope) with proper addEventListener — module-scoped functions can't be called from attribute-based event handlers.
Proxy verify ran curl on device — adb_verify_proxy was running adb shell curl which fails on most Android devices. Changed to run curl on the host machine (detected at launch) against the proxy. Works on all platforms.
Splash screen freeze on hanging binaries — check_launch_components version checks ran --version with no timeout. A hanging binary (e.g. pipx frida circular symlink) blocked splash forever. All checks now use run_with_timeout_bytes with a 5-second timeout — timeout returns no version instead of blocking.
Frida pipx circular symlink hang — pipx creates a bash wrapper that symlinks back to itself, causing frida --version to hang. Permanent fix: standalone Python script at ~/.local/bin/frida imports from the pipx venv directly.
Logcat stream dying on binary log lines — the reader used BufReader::lines(), which aborts the whole stream on the first invalid UTF-8 byte, firing logcat-ended and stopping the tab a few seconds after Start. Now reads raw bytes via read_until(b'\n') with lossy UTF-8 decoding — invalid bytes become U+FFFD and streaming continues. Batching and line content are byte-identical for valid input.
Package uninstall failing on Windows with DELETE_FAILED_INTERNAL_ERROR — adb_uninstall_package now falls back to adb shell pm uninstall --user 0 <pkg> when the legacy adb uninstall fails. Newer Android rejects plain all-user uninstalls for device-admin packages, and older adb clients don't support adb uninstall --user — routing through the device's pm makes the fallback work regardless of the host adb version. The legacy attempt stays first, so behavior is unchanged where uninstall already worked.
Package Launch not working on Windows — the Launch button relied on adb shell commands. An earlier attempt fed every device command through adb shell's standard input (echo "<cmd>" | adb shell), but on Windows that transport orphans each command's final whitespace token onto a separate shell line — monkey's event count arrived as its own line (** Error: Count not specified, then sh: <stdin>[2]: 1: inaccessible or not found), and the same orphaning silently broke cmd package resolve-activity ... <pkg> and am start ... -p <pkg>, which is why Launch always bottomed out at monkey. The fix: every device command is now passed to adb shell as a single argument (adb shell "<cmd>") — the exact delivery the app's adb_shell command already uses for Force Stop / Clear Data / Clear Cache, proven on Windows. adb forwards the one string to the device shell, which tokenizes it itself, so no trailing token is ever orphaned. Also: when an app is already running, am start -n prints Warning: Activity not started — now treated as SUCCESS (the intent reached the app), keeping Launch off the monkey fallback. The LAUNCHER-intent fallback (am start -a MAIN -c LAUNCHER -p <pkg>) covers devices where resolve-activity returns nothing, and monkey -p <pkg> 1 runs only as a last resort for genuine failures. Works on Windows, macOS, and Linux regardless of adb client version.
Changed
Frida sidebar icon — changed from F to R to avoid conflict with Files tab. Both had "F" as their single-character icon.