Thor

com.valhalla.thor
by Zapstore _@zapstore.dev

Republished from GitHub / F-Droid by the Zapstore main account.

**Thor App Manager** is a modern, open-source Android app manager and installer, built for power users and enthusiasts who demand full control, privacy, and speed — without the bloat. Thor is built 100% in Kotlin with Material 3 design and Jetpack Compose. It delivers a complete, privileged app management suite at around 2 MB Play Store download size — with zero ads, zero trackers, and zero internet required. **Privilege Modes — Root, Shizuku & Dhizuku:** - Works with Root (su), Shizuku, or Dhizuku Device Owner - Manually select your preferred privilege engine (Root / Shizuku / Dhizuku) - Automatic fallback chain if the preferred mode is unavailable **App Management:** - Install, uninstall, freeze (disable/enable), and reinstall apps - Suspend and unsuspend apps with a custom Thor-branded system dialog - Restrict app background activity - Force-stop apps and clear app data or cache - Uninstall and freeze/unfreeze system apps - Fix Store — reassign installer record to Google Play in any privilege mode - Share APK files directly - Launch app activities **Batch Operations:** - Batch freeze / unfreeze, reinstall, uninstall, kill, suspend, and clear data - Real-time terminal logger dialog during batch actions **App List & Insights:** - High-performance app list with Room DB metadata caching - Live search by app name or package name - Sort and filter apps, including by installation source - Split APK indicator for multi-APK apps - App state badge: frozen, suspended, and hidden states - Installer source, version code, target SDK, and debuggable flag **Customization & Accessibility:** - Dark, Light, and System themes + true AMOLED black mode - Material You dynamic color support (Android 12+) - Asgardian static color scheme (default) - Biometric / fingerprint lock for app access - Multi-language support: English, Spanish, French, Arabic, Chinese - In-app language switcher — no system settings required **Privacy & Performance:** - 100% offline — no internet permission - No analytics, no crash reporters, no trackers - Fully reproducible, copylefted libre software (GPLv3.0) - ~2 MB Play Store download; <4 MB installed APK **Upcoming Features:** - App data backup and restoration - Advanced packages.xml editing - Batch APK install - And more **Technical Highlights:** - 100% Kotlin codebase with Clean Architecture + MVVM - Custom in-house hidden API bypass module (no third-party dependency) - Uses a modularized, fully Kotlin-converted fork of [libsu](https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Ftopjohnwu%2Flibsu&sa=D&sntz=1&usg=AOvVaw2n8KQ-xmlg4eH3_h-_2j8s) as _suCore_ for root operations **Credits:** - Portions of this app use code from [libsu](https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Ftopjohnwu%2Flibsu&sa=D&sntz=1&usg=AOvVaw2n8KQ-xmlg4eH3_h-_2j8s) by topjohnwu, adapted as the [suCore](https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Ftrinadhthatakula%2FThor%2Ftree%2Fmaster%2FsuCore&sa=D&sntz=1&usg=AOvVaw0xH0Qz2vT4oR082yAQxxNI) module. - libsu was fully converted from Java to Kotlin and modularized for Thor. **License:** - Thor App Manager is licensed under the GNU General Public License v3.0 (GPL-3.0). - libsu is licensed under the Apache License 2.0. All modifications comply with Apache-2.0 requirements. No analytics, no trackers, no nonsense. Thor is free and open source — forever.

First release: Dec 29, 2025, 19 total releases.

Most recent release: Sep 15, 2026.

Repo

Appears in 0 app stacks.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Sep 15, 2026 1.96.1
    # Thor v1.96.1 Release Notes **A bug-fix and transition update on the way to the full customization release.** Version **1.96.1 (1961)** improves Dhizuku operations, Freezer profile management and the first pieces of multi-app action customization. **1.97.0 (1970)** is planned as the next major update bringing the full set of customizations. Changes since [v1.96.0](https://github.com/trinadhthatakula/Thor/releases/tag/v1.96.0), the latest published release tag, through `4bcaeb41`, plus this release's preparation.
    More…
    ## ✨ Highlights - ❄️ **Dhizuku freezing keeps the app and its data.** Freeze and unfreeze now use Android's device-owner hide/unhide operations, and Thor recognizes hidden apps as frozen. - 📦 **More reliable Dhizuku actions.** Installation, removal, data clearing and suspension use the operations Android supports for a device owner. Unsupported controls explain their limits. - 🗂️ **Add a selection to existing Freezer profiles.** See which profiles contain an app and choose how to recover frozen apps when removing their last membership. - 🎛️ **Arrange multi-app actions your way.** Reorder or hide actions separately for App list and Freezer. These are the first pieces of the broader customization update planned for 1.97.0. - 💛 **Optional ways to support Thor after a successful action.** App-management features remain free. ## What's Changed ### ❄️ Dhizuku freeze, unfreeze and hidden-app recovery [PR #483](https://github.com/trinadhthatakula/Thor/pull/483) (`e04e8c77`, `aab7c93f`): - Dhizuku freezes apps with device-owner hiding and unfreezes them by unhiding, preserving the installed APK and app data. Thor no longer treats device-owner access as shell-level authority. - Hidden apps appear as frozen in app metadata and Freezer state, so they remain available for recovery rather than disappearing from Thor's view. - Root and Shizuku recovery also account for apps hidden by another mode, while keeping legacy recovery for system apps removed for the current user by older Thor versions. - Freeze failures use localized, actionable messages. ### 📦 Supported device-owner operations and safer install completion [PR #484](https://github.com/trinadhthatakula/Thor/pull/484) (`92b6f127`, `d5b272d3`): - Dhizuku uses device-owner operations for clearing app data, suspension, runtime permission changes, app removal and APK installation, and reports their actual results. - Ordinary APK replacement remains supported. Fix Store and Auto Reinstall's Play attribution require Root or Shizuku; force-stop and cache clearing are unavailable through Dhizuku. - Installation controls reflect mode capabilities. Install-time permission grants and the low-target-SDK override remain available only on supported Root/Shizuku paths. - An install already submitted to Android is no longer reported as a submission failure merely because closing its session fails afterward. ### 🗂️ Profile assignment, live membership and recovery choices [PR #487](https://github.com/trinadhthatakula/Thor/pull/487) (`aac7bd60`, `d747b558`, `cecf0592`): - **Add to profiles** assigns selected apps from App list or Freezer to existing profiles, with an option to also add them to the Freezer list. Assignment itself does not freeze the apps. - App Info shows live profile memberships. Membership is managed through the profile editor. - Removing a frozen app's last profile membership, when it is not in the Freezer list, offers an explicit recovery choice: leave it frozen or unfreeze it. Changes from elsewhere remain reflected while the sheet is open. - The combined unfreeze action covers the Freezer list and profiles; recovery failures are reported without duplicate error messages. ### 🎛️ Multi-app action customization [PR #488](https://github.com/trinadhthatakula/Thor/pull/488) (`8e76ce3c`): - Settings → Customization now has separate layouts for App list and Freezer multi-app actions. - Reorder actions, hide those you do not use, or restore defaults. Each toolbar keeps its own saved preferences, and Close remains available. - Action availability still depends on the selected apps and privilege mode. Saved layouts preserve chosen order and incorporate newly introduced actions. ### 💛 Optional support after successful operations [PR #485](https://github.com/trinadhthatakula/Thor/pull/485) (`c74b0eff`, `c4b08213`, `d3b25b36`, `cd15b850`): - Successful operations can offer a **Support Thor** shortcut through completion feedback. - Invitations respect supporter eligibility, and the automatic introduction is shown only once. FOSS users, and Store users whose billing service is unavailable, can choose **I already support Thor** to hide invitations on that device. - Confirmed Freezer additions get clearer success feedback, and completion sheets use consistent support buttons. Support remains optional in both distributions. ## 🔧 Project: release metadata, documentation and maintenance - [PR #486](https://github.com/trinadhthatakula/Thor/pull/486) (`17953b04`) synchronized the Shizu Store listing with production 1.96.0. Its `/releases/latest/` download continues to follow the latest production APK, so the live manifest is synchronized to 1.96.1 after production promotion. - This release prepares the complete multiline Play/F-Droid changelog for every Fastlane locale, with blank lines preserved between bullets. The same source supplies Shizu's production sync. Dev uploads now use the same complete-file, all-locale copy as production; empty curated notes and copy failures stop publication. New checks reject truncated English changelogs, preserve contributed translations and verify multiline Shizu JSON round trips. - [PR #478](https://github.com/trinadhthatakula/Thor/pull/478) updates `@types/node` to 26.5.1 (`950c7d11`); [PR #479](https://github.com/trinadhthatakula/Thor/pull/479) updates KSP to 2.3.12 (`98f5c0fa`). - Repository documentation now describes Dhizuku's supported operations and support entry points more accurately. Added tests cover operation results, profile membership/recovery, action preferences and support invitations. - Release-note retention remains at 20 versions. The oldest directory, `v1.91.1`, is retired; historical Fastlane changelogs are retained. ## 🧪 Validation scope - `./gradlew test lintFossDebug lintStoreRelease` passed with Zulu JDK 21: **5,936 tests** across both flavors, with no failures, errors or skips. Lint reported no errors, warnings, `MissingTranslation` or `SyntheticAccessor` findings. - All **12 release-script test suites** passed after retention pruning, including 35 existing release-routing tests and 8 new Fastfile changelog tests. Changed shell scripts pass ShellCheck 0.11.0; Ruby syntax checks pass. A first-line-only fixture was correctly rejected. - Play notes use **444/500 characters**; the assembled Telegram caption uses **808/1024 UTF-16 units** with the conservative wrapper allowance. Both Fastlane locale files match the complete source. The Shizu production manifest passes its checks, and isolated 1.96.1 sync plus the pinned Fastlane Supply parser preserve every bullet and blank line. The merged changes include automated coverage and targeted emulator/device reports. This release preparation does not establish complete Android-version, OEM, work-profile or privilege-mode coverage. In particular, cross-mode recovery and device-owner behavior still depend on the device's capabilities. Release-preparation checks are recorded separately from live-device acceptance. ## 🛠 Commits Log Complete non-merge history in chronological order: **15 commits** from `v1.96.0..4bcaeb41`. - `950c7d11` chore(deps-dev): bump @types/node in /web in the web group - `98f5c0fa` chore(deps): bump com.google.devtools.ksp in the maven group - `e04e8c77` fix: use device-owner hiding for Dhizuku freeze - `aab7c93f` fix: localize Dhizuku freeze failures - `92b6f127` fix: use device-owner APIs for Dhizuku actions - `c74b0eff` feat: add optional support actions after successful operations - `c4b08213` docs: show support invitation entry points - `d5b272d3` fix(installer): preserve submission after session cleanup failure - `d3b25b36` fix(support): announce confirmed freezer additions and polish labels - `cd15b850` style(support): outline completion sheet support buttons - `17953b04` fix(shizu): sync changelog to production 1.96.0 - `aac7bd60` feat: assign selected apps to existing freezer profiles - `d747b558` feat: clarify profile membership and add recovery choices - `8e76ce3c` feat: customize App list and Freezer multi-app actions - `cecf0592` fix: keep profile membership live and report recovery errors once
  • Sep 13, 2026 1.96.0
    # Thor v1.96.0 Release Notes This cumulative update brings together **v1.95.0 (1950)**, **v1.95.1**, **v1.95.2**, **v1.95.4**, and all subsequent merged work through `f7bb0001`. It includes the backup, customization, Freezer, and localization work already collected in the v1.95.0 notes, alongside component control, the Guardians Queue, safer installation, and the new font presets. The earlier notes remain available for [v1.95.0](https://github.com/trinadhthatakula/Thor/blob/f7bb0001/release-notes/v1.95.0/github.md), [v1.95.1](https://github.com/trinadhthatakula/Thor/blob/f7bb0001/release-notes/v1.95.1/github.md),
    More…
    [v1.95.2](https://github.com/trinadhthatakula/Thor/blob/f7bb0001/release-notes/v1.95.2/github.md), and [v1.95.4](https://github.com/trinadhthatakula/Thor/blob/f7bb0001/release-notes/v1.95.4/github.md). The descriptions below reflect the final implementation, including changes that supersede those earlier releases. ## ✨ Highlights - ⏳ **Guardians Queue** — follow background backups, restores, exports, prepared sharing, and supported bulk actions; reopen progress, logs, and retained results. - 💾 **Encrypted backups and the Backup & Restore Hub** — find, create, inspect, share, and restore archives. Private app-data backup requires root; Shizuku can back up APKs and shared storage. - 🧩 **Per-component control** — open activities, stop services, and manage individual components, with privilege-aware controls and a record of changes Thor can restore. - 🎨 **Make Thor your own** — reorder or hide App Info actions, use app-icon shortcuts, and choose **Asgard** or **System** fonts throughout the app and external installer. - ❄️ **Safer Freezer and bulk actions** — explicit tracking consent, background Suspend/Unsuspend, clearer progress, guarded watchlist writes, and sequential Android uninstall confirmations. - 📦 **More reliable installation** — repaired privileged installer paths, XAPK/OBB support, consent for eligible older-target APKs, and opt-in runtime-permission grants. - 🔍 **Better app visibility and readable settings** — fresh-install/OEM recovery, privilege refresh, adaptive settings, CSV export, and eight app languages. **Backup compatibility:** app-data backups made by **v1.95.2 or earlier** use the older schema-1 `.thorbak` format and **cannot be restored in v1.96.0**. Make fresh backups after updating while the original app data is still available. Existing archives are not automatically converted. Keep your backup passphrase: it cannot be recovered. Ordinary APK/APKS/XAPK installation is unaffected by this archive-format change. ## What's Changed ### 💾 Encrypted backups and the Backup & Restore Hub — [#379](https://github.com/trinadhthatakula/Thor/pull/379), [#381](https://github.com/trinadhthatakula/Thor/pull/381), [#385](https://github.com/trinadhthatakula/Thor/pull/385), [#389](https://github.com/trinadhthatakula/Thor/pull/389), [#412](https://github.com/trinadhthatakula/Thor/pull/412), [#413](https://github.com/trinadhthatakula/Thor/pull/413) - The Home **Backup & Restore Hub** scans `Downloads/Thor`, MediaStore, and the configured SAF directory for `.thorbak`, `.xapk`, `.apks`, and `.apk` files without requiring root to browse. Search and filter archives, inspect their metadata, share them, or delete them with confirmation. - Start a backup from the Hub's app picker. Opening a `.thorbak` through **Install from file** or a supported external file-manager intent routes to the restore sheet. - Offline `.thorbak` backups use AES-256-GCM encryption, a per-archive salt, and PBKDF2WithHmacSHA256 passphrase derivation. Optional passphrase caching is protected by AndroidKeyStore. - Root backups can include private credential-encrypted and device-encrypted data, APKs, and shared storage. Non-root Shizuku cannot read private app data; its scope and size estimate cover the APK bundle and accessible shared storage. Staging checks the volume that will actually hold the data. - Backup/restore and single-app export now use the foreground-service data queue described below; the WorkManager execution descriptions in the earlier cumulative notes are historical. Carried-forward implementation: `940480ef`, `299fc471`, `fa093e69`, `ab96071d`, `db3d78c7`, `37c4df9b`, `7361f0e4`. ### 🛡️ Authenticated restores and archive safety — [#420](https://github.com/trinadhthatakula/Thor/pull/420), [#453](https://github.com/trinadhthatakula/Thor/pull/453), [#461](https://github.com/trinadhthatakula/Thor/pull/461) - Schema-v2 archives authenticate the manifest and member bytes, binding encrypted data to its expected class and member/chunk identity. Unauthenticated restores are refused. - Staged APK sets are checked for the expected package, version, exact signer, and install-set consistency before installation. Automatic rollback is limited to a still-matching newly installed copy that Thor recorded; unknown or changed identities are not automatically deleted. - Cancellation cleans up staged copies, and orphan cleanup covers both internal and external cache staging roots. Reads from untrusted archives are bounded. - Backup Hub icons avoid copying an entire `.thorbak` just to draw its row. Other staged icon reads are capped, decoding is sampled, and misses are cached. Refused archive deletions show an error. Implementation: `d5d4c1e0`, `5406c046`, `a86409aa`, `4896c5b2`, `66bc3a32`, `e3b99cd5`, `26fe6af0`, `ce2b9fa0`, `13d50cc7`, `7969ea37`, `385b9bf5`. ### ⏳ Guardians Queue and background work — [#453](https://github.com/trinadhthatakula/Thor/pull/453), [#461](https://github.com/trinadhthatakula/Thor/pull/461), [#465](https://github.com/trinadhthatakula/Thor/pull/465) Accepted work is recorded in Room before a foreground service is awakened. Data operations and privilege sweeps have separate queues, each processing its work serially. Supported paths include archive backup/restore, single-app export, bulk-share preparation, freeze/unfreeze, per-app cache clearing, eligible Fix Store/reinstall operations, and bulk suspend/unsuspend. - **Running**, **Queued**, and **Recent** sections show tasks and their selected privilege mode. The Root/Shizuku/Dhizuku identity names the mode selected for that task; it does not assert that the provider is currently available. - Reopen localized logs, per-app outcomes, counters, cancellation state, and recovery explanations. **Run in background**, Back, and dismissing progress leave accepted work running. Cancellation is explicit and shows **Stopping** while the request is being stopped. - Task details preserve the originating screen behind a dialog. Status, app counts, and queue type wrap separately. Recent results from both queues are ordered by newest completion first; pending work retains FIFO ordering. - Service-start failures, interrupted work, and uncertain outcomes stay visible. Durable task identities prevent stale callbacks from claiming another request's progress or result. This is bounded task history. Request persistence does not guarantee completion after every reboot, force-stop, lost authorization, or provider failure. Single-app quick sharing and multi-app Backup/export remain direct paths outside this queue migration. Implementation: `6462fe90`, `77b93451`, `72fa4cf7`, `0fc62497`, `81e7e73f`, `baac6038`, `cc67ad66`, `45bf8b24`, `225fce86`, `9ed5a4d8`, `a629b0ae`. ### 📤 XAPK/OBB, export recovery, and prepared sharing — [#376](https://github.com/trinadhthatakula/Thor/pull/376), [#378](https://github.com/trinadhthatakula/Thor/pull/378), [#389](https://github.com/trinadhthatakula/Thor/pull/389), [#453](https://github.com/trinadhthatakula/Thor/pull/453), [#461](https://github.com/trinadhthatakula/Thor/pull/461) - Install and export XAPK game/split bundles with OBB detection and staging for expansion assets. - Single-app exports report background progress. Recovery reconciles recorded MediaStore/SAF output identities before publishing again; cancellation and cleanup belong to the owning task. - Bulk sharing prepares private files in the data queue. Reopening **Share** checks task ownership, expiry, readability, size, and provider URIs before granting read-only access. Prepared files are available for 24 hours with best-effort expiry cleanup. Automatic format selection uses APK for monolithic apps and APKS for split apps. - Reopening Export after completion resets stale **Exported** presentation; reopening during an active export reconnects to that task without submitting a duplicate. Provider-specific power-loss durability and duplicate-free recovery are not guaranteed. Implementation: `91100e58`, `0fd72541`, `193d893e`, `8c49785f`, `b75964fc`, `8efa11a7`, `ba9f8281`, `fd8b97c9`, `1f6e8a7a`. ### 🧩 Per-component control — [#435](https://github.com/trinadhthatakula/Thor/pull/435), [#436](https://github.com/trinadhthatakula/Thor/pull/436), [#439](https://github.com/trinadhthatakula/Thor/pull/439), [#440](https://github.com/trinadhthatakula/Thor/pull/440), [#442](https://github.com/trinadhthatakula/Thor/pull/442) **App Info → Components** supports Open/Force open, Stop now for services, Disable/Enable/Reset to default, copying class names, and badges such as **Restricted by Thor**, **Changed elsewhere**, **Not exported**, and **Off by default**. Disabling asks for consent for the current session. Ordinary exported, unguarded activities can open without privilege. Component changes and forced launches require effective uid 0: **Root or Shizuku started as root**. Shell-mode Shizuku and Dhizuku show why those controls are unavailable. Commands quote component names safely, and service/launch verdicts account for output and transport failures instead of trusting an exit code alone. Thor records components it disabled. **Restore all** spans apps for the **current Android user** and restores recorded defaults, including components that originally shipped disabled. Only components recorded by Thor are included. Partial failures remain retryable and report how many entries were restored. This ledger does not reapply restrictions at boot. Implementation: `3104018e`, `cf19a134`, `e7090e42`, `6ed95a38`, `73c81259`, `6517660d`. ### 🎨 App Info actions, icon gestures, and fonts — [#410](https://github.com/trinadhthatakula/Thor/pull/410), [#418](https://github.com/trinadhthatakula/Thor/pull/418), [#420](https://github.com/trinadhthatakula/Thor/pull/420), [#421](https://github.com/trinadhthatakula/Thor/pull/421), [#473](https://github.com/trinadhthatakula/Thor/pull/473) - Reorder App Info quick actions by dragging, hide actions you do not use, and reset to defaults. The preview stays above the scrolling list. Drag ownership, accessibility, and preference resync handling are hardened. - Tap an app icon in App Info to open the app; long-press for its system settings. These use the existing actions, including their thaw behavior for frozen/suspended apps. - **Settings → Customization → Fonts** offers **Asgard** and **System** presets, applies the choice immediately, and saves it for the next launch. Asgard remains the default, using Outfit and Fira Code; System uses the device's UI font. Logs and package identifiers remain monospaced. - The external installer follows the same saved font choice and shows accessible loading feedback while preferences are being read. Both presets preserve text sizes/weights and respect system text scaling. Implementation: `75a78988`, `bfa67935`, `43630a15`, `60f341df`, `679c19fa`, `683b9b9f`, `12f215ce`, `6b4e562a`, `ec5e010f`. ### ❄️ Freezer profiles, tracking consent, and reliable bookkeeping — [#370](https://github.com/trinadhthatakula/Thor/pull/370), [#415](https://github.com/trinadhthatakula/Thor/pull/415), [#437](https://github.com/trinadhthatakula/Thor/pull/437), [#438](https://github.com/trinadhthatakula/Thor/pull/438), [#465](https://github.com/trinadhthatakula/Thor/pull/465) - Labels distinguish **Unfreeze & Remove** in Freezer from **Remove from Watchlist** in Apps. Uninstalled packages are pruned from tracking; profile saves are transactional, and profile members support group kill/suspend actions. - Bulk Freeze asks for confirmation with **Add to Freezer** checked. Unchecking freezes without adding membership. The choice survives rotation and travels with the queued request; only successfully frozen targets gain membership. Existing memberships and profile associations are preserved. Cancel submits nothing. - Bulk Suspend/Unsuspend run in the background with distinct Queue/notification labels and suspension readback. Room schema 10 stores the tracking choice, with an opt-out default for older tasks. - Failed watchlist or shortcut writes are reported instead of crashing the process. When the privileged action succeeded but bookkeeping failed, the UI explains both outcomes. Launcher shortcuts are disabled before membership is removed so failures remain retryable. Implementation: `0b142916`, `800b41e3`, `d937b229`, `e0ed3f76`, `b8acbf0a`, `9ed5a4d8`, `a629b0ae`. ### 📦 Installer consent, uninstall prompts, and Fix Store — [#434](https://github.com/trinadhthatakula/Thor/pull/434), [#446](https://github.com/trinadhthatakula/Thor/pull/446), [#451](https://github.com/trinadhthatakula/Thor/pull/451), [#464](https://github.com/trinadhthatakula/Thor/pull/464), [#466](https://github.com/trinadhthatakula/Thor/pull/466), [#469](https://github.com/trinadhthatakula/Thor/pull/469) - Shizuku/Dhizuku installation uses working streaming sessions and correctly wrapped session transports, addressing the unintended fallback to Android's confirmation dialog. Dhizuku uses its own installer transport. - Eligible **Root/Shizuku** installs can override Android's low-target-SDK block after explicit consent. **Allow legacy APK installs without asking** is off by default. One-time consent does not enable it, and stale callbacks, new selections, or unreadable preferences do not authorize another install. - This override covers low-target blocking only. It does not bypass signature, ABI, split-set, downgrade, or OEM restrictions, and does not promise an old app will run. Normal, Dhizuku, external, and background restore/reinstall paths do not inherit this interactive consent. - Runtime-permission grants are opt-in, separately from legacy APK consent, and the per-install choice resets for each newly parsed package. Shizuku/Dhizuku broker authorization still comes from the broker; it is excluded from Thor's self-grant path. - When privileged batch uninstall fails, Android asks for confirmation per app. Cancelling one dialog advances to the next app; **Stop** leaves the remaining apps untouched. - **Fix Store requires Root or Shizuku.** Home, individual-app, and batch requests share capability routing and wait for privilege initialization. Normal/Dhizuku requests explain that no apps were changed, and Dhizuku rejects the unsupported operation below the UI as well. Implementation: `0bd1369e`, `9e8611d2`, `4fc55d3f`, `5c0f63ff`, `446c7fbb`, `634da1ba`, `bd2d8c8a`, `f3da333d`, `ae74c03e`, `c2965493`. ### 🔍 App visibility, privilege detection, and CSV export — [#371](https://github.com/trinadhthatakula/Thor/pull/371), [#417](https://github.com/trinadhthatakula/Thor/pull/417), [#419](https://github.com/trinadhthatakula/Thor/pull/419), [#420](https://github.com/trinadhthatakula/Thor/pull/420) - Fresh installs and affected Chinese OEM ROMs recover app lists that previously showed only Thor, using fallback package queries and synchronized visibility/AppOps grants. OEM AppOps work proceeds even when the vendor permission's `pm grant` call fails; revoking closes the AppOp too. - Known privilege managers are detected by package name. Shizuku and Dhizuku have in-app grant requests; Shizuku listeners pick up grants dynamically, while **Refresh** re-probes Root and Dhizuku and invalidates stale non-root shell state. - Root acquisition compatibility improves for KernelSU/APatch. App List sort/filter touch conflicts are corrected, and sort/filter/search changes return the list or grid to the top. - Export the full or filtered/searched app list as CSV, with RFC 4180 escaping and protection against spreadsheet formula injection. Implementation: `cdbe0d3e`, `1d2bf9c6`, `1f70dfb8`, `b6044de4`, `560ba578`, `e2d71218`, `ce4048d6`, `8020e7f7`, `1489c9b4`, `f31f52f9`. ### 🌍 Settings, languages, and readable feedback — [#369](https://github.com/trinadhthatakula/Thor/pull/369), [#383](https://github.com/trinadhthatakula/Thor/pull/383), [#395](https://github.com/trinadhthatakula/Thor/pull/395), [#397](https://github.com/trinadhthatakula/Thor/pull/397), [#398](https://github.com/trinadhthatakula/Thor/pull/398), [#400](https://github.com/trinadhthatakula/Thor/pull/400), [#420](https://github.com/trinadhthatakula/Thor/pull/420), [#434](https://github.com/trinadhthatakula/Thor/pull/434), [#438](https://github.com/trinadhthatakula/Thor/pull/438), [#439](https://github.com/trinadhthatakula/Thor/pull/439), [#464](https://github.com/trinadhthatakula/Thor/pull/464) - Settings are categorized with adaptive multi-pane navigation. Freezer switches, legacy-install options, and biometric-lock explanations wrap at large text sizes without clipping their meaning. Biometric copy explains the existing launch lock, screenshot/recording protection, and hidden Recents preview. - Eight app languages: English, Arabic, Spanish, French, Polish, European Portuguese, Brazilian Portuguese, and Simplified Chinese. Translation coverage and proofreading include the Backup Hub, component controls, queue actions, and new settings. The language picker scrolls on short screens. - Backup dates follow the in-app language. Preference writes are guarded against storage failures. Opening Permissions from App Info dismisses the old sheet instead of making navigation flicker. - Nested error text resolves into readable messages, and action-success toasts use localized action names instead of obfuscated class names. Implementation: `e210768f`, `994853b0`, `1d2d692f`, `a7b6da8d`, `7829c618`, `db45cb6c`, `583198af`, `ba581061`, `feaa6bd0`, `dae9f613`, `ab029f94`. ## 🧰 Project: execution, stores, website, and build - **Coordinated root execution** — interactive, archive, and sweep lanes coordinate mutations per package. Dedicated archive/sweep shells can fall back to serialized MainShell execution with degraded operation recorded. Cancellation and timeout are distinguished, cancelled interactive commands are drained before reuse, and root probes are serialized. The sweep shell requests the global mount namespace for cache access; this is distinct from interactive root acquisition ([#453](https://github.com/trinadhthatakula/Thor/pull/453), [#461](https://github.com/trinadhthatakula/Thor/pull/461); `db8184f7`, `2c1330a8`, `3d7f9c63`, `41830645`, `591c96ec`, `37831981`). - **Tests, migrations, and documentation** — component-ledger and task-schema migrations; ownership, cancellation, publication, recovery, Queue layout, and localization coverage; component/worker design and acceptance records. Community follow-ups distinguish implemented work from product decisions and remaining device checks. - **SyntheticAccessor enforcement** — the earlier app cleanup and corrected reports are followed by removal of remaining avoidable accessors and an explicit lint-error gate ([#441](https://github.com/trinadhthatakula/Thor/pull/441), [#443](https://github.com/trinadhthatakula/Thor/pull/443), [#474](https://github.com/trinadhthatakula/Thor/pull/474); `de4119e3`, `dfd1a8b0`, `6748bb8f`). - **Shizu Store and web** — live-schema/profile corrections, the production changelog sync, translated listings, downloads/landing-page work, IndexNow, SEO/robots/LLM documentation, and web-layer convergence from master to dev ([#422](https://github.com/trinadhthatakula/Thor/pull/422), [#428](https://github.com/trinadhthatakula/Thor/pull/428), [#433](https://github.com/trinadhthatakula/Thor/pull/433), [#463](https://github.com/trinadhthatakula/Thor/pull/463)). - **Runtime compatibility and build maintenance** — Kotlin 2.4.20, Room 2.8.5, Compose BOM 2026.09.00, Navigation 3 1.1.7, and Koin compiler plugin 1.2.1. Asgard 2.0.1 is paired with Material 3 1.5.0-alpha28, superseding the earlier alpha26 compatibility pin. Kotlin compiler heap is 4 GiB after release-build exhaustion; stdlib ordering/hex helpers and explicit installer event storage simplify internals ([#468](https://github.com/trinadhthatakula/Thor/pull/468); `df4fff56`, `825408ee`, `e5b61192`, `a691b773`). - **Dependency and release tooling upkeep** — Gradle wrapper, Android libraries, Fastlane/Ruby, web packages, CodeQL, and setup-java updates across the cycle. The latest grouped updates include Fastlane 2.239.0, MDX 8.0.1, Vitest 5.0.0, CodeQL 4.38.0, and setup-java 6.0.1 ([#470](https://github.com/trinadhthatakula/Thor/pull/470), [#471](https://github.com/trinadhthatakula/Thor/pull/471), [#472](https://github.com/trinadhthatakula/Thor/pull/472)). The commit log includes the earlier grouped dependency, workflow, and security maintenance as well. - **Release cleanup** — update AGP from 9.5.0-alpha04 to **9.5.0-alpha05** and ignore the local `.omo` directory ([#475](https://github.com/trinadhthatakula/Thor/pull/475)). - **Release bookkeeping** — version code **1960** derives to **1.96.0**. Code 1953 was consumed by the Play special-use foreground-service access submission, so there is no separate 1.95.3 notes set to consolidate. Play/F-Droid notes cover every Fastlane locale. The oldest retained notes, v1.90.4, are retired to keep 20 release directories; historical Fastlane changelogs remain. The Shizu listing continues to describe the latest production APK and is synchronized after production promotion, as required by the release guide. ## 🧪 Verification and remaining acceptance Release-preparation host gates passed on **Zulu JDK 21** with **AGP 9.5.0-alpha05**, using one worker and no parallel task execution: ```sh ./gradlew test lintFossDebug lintStoreRelease --no-parallel --max-workers=1 --continue ``` - FOSS Debug and Store Debug each passed **2,798 tests**, with **zero failures, errors, or skips**. - Both app lint reports contain **zero errors or warnings**, no `MissingTranslation` or `SyntheticAccessor` findings, and nine Hint findings each. Explicit `:bypass:lintDebug` and `:bypass:lintRelease` checks also passed with **zero issues**. - FOSS debug APK assembly is verified separately from the test/lint invocation. - Release budgets pass: Play **442/500 characters**, Telegram **971/1024 assembled UTF-16 units**. The English Fastlane copy matches the source byte-for-byte, and the Hindi changelog is **443 characters**. Every configured store locale has notes for code 1960. - The release-script suite passed both before and after retention pruning (**10 test files, zero failures**). The production-pinned Shizu manifest check, commit/PR references, and whitespace checks pass. Twenty release directories remain, with no references to the retired v1.90.4 directory outside historical notes. Historical test counts remain in their original release notes. Device/emulator evidence is recorded separately from host tests: the service-queue acceptance record still marks **T19 deferred and T22 incomplete**. Earlier maintainer reports cover some physical-device Root installs, settings, and basic bulk-action/Queue behavior, but do not establish the full device/ROM/privilege matrix. Archive/provider edge cases, legacy-install OEM/mode coverage, and relevant Store-policy checks remain documented follow-ups. The emulator profiling added in `22949711` has no matched pre-update baseline, so it does not establish a performance improvement from the dependency upgrade. Font previews come from JVM UI tests and do not establish how every OEM system font renders. ## 🛠 Commits Log Complete non-merge history after the 1950 release: **237 commits**, in chronological order, from `v1.95.0-dev-40..f7bb0001`. The v1.95.0 notes already include the v1.94.x development cycle; those carried-forward features and their implementation hashes appear above. This log also includes tests, documentation, release preparation, and intermediate changes that were revised before merge; the final behavior is described in the themed sections. In particular, the intermediate legacy Fix Store fallback was removed by `c2965493`, and earlier WorkManager stages were superseded by the supported foreground-service queues. - `496fa740` docs(web): stop telling users Dhizuku destroys system-app data - `56294b15` docs(web): name the user argument in the fallback command - `5e4618f4` docs(web): the API 37 refusal is uid-0-only, not shell-only - `560f9617` feat(web): sync web landing page, downloads hero, themes, SEO & GEO to master for production deployment - `b5ddd4c4` fix(deps): resolve Dependabot security alerts for nanoid and ruby json - `d086c11a` feat(web): sync web layer, enhance llms.txt and robots.txt - `ab4198c7` feat(web): add IndexNow protocol support and automated submission - `ca6f6c42` fix(web): add 10s timeout to IndexNow and verify staged deployment directory - `1d2bf9c6` fix(apps): restore package visibility and app list fetching on fresh installs - `b6044de4` fix(permissions): synchronize SelfPermissionGranter and privilege events with AppRepository rescans - `1f70dfb8` fix(permissions): grant Chinese OEM AppOps and fallback package flags on visibility collapse - `e2d71218` fix(privileges): invalidate non-root Odin shell cache on refresh and add in-app Dhizuku grant support - `ff6851a6` feat(privilege): add PrivilegeManagerApp registry and dynamically show installed managers - `560ba578` fix(privileges): add in-app Shizuku grant request and remove FLAG_MOUNT_MASTER to fix KernelSU/APatch root acquisition - `ccd2aba3` fix(home): reactively trigger data reload and scan bump on privilege state changes - `01323101` fix(activity): re-probe privileges on activity onResume to auto-acquire root grants - `1489c9b4` fix(app-list): resolve sort and filter touch conflicts in bottom sheet - `f31f52f9` fix(app-list): scroll list and grid to top on sort, filter, or search change - `b83fb664` fix(review): address CodeRabbit review feedback on gateways, cache sync, privilege registry, and freezer scroll - `8ffb5ee4` fix(review): address self-review findings on PR #417 - `43630a15` fix(customization): pin the action preview above the scrolling list - `60f341df` fix(customization): rework drag-and-drop, a11y and header layout - `ce4048d6` fix(visibility): stop gating GET_INSTALLED_APPS app-ops on the pm grant exit code - `070fc5c7` fix(review): close the scan-revision window opened by drop(1) - `7829c618` fix(i18n): make the language picker sheet scrollable - `d5d4c1e0` fix(backup): stop stranding staged copies in /data/local/tmp on cancellation - `8020e7f7` fix(visibility): close the GET_INSTALLED_APPS app-op on revoke - `5406c046` fix(backup): sweep the staging directory under both roots - `dae9f613` fix(app-info): dismiss the sheet when opening the permissions screen - `a86409aa` perf(backup): stop copying whole archives to draw a 44 dp icon - `41779d87` fix(backup): report a delete the volume refused - `679c19fa` fix(customization): three ways a reorder drag came apart - `db45cb6c` i18n(pt-BR): Brazilian wording for the Backup Hub strings - `1005dbc2` test(scan): make the cache-policy tests able to fail - `77f9386c` fix(web,tools): three quiet wrong answers - `2fb42af4` fix(visibility): report the gate that actually opened, not just for self - `683b9b9f` fix(reorder): key each drag delta to the gesture that owns it - `4896c5b2` fix(analyzer,icons): bound the two copies that had no ceiling - `947aad47` docs(i18n,web,tools): three wordings that said the wrong thing - `66bc3a32` fix(restore): bound the third copy out of an untrusted archive - `0d35576f` fix(icons): make the pixel ceiling hold for a one-pixel axis - `32ca102c` fix(visibility,restore,tools): three logs that misreport what happened - `02e5363c` fix(icons,visibility): correct two claims the verification pass refuted - `0bf9b212` fix(restore,reorder): three regressions this branch introduced - `e3b99cd5` fix(backup): measure the staging volume the tar will actually use - `12f215ce` feat(app-info): tap the icon to open an app, long-press for its settings - `e34915d3` fix(app-info): the glow ended in a straight line, not a fade - `e6e35873` fix(glow): derive the header glow's margins instead of hand-tuning them - `b6991044` fix(store): re-vendor the live Shizu schema and rename ad -> has_ads - `dc997e65` fix(store): restore Shizu listing validity and fill the developer profile - `db51f0e4` feat(store): fill the Shizu developer profile and the app website slot - `aef0f20d` chore(release): bump version to 1951 (v1.95.1) and add release notes - `71b33dd9` chore(deps): bump the web group in /web with 3 updates - `91f5f784` chore(deps): bump github/codeql-action in the actions group - `0541d937` chore(deps): bump gradle-wrapper from 9.7.0 to 9.7.1 in the maven group - `61ab1ec6` chore(shizu): sync store changelog to v1.95.1 - `0bd1369e` fix(installer): make the Shizuku and Dhizuku silent-install rungs actually work - `583198af` fix(backup): format the archive date in the app locale - `4d038c1a` docs(installer): correct two overstated claims and one overstated test - `535e7c9f` docs(installer): say what actually exempts the shell from Android/data - `f8408b48` docs(components): design spec for per-component control in App Info - `3104018e` feat(components): open, force-open, stop and disable individual components - `cf19a134` fix(components): read stopservice's verdict from stderr, not its exit code - `06781eac` fix(components): rank failure markers by usefulness, not by line order - `e7090e42` fix(components): a dead transport is not a stopped service - `6ed95a38` fix(components): answer the three review findings on the disable path - `037aaa3c` fix(components): the session-consent box says whether it is ticked - `60cc4daf` fix(components): give the consent row back the 48dp the null handler gave up - `e0ed3f76` fix(freezer): a watchlist write that fails must not take the process - `b8acbf0a` fix(freezer): the review follow-ups PR #437 left behind - `ab029f94` fix(uitext): make a leaked UiText legible and kill the obfuscated toast - `84422d9d` docs(components): document per-component control, and correct the spec's scope - `73c81259` docs(components): Restore all is cross-app, not device-wide - `8b6382b0` docs(components): say which rows a partial Restore all leaves behind - `de4119e3` chore(lint): pin SyntheticAccessor in :app, and correct what it is worth - `6517660d` fix(strings): a partial Restore All must not claim the rest are off - `dfd1a8b0` docs(follow-ups): exact lint id, and every source set the :app fix touched - `da6ce9c9` chore(release): 1952 (v1.95.2) — per-component control, and a 20-release cap on this directory - `7b4419c1` chore(release): translate the Hindi changelog, and time the pruning check right - `5349aaeb` docs(release-notes): a placeholder nobody can run is worse than an example - `9e8611d2` fix(installer): make the install-time permission grant opt-in - `4fc55d3f` feat(installer): let the user answer the permission grant per install - `35c21e2a` i18n(settings): say which installs the permission grant reaches - `5c0f63ff` fix(installer): clear the per-install grant answer when a new package is parsed - `092050c9` docs: record worker shell lane design - `6b150603` fix(freezer): terminate bulk progress on cancellation - `7333706d` test(freezer): assert outer cancellation job - `7425be97` chore(deps): bump the maven group with 3 updates - `bf6b12b5` feat(privilege): define execution lane contracts - `db8184f7` feat(privilege): coordinate package mutations - `4855a78b` fix(privilege): make package lease handoff atomic - `2c1330a8` feat(root): own isolated archive and sweep shells - `45c278bd` fix(root): harden isolated Odin shell ownership - `53960f49` fix(root): distinguish cancellation from command timeout - `3d7f9c63` feat(root): route commands across three lanes - `41b195b2` fix(root): make MainShell submission atomic - `49d7c8f2` fix(root): handle MainShell acquisition failure - `f82507ae` refactor(root): centralize privileged command routing - `042849ba` refactor(root): centralize privileged command routing - `93649881` refactor(root): centralize privileged command routing - `a4ae5e37` refactor(root): centralize privileged command routing - `4d7a6381` test(root): cover concrete execution boundaries - `428d4e4d` fix(archive): isolate root commands from interactive work - `97aa3817` fix(archive): preserve force-stop execution metadata - `b30d7e64` chore(deps): bump the web group in /web with 3 updates - `152e4618` chore(deps): bump the actions group with 2 updates - `9aa77b03` feat(sweep): persist durable request snapshots - `2ae1df2b` feat(sweep): enqueue and observe durable requests - `8e01e7d5` fix(sweep): expose durable request discovery - `e44b1e94` chore(deps): bump the maven group with 5 updates - `6b56bf74` fix(backup): preserve enqueue handoff before background - `7cd21db0` fix(archive): access private data through archive shell - `f55a4981` fix(sweep): preserve enqueue and source observation - `be5fb3a2` feat(sweep): cancel the durable queue safely - `d588143e` test(room): enable migration foreign keys - `756700c6` feat(sweep): execute durable privilege sweeps - `446c7fbb` fix(privilege): exclude broker authorization self-grants - `61c8a888` feat(sweep): migrate bulk freeze actions to WorkManager - `890bbf31` fix(sweep): retain durable profile identity - `eca4eb74` feat(sweep): render durable progress states - `d6717b8b` fix(sweep): prefer newest retained profile request - `0844212d` feat(sweep): add replay-safe cache and reinstall actions - `34f67e1e` fix(sweep): reject failed reinstall path lookups - `5479b643` fix(deps): restore Asgard Material3 compatibility - `9ddcaa94` docs(workers): document shell lanes and sweep states - `ce7e5895` test(sweep): avoid restricted WorkManager states - `2fa5b714` test(sweep): align dialog lifecycle assertions - `26fe6af0` feat(archive): authenticate schema v2 manifests - `ce2b9fa0` feat(archive): authenticate bundle bytes - `13d50cc7` feat(archive): verify staged APK clusters - `7969ea37` feat(archive): roll back unsafe new installs - `385b9bf5` feat(archive): refuse unauthenticated restores - `7e07a2e9` fix(archive): harden authenticated restore flow - `9671462c` fix(archive): close install cancellation gap - `d516a54d` docs: record worker lane acceptance evidence - `41830645` fix(root): drain cancelled interactive MainShell work - `23c4677c` docs: finalize worker lane acceptance evidence - `60dc074e` fix(web): exclude internal lane architecture page - `591c96ec` fix(privilege): serialize root availability probes - `c1c4fe29` docs(workers): capture service queue latency baseline - `c08bc4c4` fix(ui): remove release latency draw hooks - `a70daf65` feat(queue): define durable task contracts - `5ab628bf` fix(queue): validate durable task contracts - `c057ceea` fix(queue): harden presentation arguments - `c147f04d` feat(database): add complete durable queue schema - `e18762c8` fix(database): harden durable task recovery - `0a8fbf8e` fix(database): require explicit recovery liveness - `c7f37826` test(database): prove final drain writer contention - `148265de` feat(database): add sweep target claim transactions - `1d70dd69` fix(database): harden sweep claim recovery - `e1902e28` fix(database): reject partial sweep ownership - `b84dabe3` fix(database): fence malformed sweep targets - `3fddfa47` fix(database): validate sweep ownership tokens - `9e662f48` fix(database): align sweep runnable detection - `6462fe90` feat(queue): add durable data task acceptance - `5667f97c` fix(queue): preserve keys after accepted cancellation - `0a8f5422` refactor(backup): extract archive task runners - `5cee7b2f` chore(deps): bump io.coil-kt.coil3:coil-compose in the maven group - `7e4ea876` fix(backup): harden archive task recovery - `70be7af0` refactor(export): add resumable data task runners - `8c49785f` fix(export): reconcile durable publications - `b75964fc` fix(export): fence durable publication leases - `33265150` feat(service): add typed foreground prerequisites - `77b93451` feat(service): activate durable data queue - `e8e7d98e` fix(service): harden data queue ownership - `a4bd12da` fix(service): fence data queue generations - `f4f5a2bd` fix(service): complete data queue fencing - `76f87280` fix(service): close data queue recovery gaps - `67672a0d` fix(service): settle exact data claims - `9be7d51a` fix(service): finish recovered data claims - `e76894e8` fix(service): close data recovery races - `b6efdb3c` fix(service): preserve data recovery completion - `a0afd1ab` fix(service): retry inherited data recovery - `b088330f` chore(deps): bump the web group in /web with 4 updates - `17c75f05` chore(deps): bump softprops/action-gh-release in the actions group - `d535d3f5` fix(service): gate inherited recovery retry - `3b7ca931` feat(sweep): recover durable target state - `9a108824` fix(sweep): preserve legacy work identity - `72fa4cf7` feat(sweep): activate foreground service queue - `e5b80b5b` refactor(workers): isolate compatibility execution - `0fc62497` feat(queue): project durable task history - `81e7e73f` feat(queue): add task queue screen - `baac6038` feat(queue): add task detail logger - `1fe31820` feat(queue): navigate to durable task details - `8efa11a7` feat(share): queue durable share preparation and retention - `ba9f8281` fix(share): reclaim cancelled and recovered share outputs - `cc67ad66` fix(queue): render localized progress and cancellation notifications - `c8da3fb3` chore(build): retain Studio AGP alpha04 update - `92e7d476` docs(queue): record service migration and remaining acceptance gates - `b4d3328b` docs(queue): record PR publication and final review gate - `93439274` fix(test): avoid recursive source-sanitizer overflow - `d1eda765` chore(web): update fast-uri to patched 3.1.7 - `98be2f6c` docs(queue): record CI corrections and review recovery - `fd8b97c9` fix(queue): harden task ownership, export publication and UI lifetimes - `25ffb74e` docs(queue): record CI acceptance and bounded emulator measurements - `45bf8b24` fix(queue): consolidate pending logs and space task controls - `225fce86` feat(queue): add Guardians branding and operation icons - `eada3844` chore(deps): bump the maven group across 1 directory with 2 updates - `1f6e8a7a` fix(export): reset sheet state after task navigation - `37831981` fix(root): use mount-master for sweep cache operations - `cb1068d5` chore(queue): remove acceptance probes and stabilize Back test - `8bc360d6` docs(queue): reconcile physical and emulator validation - `9e65c745` chore(deps): bump svgo - `d3e8d418` chore(web): sync Astro and js-yaml updates from master - `99ddd6ac` fix(deps): pin Material3 to the Asgard-compatible runtime - `634da1ba` feat(installer): add legacy APK consent and readable settings - `95ba6770` docs(community): record feature assessment and validation status - `d91378d3` docs(installer): clarify disposable smoke-test emulator - `9ed5a4d8` feat(app-list): confirm bulk actions and improve task progress - `a629b0ae` fix(i18n): describe queued suspend and unsuspend actions - `f5ad6f70` chore(release): prepare v1.95.4 notes and metadata - `bd2d8c8a` fix(uninstall): sequence standard dialogs for batch fallback - `df4fff56` chore(deps): update Kotlin and Android libraries - `825408ee` refactor(kotlin): use stdlib ordering and hex encoding - `e5b61192` refactor(kotlin): use explicit backing field for installer events - `22949711` docs(perf): record emulator profiling results - `a691b773` fix(build): increase Kotlin compiler heap for release builds - `aa58f5b2` feat(i18n): add English and Arabic legacy Fix Store guidance - `b6aa4c3f` feat(i18n): translate legacy Fix Store guidance to Spanish and French - `67fa5df9` feat(i18n): translate legacy Fix Store guidance to Polish and Portuguese - `b9e6dc22` feat(i18n): translate legacy Fix Store guidance to Brazilian Portuguese and Chinese - `d4a1d4fa` feat(installer): define version-aware Fix Store routing - `8db86e2f` feat(installer): verify legacy reinstalls and reject split APKs - `b83e7521` fix(installer): track legacy install requests across lifecycle changes - `f3da333d` fix(dhizuku): reject unsupported silent Fix Store operations - `1637179a` fix(ui): support readable logs and neutral completion states - `933f4a7d` feat(installer): integrate safe user-confirmed legacy Fix Store - `ae74c03e` fix(app-list): forward reinstall requests through shared routing - `d44b0894` feat(ui): expose legacy Fix Store without elevated access - `6bbcb793` docs(installer): document legacy Fix Store compatibility limits - `6e55aca3` chore(deps): bump fastlane from 2.238.0 to 2.239.0 in the fastlane group - `59689621` chore(deps): bump the web group in /web with 3 updates - `c19b46a5` chore(deps): bump the actions group with 2 updates - `c2965493` fix(installer): remove legacy Fix Store fallback - `6b4e562a` feat(settings): add Asgard and system font presets - `ec5e010f` fix(installer): show feedback while preferences load - `6748bb8f` fix(lint): remove synthetic accessors and enforce the check **Changes after the 1950 release:** https://github.com/trinadhthatakula/Thor/compare/v1.95.0-dev-40...f7bb0001dbd4511705aedee646039fe767503ec6 **Including the development cycle consolidated into 1950:** https://github.com/trinadhthatakula/Thor/compare/v1.94.0...f7bb0001dbd4511705aedee646039fe767503ec6
  • Aug 23, 2026 1.95.1
    # Thor v1.95.1 Release Notes The cumulative stable release, uniting everything shipped across the **v1.94.x** development cycle and the **v1.95.0** dev build that followed it. If you last updated from a stable release, this is the whole of that work in one step. It brings complete, offline, encrypted **App Data Backup & Restore (`.thorbak`)**, the dedicated **Backup & Restore Hub**, full **`.xapk` / OBB** game and split-package installation and export, **App Info Action Customization**, explicit **Freezer action semantics**, comprehensive **8-language localization**, and the package-visibility and privilege-detection fixes that followed
    More…
    them on real devices. --- ## ✨ Highlights * 📦 **Backup & Restore Hub** — dedicated home bento hub to browse, search, manage, share, and restore backups and installer bundles found in your device storage. * 💾 **Encrypted App Data Backup (.thorbak)** — offline backups protected with AES-256-GCM authenticated encryption and key derivation. Full app data directories on root; APKs and shared storage on Shizuku. * ⚙️ **App Info Actions Customization** — drag-and-drop reorder and toggle visibility for all per-app quick actions, with the live preview pinned above the list while you rearrange. * 👆 **App Icon Gestures** — tap an app's icon in App Info to open it, long-press for its system settings page. * 🎮 **Full .xapk & OBB Support** — export and install games and large multi-part apps seamlessly, with automated OBB directory staging. * ❄️ **Explicit Freezer Semantics** — differentiated action labels between tabs (*"Unfreeze & Remove"* vs *"Remove from Watchlist"*) and automatic dead package pruning. * 🌐 **8 Supported Languages** — full translation coverage across English, Arabic, Spanish, French, Polish, Portuguese (European & Brazilian), and Simplified Chinese. * 🔍 **Package Visibility Recovery** — app lists that collapsed to Thor alone on Chinese OEM ROMs and fresh installs now populate correctly. * 🔑 **Dynamic Privilege Detection** — Shizuku granted while Thor is running is picked up on its own; root and Dhizuku are picked up with **Refresh**. Neither needs the process killed. * ⚙️ **Categorized Settings** — organized into 6 structured sections with responsive dual-pane layout on foldables and tablets. --- ## What's Changed ### 📦 Backup & Restore Hub (#412, #413) The **Backup & Restore Hub** turns backup management from a hidden setting into a central, top-level experience reachable from the Home Bento: * **Automated Storage Scanning**: Scans `Downloads/Thor`, the system `MediaStore` Downloads and Files tables, and your configured SAF export directory for `.thorbak`, `.xapk`, `.apks`, and `.apk` archives — without requiring root privileges. * **Archive Icon Extraction**: `ArchiveIconLoader` extracts, decodes, and renders app icons directly from archives with disk caching and bounded eviction. * **Filtering & Management**: Search, filter by category (*All*, *Data Backups*, *App Bundles*), view detailed archive metadata, share files natively, or delete with confirmation. * **Instant Backup Triggering**: Launch new backups directly from the hub using an integrated modal App Picker. * **Unified Intent Routing**: Opening `.thorbak` files from "Install from file" or external file managers routes immediately to the restore sheet. ### 💾 Full App Data Backup & Restore Phase 2 (#379, #381, #385, #389) End-to-end, offline, encrypted application data preservation: * **AES-256-GCM Authenticated Encryption**: App data directories (`/data/data/<package>`), APKs, and external storage files are archived into encrypted `.thorbak` bundles. * **Privilege-Aware Scope**: On root, backups cover private app data (`CE` and `DE`) alongside the APK and shared storage. On non-root shell privileges such as Shizuku, private data is not readable, so backups cover the APK bundle, `EXTERNAL_DATA` and `EXTERNAL_MEDIA` — and the size estimate reflects exactly what will be archived rather than promising data it cannot reach. * **PBKDF2WithHmacSHA256 Key Derivation**: Per-archive unique salt and cryptographic derivation protect your data. Passphrase caching stores an encrypted DataStore blob protected by AndroidKeyStore. * **WorkManager Foreground Sync**: Background backup and export execution powered by Android WorkManager with `FOREGROUND_SERVICE_DATA_SYNC` compliance, persistent progress notifications, and cancellation support. Backup staging verifies usable disk space before archiving begins. * **Safety Pre-flight Validation**: Restoring performs package signature verification before touching app data. ### ⚙️ Customizable App Info Actions (#410, #418) Tailor the action bar in App Info sheets and details screens to your exact workflow: * **Drag-and-Drop Reordering**: Rearrange quick action tiles (Freeze, Suspend, Force Stop, Permissions, Clear Cache, Backup, Export, Share, etc.) in any order. * **Visibility Toggles**: Hide actions you don't use. * **Pinned Live Preview**: The preview, drag hint, and reset button stay fixed above the scrolling list, so you can still see where a tile lands when you drag one from the bottom of the list. * **Reorder Hardening**: Fixes a drop that resolved against pre-swap layout information, two fingers on two handles driving one state holder, a drag endable by a key that wasn't dragging, and a preferences resync arriving mid-drag being dropped instead of deferred. ### 👆 App Icon Gestures (#421) * **Tap to open, long-press for settings**: Two gestures on the app icon at the top of both app-info surfaces. Both are shortcuts to actions the row below already offers, so nothing is gesture-only — and because the header shares the row's exact lambda instances, tapping the icon of a frozen or suspended app unfreezes it first, just as the Open action does. ### 🎮 Full `.xapk` & OBB Split Package Handling (#376, #378) * **Game & Multi-APK Support**: Install and export `.xapk` split bundles with automated detection and placement of expansion assets (`/Android/obb/<package>`). * **Background Export via a Foreground Service**: Long exports run in the background as WorkManager jobs promoted to a `dataSync` foreground service, with notification progress channels. ### ❄️ Freezer Action Differentiation & Watchlist Pruning (#370, #415) * **Differentiated Snowflake Labels**: Names the action by context — `"Unfreeze & Remove"` on the Freezer tab (restoring the app upon removal) vs `"Remove from Watchlist"` on the Apps tab (adjusting watchlist membership only). * **Automatic Watchlist Pruning**: Uninstalled packages are cleaned up from the watchlist based on cache scan verdicts. * **Atomic Profile Saves**: Profile editor writes are secured with database transactions and error rollbacks. * **Per-Group Kill & Suspend**: Execute mass kill or suspend operations directly on freeze profile member apps. ### 🔍 Package Visibility & Privilege Acquisition (#417, #419) The app list coming back with **Thor as the only installed app** on Chinese OEM ROMs is fixed, along with the regression that reintroduced it: * **Fresh installs and Chinese OEM ROMs** (ColorOS, OxygenOS, HyperOS, MIUI) recover visibility through fallback flag queries and automatic AppOps grants, with `SelfPermissionGranter` synchronized against `AppRepository` rescans. * **The app-op grant is no longer gated on `pm grant`'s exit code.** `com.android.permission.GET_INSTALLED_APPS` is vendor-defined, not AOSP, so `pm grant` frequently exits non-zero on ROMs where the app-op is what actually governs access — making the tidy-up "skip follow-up work if the grant failed" precisely backwards for this one permission. * **Privilege Manager Registry**: `PrivilegeManagerApp` resolves known root and privilege managers by package name — KernelSU, KernelSU-Next, APatch, Magisk, Shizuku, Dhizuku and others. * **In-app grant requests** for Shizuku and Dhizuku, and a **Refresh** in the Privilege Check dialog that re-probes all three sources. Shizuku recovers on its own via binder and permission listeners; root and Dhizuku publish no such callback, so before this a grant made while Thor was running stayed invisible until the process was killed. * **Removed `FLAG_MOUNT_MASTER`**, which caused root acquisition to fail outright under KernelSU and APatch. * **Touch responsiveness** fixes in the App List sort/filter bottom sheet. ### 🌐 Comprehensive 8-Language Localization (#395, #397, #398, #400) * Added **Polish** (`pl`) and **Portuguese** (European `pt` + Brazilian `pt-rBR` regional override). * Backfilled and proofread **Arabic**, **Spanish**, **French**, and **Simplified Chinese** with 0 missing translations across all build flavours. * The language picker sheet now scrolls, so the last locales in the list are reachable on short screens. ### ⚙️ Settings Reorganization & Tablet Multi-pane (#383) * Reorganized settings into 6 clear categories: *General*, *Appearance*, *Freezer*, *Work Mode*, *Data & Backup*, and *Advanced*. * Adaptive dual-pane navigation rail layout for large screens, foldables, and tablets. ### 📊 CSV App List Export with Formula Injection Guard (#371) * Export your filtered, searched, or full app list to CSV directly from the filter sheet. * Built-in protection against spreadsheet formula injection (RFC 4180 escaping and leading character neutering). ### 🐛 Post-Release Review Fixes (#420) A review pass over everything merged since `v1.94.4-dev-26`: * **Storage leaks on cancellation.** `ArchiveIconLoader`, `UriArchiveSourceFactory`, and `AppAnalyzerImpl` cleaned up staged copies in a `finally` that called a suspend function — which never runs on cancellation. Coil cancels an icon fetch whenever a row scrolls out, so every scroll of the Backup Hub left a full archive copy behind. * **A stranded multi-gigabyte staging file.** When the internal volume is short, backup staging downgrades to `externalCacheDir`, and the orphan sweeper had no rule for that root — so a crash mid-backup left a tar file that nothing would ever clean up. * **Backup Hub icon loading.** `.thorbak` rows staged a copy of the entire archive to draw a 44 dp icon, looking for an entry no `.thorbak` has ever contained, and repeated it on every scroll. Now `.thorbak` is never staged, every other stage is capped at 256 MB, decoding is sampled rather than allocating the source's full pixel buffer, and a miss is remembered. * **`revokePermission` left the app-op open** in all three gateways, so a revoked permission kept working on the ROMs where the op is what is consulted. * **Failed archive deletion is now reported** instead of silently closing the dialog and leaving the row in place. * **Brazilian Portuguese** received all 22 Backup Hub strings; they had been resolving through European Portuguese. * **The permissions-screen flicker**: opening Permissions from the app-info sheet left the sheet up behind the pushed route, so back popped the route and the re-emitting sheet fought it. The sheet now dismisses itself when it hands off. --- ## 🛠️ Reliability & Verification * `./gradlew :app:testFossDebugUnitTest --rerun-tasks` — 122 suites, **1634 tests, 0 failures**. * `./gradlew lintFossDebug lintStoreRelease` — clean, no `MissingTranslation` across any flavour. * Website and documentation integrity validated: 304 web test suites passing, with type, link, claim, markup and sitemap checks.
  • Aug 5, 2026 1.94.0
    # Thor v1.94.0 Release Notes The first stable since **v1.93.0**, consolidating everything that shipped through the `v1.93.1`, `v1.93.2` and `v1.93.3` pre-release builds — **67 pull requests**. Two threads run through it. The first is **new ground**: freeze profiles, bulk backup and `.xapk` export, permission filtering, and a support catalogue that comes from Play instead of from the binary. The second is quieter and, for anyone who relies on Thor to actually do what it says, more important: **a long sweep making privileged actions report the truth.** `pm` and `am` return exit code 0 for work they did not do. Thor used to believe them. It no longer does
    More…
    — it re-reads the state it asked for, and tells you when the answer is no. The same sweep found the sharpest bug in the release: **freezing a preinstalled app was uninstalling it, and taking its data with it.** --- ## ✨ Highlights * 🧊 **Freeze Profiles** — save named groups of apps and freeze or unfreeze the whole set in one tap. * 💾 **Bulk backup and export** to a folder you choose, now including **`.xapk`** alongside `.apk` and `.apks`. * 🔎 **Filter the app list by permission** — Camera, Microphone, Location and more. * 🧊 **Freezing a preinstalled app no longer wipes its data.** Thor disables it; where it must fall back to removal, it keeps the data. * ✅ **Freeze, restrict, force-stop and clear-data are judged by a readback**, not by an exit code that never meant success. * 🔒 **App lock covers cold start**, and the app list no longer leaks into the Recents preview. * 📱 **One app-info sheet**, with the full details built in — the detailed-view switch is gone. * 🏠 **The home shortcuts pack themselves to the space they have**, and the Installer and Extensions tiles can be switched off in Settings. * 💖 **Support tiers are read from Play**, so a new tier appears without an app update. --- ## What's Changed ### 🧊 Freeze Profiles (#295 — the profiles half of GH#55) Named, saved groups of apps. Build a profile once, then freeze or unfreeze all of it from a single control. The editor takes a bulk selection, and profiles persist in Room alongside the watchlist. ### 💾 Bulk backup and `.xapk` export (#293 — GH#51 phase 1, and GH#164) Export several apps in one run to a folder you pick, and export as `.xapk` alongside `.apk` and `.apks`. Backups carry a `manifest.json` with a `schemaVersion`, so a later release can add per-app data without invalidating a folder written by this one. Scope, stated plainly: this is the **APK** half. Backing up an app's *data* is root-only and has not been built. Exported bundles go through the normal share sheet, so Quick Share already moves them phone-to-phone — GH#51 was closed by its reporter on that basis, not because the data half landed. ### 🔎 Filter the app list by permission (#294 — for GH#285) Filter by what apps can actually reach: Camera, Microphone, Location and the rest. ### 📱 Unified app-info sheet (#288) App info and app details are one sheet. The "detailed view" toggle it replaces is retired rather than hidden. ### 🏠 An adaptive home grid, with tiles you can hide (#357 — for GH#344) The home shortcuts pack to the room they have instead of to a fixed 2×2. An odd number of tiles leads with a full-width one rather than leaving a hole, and in the navigation rail — where a tile has no width for its label — each takes its own row and explains itself on a long press. **Installer** and **Extensions** each got a switch in **Settings → General**. Hiding a tile takes away the shortcut, never the feature: the installer still handles APK intents, and Extensions keeps its own Settings entry. The two preferences stack with the existing eligibility rules rather than overriding them, so asking for the Extensions tile without a privilege mode still shows nothing — and hiding both with no privilege legitimately empties the grid, which disappears rather than leaving a gap where it used to be. ### 🧊 System-app freeze: disable first, remove second (#314, #332 — for GH#316) The important fix in this release. Freezing a preinstalled app went down an uninstall path that destroyed its data. * Thor now **disables** a system app to freeze it (#314). * Where a rung must fall back to removal, it uses `pm uninstall -k` to **keep data and cache**. * The destructive rung is gated on an actual refusal, not on an Android version guess. * The same defect existed on the **Dhizuku** path and was fixed there too (#332). * Extension-initiated freezes are routed through the same `FreezeTier` gate, so an extension cannot take the destructive path around it. ### ❄️ Freezer reliability — tile, shortcuts, watchlist, bulk runs (#284, #286, #287, #300, #308, #331) * The **QS tile** derives its state from real per-app freeze state instead of a cached guess (#284). * **Pinned shortcut icons** are rebuilt by the runner rather than by whichever caller happened to trigger it (#286). * The tile and **Freeze-all** no longer bypass the unsafe-app block (#287). * Shortcut lookups use the flags a **frozen system app** needs, or the package reads as absent (#300). * **Removing an app from the watchlist always restores it** (#308 — for GH#310), and says so when it cannot. * **Bulk removal stops reporting a success it never checked** (#331). ### ✅ Privileged actions judged by a readback (#346, #347, #348) * Actions are verified by **re-reading the state**, not by trusting an exit code (#347). * **Clear-data waits for the observer** instead of reporting a wipe that was merely dispatched (#348). * The **app-ops fallback** stops reporting a restriction it never applied. * **Every privileged command names the user**, per that command's own AOSP default (#346) — work profiles and secondary users were being hit by accident. * One unresponsive ROM no longer costs a batch **~15 seconds per app**. ### 🤖 Dhizuku, on real hardware (#333) Device testing turned up three defects, all fixed: * `am get-current-user` is **denied** to the Dhizuku uid, so the user id is resolved once and centrally instead of being asked for per command. * The privilege dialog **names Dhizuku** in all five locales. * **Refresh never re-probed privileges at all.** It looked Dhizuku-specific only because Shizuku's listeners self-heal and mask it — root was affected too. ### ⏸️ Suspend ownership (#330) An unsuspend you don't own returns an **empty failure array**, which every caller read as success. Thor now reads the recorded suspender and reports honestly when it cannot lift a suspension another privilege mode applied. ### 🔒 App lock, privacy and stability (#292, #299, #339, #340) * **App lock covers cold start**, and the app list no longer appears in the Recents preview (#340). * The lock has **a way out when no prompt can succeed** (#292) — a restore onto a device with no enrolled biometric used to lock the user out of Settings entirely. * The "already prompted" flag is **kept off cloud backup** (#299), so a reinstall does not pre-suppress the watchlist recovery prompt. * An **unreadable settings file no longer crash-loops** the app (#339). ### 📱 App list, installer and locale (#276, #277, #278, #329, #343, #345) * The app list **survives a ROM revoking package visibility** in the background (#329) — it was collapsing to a single entry on some Chinese-market ROMs. * The installer makes **the confirmed identity and the installed bytes one set** (#343), and cancels a superseded parse so it reclaims its own staged copy. * Downgrade detection is gated on a **known** `versionCode`, and the codes are surfaced (#276). * `longVersionCode` is **no longer truncated to `Int`** (#277). * Pull-to-refresh is no longer charged the transition settle delay (#278). * The in-app **language picker works below API 33** (#345), and a language change reaches the caches that hold copies. ### 💖 Support (#311, #342, #351, #356) * **GitHub Sponsors** alongside Patreon and PayPal (#311). * **Ko-fi and Buy Me a Coffee are now in the app** (#356). The website and `FUNDING.yml` have advertised five funding routes for a while; the in-app sheet only ever offered three. All five now agree. * **Support tiers are probed rather than hardcoded** (#351). Play exposes no catalogue- enumeration API, so Thor queries a candidate ID set and renders whatever Play answers with — a tier added in Play Console shows up without an app release. Prices and their ordering come from Play's own localized figures, so the amount shown is the amount in the buyer's currency. * A **resume rebuilds a billing connection** the retry ladder had given up on (#342). --- ## 🌐 Project: the site, the stores, the build * **The Thor landing page shipped** (#313, #319, #321, #322, #327, #328) — an Astro site with a claims gate that reads the built HTML rather than the source, so a claim cannot pass by being written differently than it renders. It deploys from Vercel's Git integration; the Actions-based path is documented and deferred. * Both Play uploads moved **up one track** (#320): internal→alpha, alpha→beta. * A **keystore-less clone can build a release**, with an F-Droid guide (#309). * Website copy drafts are kept out of the repo (#312). ## 🔧 Internal * **R8 runs on every PR** (#338), so the first minified build is not the one that ships. * The **Tier-0/1 deferred-work batch** (#290) closed ten tracked items at once (GH#5, #11, #14, #16, #17, #18, #20, #21, #22, #28), with 209 tests and lint enforced. * Named **dispatchers are injected** rather than hardcoded (#350), so the classes that use them are testable. * Four build warnings fixed **without deleting the runtime guards they pointed at** (#354) — the elvis branches survive R8 into the shipped DEX, so removing them would have swapped a guard for a crash on non-compliant ROMs. * Behaviour tests for app-list load/refresh timing, and the seam they required (#296). * `:vm-runtime` aligned to Java 21 so the IDE stops rewriting `.idea` (#307). * An upstream AGP alpha release no longer fails every open PR (#298); both open gem advisories closed and bundler tracked by Dependabot (#291). * Documentation corrections that contradicted the shipped `-k` freeze behaviour (#315, #318), the follow-up index resweep (#336), the DataStore write path filed for later (#341), and the billing reconnection backstop named accurately (#349). * Cold-start measurement work concluding that the slow `root=` mode is **CPU contention, not emulation** (#305, #306). * Dependency and action bumps: #275, #297, #304, #317, #324, #325. --- ## 🛠 Commits Log (`v1.93.0...v1.94.0`) * `59236b5e` — #357 adaptive home grid, and hiding the Installer and Extensions tiles * `fbf2d54e` — #356 Ko-fi and Buy Me a Coffee in the app * `0ea6f93b` — #354 lint warning sweep, guards preserved * `1f31a36f` — #352 release 1.93.3 * `172583f7` — #351 probe support tiers instead of hardcoding them * `2f46f7e5` — #350 inject named dispatchers * `ad1a9e65` — #349 name the real billing reconnection backstop * `585e82f3` — #348 clear-data waits for the observer * `d7eec303` — #347 judge privileged actions by a readback * `53a8631a` — #346 name the user on every privileged command * `998a6c99` — #345 language picker below API 33 * `9d5b677f` — #343 confirmed identity and installed bytes as one set * `0a8b5971` — #342 a resume rebuilds the billing connection * `3031498f` — #341 file the DataStore write path * `535311a9` — #340 app lock cold start, Recents leak * `cb177c78` — #339 unreadable settings file no longer crash-loops * `ec2066bd` — #338 R8 on every PR * `7adbc2fb` — #336 follow-ups resweep * `e1ab6323` — #334 release 1.93.2 * `38f6effa` — #333 Dhizuku user id, re-init, Refresh * `c997124e` — #332 freeze preinstalled apps by disabling (Dhizuku) * `a78b2255` — #331 bulk removal reports what it checked * `9f487d3a` — #330 unsuspend reports honestly * `2aaa45f3` — #329 app list survives revoked package visibility * `8035db3e` — #328 screenshot gate confirmed enforced * `17008c7c` — #327 let Vercel's Git integration deploy * `61ca876b` — #325 CodeQL action bump * `ff7681e3` — #324 `@astrojs/compiler` bump * `7dca86f3` — #322 publish from master, stage from dev * `23bad00a` — #321 site deploy from Actions * `7adb5955` — #320 Play uploads up one track * `1f418e95` — #319 the Thor landing page * `015f0831` — #318 correct two `-k` permission-grant claims * `7bd109e9` — #317 `actions/setup-java` bump * `99eb889b` — #315 correct comments contradicting the `-k` fallback * `d8137191` — #314 freeze system apps by disabling, not uninstalling * `bfa6df75` — #313 landing page design spec * `ddebf315` — #312 keep website copy drafts out of the repo * `4b197ced` — #311 GitHub Sponsors in-app * `daaea68e` — #309 F-Droid preparation, keystore-less release build * `c8c0502a` — #308 watchlist removal always restores * `8c34824e` — #307 `:vm-runtime` JVM target 21 * `ded1039a` — #306 cold-start: contention, not emulation * `1b60fbeb` — #305 cold-start config 1 measured on v1.93.1 * `ec49853e` — #304 Dependabot: GitHub Actions * `dea40e45` — #302 correct three factual errors in the v1.93.1 notes * `b1f270e8` — #301 release 1.93.1 * `5eb19981` — #300 shortcut lookup flags for a frozen system app * `1f35400b` — #299 watchlist prompt flag off the backup * `55ea76b3` — #298 AGP alpha no longer fails every open PR * `0b047fcd` — #297 maven group bump * `d5bc0596` — #296 app-list behaviour tests and their seam * `2a503959` — #295 named freeze profiles * `4e35e0b4` — #294 filter the app list by permission * `e7748643` — #293 `.xapk` export and bulk app backup * `8680325b` — #292 app lock escape hatch * `1f99692a` — #291 gem advisories, bundler tracking * `3d0c70a1` — #290 Tier-0/1 deferred-work batch * `cf58be11` — #289 re-sync roadmap and project docs * `ff81bd98` — #288 unified app-info sheet * `bec4d5ce` — #287 tile and Freeze-all respect the unsafe-app block * `bfa9174f` — #286 rebuild pinned shortcut icons from the runner * `8a36ae45` — #284 QS tile from real per-app freeze state * `1fe56bf9` — #278 pull-to-refresh settle delay * `5799964b` — #277 stop truncating `longVersionCode` * `67228429` — #276 downgrade detection on a known `versionCode` * `e10aebef` — #275 maven group bump **Full changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.93.0...v1.94.0
  • Jul 22, 2026 1.93.0
    # Thor v1.93.0 Release Notes The next **stable** release — a consolidation of the entire development cycle since **v1.92.0**. Thor's root engine has been rebuilt, hardened, and open-sourced as **Odin**; there's a new **Auto Reinstall Apps** feature; the **Home screen was redesigned** into an adaptive bento grid with one-tap access to the Extension Manager; the **release-build app-suspend bug is fixed**; the direct-download APK is **~48% smaller**; a **66-finding full-codebase audit** (crashes, memory/binder leaks, background ANRs, Clean-Architecture domain purity) was remediated; and the app now speaks **four new languages**. > This changelog bundles everything shipped across the v1.92.1, v1.92.2 and v1.92.3 development builds, plus post-release hardening, into one stable release. --- ## ✨ Highlights
    More…
    * 🔧 **Odin** — the in-house `libsu` fork is rebuilt in pure Kotlin, hardened, and published open-source (Apache-2.0) to Maven Central. * 🔄 **Auto Reinstall Apps** — sync and reinstall your apps with custom install-time options. * 🎨 **Redesigned, fully-adaptive Home** with a bento action grid and an Extension Manager tile. * 🐛 **App suspend fixed on release / Play builds.** * 📦 **~48% smaller** direct-download APK. * 🛡️ **66-finding stability, leak & architecture audit** remediated. * 🌍 **Arabic, Spanish, French & Chinese (Simplified)** translations. --- ## What's Changed ### 🔧 Odin — Root Engine Rebuilt, Hardened & Open-Sourced (#254, #264, #266) Thor's privileged core was completely re-engineered and then extracted into its own open-source library: * **Pure-Kotlin bootstrapping**: the upstream pre-compiled `main.jar` was replaced with a pure-Kotlin bootstrapper that loads on the `app_process` classpath directly from the installed APK — zero external binary assets to audit, write to disk, or cache (`b8e0c08`). * **Now open source**: the fork is a standalone, Apache-2.0 library published to Maven Central as **`com.trinadhthatakula:odin:1.0.0`**. The bundled `:suCore` module is gone; Thor consumes the published dependency (`aacc18e`, `e58a5f1`). * **Hang-proof root probe**: root detection can no longer wedge the app — a failed shell init is signalled via `onShellDied`, the `isRootGranted` probe is time-bounded, and it correctly rethrows cancellation (`0560e93`, `ec75323`). * **Honest exit codes**: root shell commands now return the **real** process exit code — matching the Shizuku/Dhizuku gateways — instead of a hard-coded success (`aacc18e`). * **Failures propagate across the Binder**: privileged operations (suspend / clear-data) now report real success or failure across the root-service `Binder` instead of silently reporting success (`28fef5c`). * **Military-grade caller verification**: strict UID checks on the Binder interfaces — only root, the system server, or Thor's exact authenticated UID may bind — via a reusable `RootService.enforceCaller()` (`703685d`, `c77c668`). * **Thread-safe, non-blocking IPC**: all AIDL transactions moved off the main thread, removing background stutters, layout lag, and ANRs on low-end devices (`703685d`). * **Auto-reset lifecycle**: the privileged daemon proactively restarts on deployment so newly compiled code executes immediately (`0261496`). * **Resilient root binding**: a dead privileged-daemon binder is now detected and re-bound instead of failing later root operations, and the Auto Reinstall receiver validates incoming package names (`72446f7`). ### 🐛 App Suspend Fixed on Release Builds (#265) * Suspending / unsuspending apps silently failed on **release / Play** builds: R8 renamed bundled framework shadow classes, so the runtime calls hit the real framework classes and threw. The shadows were removed and the root-service daemon is kept intact, so **suspend works again on shipped builds** (`77ec023`). ### 🎨 Portable Installer Follows Your Theme (#273) * Opening an APK from Files or another app now renders the installer in **your** chosen theme — dark / light mode, Material You dynamic color and AMOLED — instead of only the device night setting. `PortableInstallerActivity` was themed with defaults; it now reads your preferences like the rest of the app (`6bfb6ea`). ### 🔄 Auto Reinstall Apps (#251) * **One-click reinstall**: sync app metadata automatically and trigger install-time overrides directly from your app-manager view (`6e689e8`). * **Idempotency guarantee**: removed a redundant processing cache so reinstallations are seamless and idempotent (`df642fa`). * **Preferences consolidation**: unified user-preference caching and installer arguments into a centralized, reactive `PreferenceRepository` (`e9df91b`). ### 🎨 Redesigned Home — Adaptive Bento & Extension Manager (#260, #261) * **Adaptive bento grid**: Home's stacked action cards are now a responsive 2×2 "bento" grid (`BentoTile` + `HomeActionsBento`), where a row collapses to full-width when a tile isn't applicable (`3323f10`, `bf69d7d`, `e55af89`, `93c9242`). * **Extension Manager on Home**: a new **Extensions** tile opens the Extension Manager straight from Home (previously buried under Settings), shown only when a privilege (Root/Shizuku/Dhizuku) is active; back-navigation now correctly targets the active tab's back stack (`1829ec5`). * **Truly adaptive**: the layout adjusts across compact / medium / expanded window sizes and caps its content width on large screens so it never sprawls (`1ab4a9f`). * **Extension list correctness**: rapidly leaving and re-opening the Extension Manager no longer lets a slower, stale refresh overwrite newer state (`191f217`). * **Landscape / tablet / foldable fixes**: the app-info, export, freezer-settings and installer sheets now scroll so actions are never cut off in landscape (`b72500a`), and the installer resets its scroll position on each install-state change (`cdb1659`); the Support & Community card aligns with the distribution chart and its buttons stack neatly on narrow panes (`0c1ca05`, `34aeb12`). ### 🔒 Modern API Bypass & Offset Caching (#254) * **Robust unsafe mapping**: extracts the direct static `theUnsafe` field inside JVM/ART, making private-API access immune to standard `SecurityException` blocks (`5f3d34d`). * **Stable reflections**: discarded unstable `ClassLoader` hacks for direct local shadow-class inspection, removing the crash-prone `CoreOjClassLoader` and preventing native segfaults; adds multi-layered, Kotlin-first bypass with offset caching (`b627ff7`). * **Safer receiver registration**: app-private broadcast receivers (the root-service receiver and the installer-status receiver) now register with the version-safe `RECEIVER_NOT_EXPORTED` flag (`b8e0c08`, `60d10f7`). ### 🛡️ Stability, Leaks & Architecture — 66-Finding Audit (#256, #257, #258) A full-codebase audit surfaced 66 issues; this release resolves them: * **Crashes & robustness**: fixed an app-list rotation crash, a root-bind deadlock, and an extensions-screen crash; hardened the privilege gateways and freezer tile service (`9e8eb39`). * **Memory / binder leaks**: fixed installer event-bus bitmap retention, per-tick coroutine-scope churn, abandoned PackageInstaller sessions, and a stale `ServiceConnection` in `RootSystemGateway` (`9e8eb39`, `d024694`). * **No more background ANRs / jank**: one-off UI events moved to a lifecycle-safe buffered channel, all blocking I/O moved onto injected IO dispatchers, and framework types pulled out of ViewModels (`b5056de`, `7711f3e`, `6c84683`). * **Installer hardening**: avoids `TransactionTooLargeException` when listing extensions (`537b37a`) plus batch-1 medium fixes across install/enumeration paths (`60d10f7`). * **Clean-Architecture domain purity**: the domain layer is now free of Android framework types — icons load via a cache path + Coil, install intents ride a data-layer holder, dead models removed, and a single source of truth for preferences (`96bd218`, `eba85d8`, `aa9239c`, `b67aea8`, `0893980`, `3a798c7`). * Plus numerous review-driven fixes across multiple gemini-code-assist rounds and holistic self-reviews. ### 🧊 Freezer Fix (#259) * Freezing one of **your own** apps no longer shows the alarming "Freeze System App?" warning — that safety prompt is now correctly limited to actual system apps (`48a9539`). ### 📦 Much Smaller Download — foss APK 6.23 MB → 3.24 MB (−48%) * The direct-download APK now **compresses its `classes.dex`** (`useLegacyPackaging`), the **foss build is obfuscated** (matching the store build), and foss ships **only its bundled locales**; bundled fonts were also subset — together nearly halving the foss-release APK (`38d875b`). * **Note:** Google Play App Bundles are delivered per-device and are, by design, largely unaffected by the dex-packaging lever — this size win is biggest for the GitHub / direct-download APK. ### 🧹 Polish — Lint, Qodana & Leaner Vectors (#268, #269) * Resolved the outstanding **Android lint + Qodana** findings: correct `<plurals>` handling, unused-resource cleanup, `mipmap-anydpi` rename, and coroutines bumped to 1.11.0 (`979f937`). * **Losslessly compacted** the two largest vector drawables (`thor_mono`, `thor_drawn_foreground`) — **−6.8 KB** with **pixel-identical** rendering, verified by render-diff (`AE == 0`) at multiple sizes (`7055d50`, `7903a07`). ### 🌍 Localization (#259, #260) * **68 strings** translated into **Arabic, Spanish, French and Chinese (Simplified)** (`5780379`), plus the new Home "Extensions" strings (`82cebb3`). ### 🎨 Other UI & UX Polish (#251) * High-contrast styling for freezer action buttons and dialog prompts (`0261496`). * Click-to-marquee scroll animations for extra-long configuration strings in settings rows (`ebe723c`). --- ## 🛠 Build & Dependencies * **Version**: bumped to **1.93.0 (1930)** in `gradle.properties`. * **Odin**: consumes the published `com.trinadhthatakula:odin:1.0.0` (Apache-2.0, Maven Central); the in-tree `:suCore` module was removed. * **Dependency updates** (Dependabot): AndroidX Compose Material3 and grouped Maven/Gradle bumps, plus a GitHub Actions group bump (`cdfb7f7`, `d8573e5`, `6e86087`, `7e54cc0`). --- ## 🛠 Commits Log (`v1.92.0...HEAD`) **Merged pull requests** * `663eaac` — #273 fix portable-installer theming (honor user theme / dynamic color / AMOLED) * `9f424ae` — #270 promote v1.92.3 to stable (dev → master) * `9b1e1f3` — #269 losslessly compact the long `VectorPath` drawables * `fbc8a8e` — #268 resolve Android lint + Qodana findings * `11188cd` — #266 Odin Phase 3: consume published `com.trinadhthatakula:odin:1.0.0` * `47e51b4` — #265 fix release-only app suspend broken by R8 (RootService daemon) * `f7cc74d` — #264 Odin Phase 1: MainShell hang fix + move `ThorRootService` into `:app` * `f14132f` — #263 promote v1.92.2 (dev → master) * `df30057` — #262 release v1.92.2 (version bump + notes) * `3f68fcb` — #261 make bottom sheets vertically scrollable in landscape * `afcd353` — #260 adaptive Home bento actions grid + Extension Manager entry * `55fb583` — #259 freezer freeze-dialog fix + lint cleanup + 68 translations * `c24d991` — #258 A3 domain-layer purity refactor * `68230ff` — #257 audit A-series (events/dispatchers/VM framework-types) + P2 tail * `b9269a1` — #256 audit P0/P1 + leaks + robustness + batch-1 mediums * `987478b` — #255 release-notes guide + v1.92.1 notes + PR review fixes * `e03a0f5` — #254 bypass + Odin engine upgrade (offset caching, secure daemon) * `4bbce47` — #251 Auto Reinstall Apps feature * `295aa79` (#253) / `ca6da96` (#252) / `fbd3d3c` (#250) / `eb83a4a` (#249) — Dependabot dependency bumps **Key commits** * `6bfb6ea` fix(installer): honor user theme, dynamic color & AMOLED in portable installer * `28fef5c` fix(root): propagate privileged-op failures across the `ThorRootService` Binder * `aacc18e` feat(odin): consume published Odin 1.0.0; delete `:suCore`; real shell exit codes * `77ec023` fix(app): fix release-only app suspend broken by R8 * `c77c668` refactor(sucore): move `ThorRootService` into `:app`; add `RootService.enforceCaller()` * `0560e93` fix(sucore): signal shell-init failure via `onShellDied` + bound `isRootGranted` so it can't hang * `ec75323` fix(sucore): rethrow `CancellationException` in the `isRootGranted` probe * `38d875b` perf(app): shrink foss-release APK 6.23 MB → 3.24 MB (−48%) * `979f937` chore(lint): resolve Android lint + Qodana findings (plurals, resources, coroutines 1.11.0) * `7055d50` / `7903a07` perf(res): losslessly compact `thor_mono` / `thor_drawn_foreground` pathData * `3323f10` feat(home): render actions as adaptive bento; add Extension Manager tile; drop ActionCard * `1829ec5` feat(home): open Extension Manager from Home; active-stack back handling * `b72500a` fix(ui): scrollable bottom sheets (landscape-phone crop) * `48a9539` fix(freezer): don't show "Freeze System App?" for user apps * `5780379` i18n: translate 68 strings into ar/es/fr/zh-rCN * `96bd218`…`3a798c7` refactor(audit): A3 domain purity (stages 1–6) * `b5056de` / `7711f3e` / `6c84683` refactor(audit): A-series + P2 tail * `60d10f7` fix(audit): batch-1 medium findings; `9e8eb39` fix(audit): P0/P1 findings * `b627ff7` upgrade bypass + vm-runtime (Kotlin-first bypass, offset caching) * `5f3d34d` refactor: Odin & bypass review fixes (`theUnsafe` static-field mapping) * `b8e0c08` refactor(suCore): pure-Kotlin bootstrap; drop upstream `main.jar` * `703685d` impl(Odin): secure root daemon + non-blocking IPC * `6e689e8` feat(reinstall): Auto Reinstall Apps with install-time overrides * `e9df91b` refactor: consolidate preferences/installer args into `PreferenceRepository` * `ebe723c` feat(settings): marquee-on-click for long setting values * `191f217` fix(extensions): cancel stale `loadExtensions()` so it can't overwrite newer state (#263) * `72446f7` fix(pr): root dead-binder recovery + Auto Reinstall package-name validation (#255)
  • Jul 10, 2026 1.92.0
    # Thor v1.92.0 Release Notes **Extensions, Shortcuts, Suspend Mode, and Security** — introducing the trust-anchored Extensions framework, home-screen launcher integration for frozen apps, dynamic Freeze/Suspend modes, reactive privileges, app sorting by size, and major under-the-hood installer & performance fixes. --- ## What's Changed ### 🧩 Secure Extensions & In-App Store Thor now supports verified, out-of-process extensions gated behind active privileges and explicit consent:
    More…
    * **Extensions Store**: Browse official add-ons, perform SHA-256 integrity checks, verify pinned keys, and perform in-place upgrades. * **Dynamic Versioning & Management**: Extension cards dynamically resolve version names from the `PackageManager` and feature an outlined **Uninstall** action. * **Security Hardening**: Replaced broadcast-based triggers with a cold-startable `ExtensionOpsProvider`. Same-process calls are secured using Binder UID verification checks (`Binder.getCallingUid() == Process.myUid()`) to block isolated processes from spoofing identities. * **Initial Extensions**: * *Stormbringer* — Auto-unfreezes suspended apps when tapped (requires LSPosed). * *Thor Cluster Automator* — Group and schedule freeze/unfreeze operations. ### 🥶 Freezer Mode: Suspend vs. Freeze * **Choose Your Freeze Method**: A new **Settings → Freezer → Freeze Mode** segmented selector lets you choose how apps are deactivated: * **Freeze (Disable)**: Completely disables the application (standard Android package disabling). * **Suspend (Android Suspend)**: Places the application in a suspended state (using Android's official suspend APIs). * **State-Aware Actions**: Bulk freeze/unfreeze, single app toggle, launcher shortcuts, and auto-freeze actions all honor the selected mode, handling mixed disabled/suspended states gracefully across all paths. ### 🧊 Freezer Launcher Integration & Shortcuts * **Grayscale State-Following Icons**: Pin frozen apps to your launcher. Icons display in grayscale while frozen, automatically turning full-color when enabled and launched. * **Freeze All / Unfreeze All**: Create launcher shortcuts or access them directly from a long-press on Thor's app icon. * **Add-to-Freezer Prompt**: Consistent confirmation prompt when freezing apps from the App Info dialog or App Details page. ### ⚡ Reactive Privileges & Smoothness * **Live Status Updates**: Root, Shizuku, and Dhizuku availability updates instantly on Home, App List, and Freezer screens. * **Main-Safe IPC**: Availability checks run cleanly on the IO dispatcher, removing any startup "flashes" or rendering lags. * **UI Redesign & Performance**: Replaced legacy navigation and motion components with **Asgard UI library**. Swapped collectors to eliminate pull-to-refresh memory leaks. App icons are now decoded at their exact display sizes. ### 📏 Sort by Size & Folder Export * **Sort by Disk Footprint**: Sort your application lists by total install size (requires Usage Access permission). * **Scoped Directory Export**: Redesigned export sheets write APKs and split bundles directly to user-selected folders via the system picker. ### 📦 Installer Overhaul * **XAPK / APKP Support**: Fixed package parsing issues for APKPure `.xapk` and APKMirror `.apkm` by implementing ZIP central directory reads. * **Downgrade Logic Fixes**: Normal apps bundling nested helper APKs are no longer falsely flagged as system downgrades. * **Root Session Installer**: Surfaces real `pm` failure reasons instead of a generic shell exit 255. --- ## 🛠 Build & Dependencies * **Version**: Bumped to **1.92.0 (1920)** in `gradle.properties`. * **AGP & KSP**: Upgraded Android Gradle Plugin to `9.4.0-alpha04` and KSP to `2.3.10`. * **API Namespace**: Consuming Compose-free `thor-extension-api 3.0.0` from the new `com.trinadhthatakula` namespace. **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.82.3...v1.92.0
  • Jun 24, 2026 1.82.3
    # Thor v1.82.3 Release Notes This minor patch release resolves a backward-compatibility regression where system apps frozen/disabled by older versions of Thor could not be unfrozen. ## What's Changed ### 🐛 Bug Fixes & Stability Improvements * **System App Unfreezing Compat**: Fixes an issue where system apps disabled by older versions of Thor remained disabled when using the new unfreeze method (`pm install-existing`). The unfreezing logic now checks if the system app is in a disabled state (installed but not enabled) and enables it first (`pm enable` / `setAppEnabled`) before running the reinstall/unfreeze action. This fix is implemented across all privilege engines (Root, Shizuku, and Dhizuku).
  • Jun 22, 2026 1.82.2
    # Thor v1.82.2 Release Notes This major production release consolidates all changes from the **v1.82.x** cycle (v1.82.0, v1.82.1, and v1.82.2). It delivers a completely overhauled Freezer interface, a safer system app debloating/disabling strategy with Universal Android Debloater (UAD) integration, safety gating for system app freezing, a redesigned Portable Installer UI with split APK MIME associations, adaptive layout support, multi-language localization, and critical crash fixes. ## What's Changed ### ❄️ Freezer UI Overhaul & Safety Gating * **Horizontal Floating Toolbar**: Replaced the legacy Floating Action Button and top "Freeze All" option with a modern bottom horizontal floating toolbar containing **Freeze**, **Add**, and **Unfreeze** actions. * **App Filter Button Group**: Integrated a button group filter at the top of the Freezer and App List screens to instantly toggle between User and System apps. * **Unsafe Freeze Prevention**: Blocks freezing system packages classified as **Unsafe** by Universal Android Debloater (UAD) or if safety metadata fails to load.
    More…
    * **Expert Freeze Warning**: Displays a confirmation warning dialog before freezing system apps classified as **Expert**. * **Batch & Auto-Freeze Filtering**: Excludes unsafe system packages from batch freeze and auto-freeze processes (including `AutoFreezeManager`). ### 🛡️ Safer System App Disabling & UAD Integration * **User-Level Uninstallation**: Disabling/freezing system apps now uninstalls them for the current user (`pm uninstall --user current`) instead of using standard package disabling, making it fully compatible with modern Android versions across all privilege engines (Root, Shizuku, and Dhizuku). * **User-Level Restoration**: Enabling/unfreezing uninstalled system apps reinstalls them from the system partition (`pm install-existing`). * **Multi-User & Work Profile Support**: Dynamically retrieves the active user ID using `am get-current-user` to run commands under the correct active profile. * **UAD Safety Chips**: Shows recommendation badges (Recommended, Advanced, Expert, Unsafe) in headers, app details, and uninstall dialogs. * **Unsafe Package Blocker**: Uninstallation of system packages marked as **Unsafe** is strictly blocked (warning screen replaces confirmation with a close button) to prevent bootloops. * **Expert Package Warning**: Shows warning confirmation dialogs for **Expert** packages before allowing uninstallation. * **Local App Icon Caching**: Caches system app icons locally before uninstallation to keep them visible in list, grid, and details views. * **Danger Badge Indicators**: Displays a red danger icon badge over uninstalled system apps in lists and grids. ### 📦 Portable Installer Redesign & MIME Associations * **Redesigned UI States**: Overhauled the installation interface with clear, user-friendly states: **Installing** (pulsing icon, progress percentage), **UserConfirmationRequired** (loader & action prompt), **Success** (Done/Open actions), and **Error** (detailed error card). * **Metadata Caching**: Preserves application labels and icons across all installer state transitions. * **MIME Associations**: Associated `.apkm`, `.apks`, and `.xapk` (and wildcards) formats with the Thor installer. * **Polished Banners**: Improved readability of update/downgrade warning banners and badges. ### 📐 Adaptive Layouts & Navigation Polish * **Navigation Rail**: Implemented a vertical side navigation rail (`ThorNavigationRail`) for tablets and foldables. * **Independent Multi-Backstack**: Added independent backstack navigation for each top-level tab (Home, Apps, Freezer, Settings) with correct state preservation and custom back press handling. * **Viewport Optimization**: Hides navigation bars when navigating to detailed sub-screens and implements a split-details layout strictly for landscape phones. * **Backstack Safety**: Guarded all backstack pop operations with `size > 1` checks to prevent `NavDisplay` empty backstack crashes. * **Import Fix**: Updated Freezer's disabled apps import feature to completely skip all system apps. ### 🌐 UI Persistence & Localization * **Grid/List Layout Persistence**: Persists user layout mode preferences for App List and Freezer screens across app launches. * **Localization Support**: Added full localization support for new strings in Arabic, Spanish, French, and Chinese. ### 🐛 Bug Fixes & Stability Improvements * **Privileged Gateway Error Handling**: Prevented crashes when no privilege mode (Root/Shizuku/Dhizuku) is active by returning `Result` instead of throwing `IllegalStateException`. * **Button Group Crash Fix**: Resolved layout constraint `IllegalArgumentException` by removing `animateWidth` modifier from `ConnectedButtonGroup`'s toggle buttons. * **Explicit Broadcasts**: Made the Shizuku uninstall result broadcast intent explicit for improved security. * **Performance Improvements**: Optimized process stream handling and bypassed redundant cache operations. * **CI Upgrades**: Upgraded Ruby to 3.3 and migrated fastlane to Bundler.
  • Jun 18, 2026 1.81.8
    # Thor v1.81.8 Release Notes This release introduces major enhancements to app management, sharing, and project support. It features advanced Freezer filtering, direct APK/APKs sharing, centralized cache clearing options for root users, flavor-separated support developer channels, a redesigned dashboard community section, and critical bug fixes. ## What's Changed ### 🚀 Features & UX Enhancements * **User/System App Filter**: Added a User/System app toggle inside the Freezer Settings sheet using the custom `ConnectedButtonGroup` component to easily partition apps. * **Automatic Disabled Apps Import**: Automatically detects disabled apps outside the Freezer and prompts the user on first launch to import them. The prompt state is robustly marked as shown only when the user explicitly interacts (confirms, cancels, or dismisses) with the dialog. * **Settings Auto-Hide**: The "Import disabled apps" button in the Freezer settings sheet automatically hides if there are no disabled apps outside the freezer left to import.
    More…
    * **App Filtering & Selection Improvements**: Multi-select actions (like Select All and selection counts) on the Freezer screen now operate exclusively on the currently visible filtered apps. * **Direct APK & APKS Sharing**: Upgraded sharing behavior to share the actual base APK (or a packaged `.apks` zip with split APKs and standard `manifest.json` metadata) instead of a simple market link. * **Batch Sharing**: Added a Share option to the multi-select toolbar to share multiple app packages at once. ### 🧹 Cache Management (Root Users) * **Clear Cache Dashboard Option**: Added a clear cache option on the dashboard for root users, supporting custom selection between user and system app cache clearing with confirmation safeguards. ### 🛠️ Bug Fixes & Under-The-Hood * **App List Filtering**: Fixed the AppList screen filters where choosing an activity state (like frozen) could result in an empty list due to stale raw cache states. * **Dependencies**: Centralized build versioning (`compileSdk`, `targetSdk`, and `minSdk`) in `libs.versions.toml` and upgraded Maven dependency packages.
  • Jun 17, 2026 1.81.5
    ### Changelog Recent commits: 12aea08 fix(appList): use active filterType from uiState instead of stale _rawState
  • Apr 14, 2026 1.80.6
    ## ⚡ Thor v1.80.6 This is a major release bringing deep privilege controls, a full UI overhaul, multi-language support, and significant performance improvements under the hood. --- ### 🆕 New Features - **App Suspension Controls** — Suspend/unsuspend apps and restrict background activity directly from Thor - **Work Mode Privilege Selection** — Choose your preferred privilege backend: Root, Shizuku, or Dhizuku
    More…
    - **Multi-Language Support** — In-app language switcher with support for English, Chinese, French, Spanish, and Arabic - **App Search** — Search across app lists instantly - **App Data Clearing** — Clear app data without leaving Thor - **Fix Store** — Installer repair tool to resolve broken Play Store installer states - **Room DB Caching** — App metadata is now cached locally for near-instant app-list loading - **External "Open with..." Installer** — Choose any installer when sideloading APKs - **Custom Hidden-API Bypass** — Internal implementation replacing the third-party `AndroidHiddenApiBypass` dependency --- ### 🎨 UI / UX - Redesigned **Home**, **Freezer**, **Settings**, and **App Details** screens - New **Asgardian** static theme with optional Material You dynamic colors - Redesigned dashboard and navigation bar with smoother animations - Card-based settings layout - Updated icons throughout with Material 3 theme refinements - **AMOLED dark mode** now set as the default dark theme - App details now show suspension indicators and installer names --- ### ⚙️ Improvements - Faster app-list updates with broadcast-triggered refresh - ViewModel-driven app-type selection on the dashboard - Broader installer error handling and smarter installer selection logic - Improved privilege-mode fallback behavior --- ### 🐛 Bug Fixes - Fixed edge cases in privilege-mode fallback and related privilege-switching behavior --- > 💬 Found a bug or have feedback? Open an issue or reach us on Telegram. > ❤️ If Thor saves you time, consider leaving a review on the Play Store. ## Major Pull Requests * AndroidHiddenapiBypass to in house Bypass module by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/151 * Add Room database caching and external installer support by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/152 * UI Overhaul and feature upgrade by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/153 **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.71.7...v1.80.5 APK Size: around 4MB Play store download Size: 2.5MB
  • Apr 14, 2026 1.80.5
    ## ⚡ Thor v1.80.5 This is a major release bringing deep privilege controls, a full UI overhaul, multi-language support, and significant performance improvements under the hood. --- ### 🆕 New Features - **App Suspension Controls** — Suspend/unsuspend apps and restrict background activity directly from Thor - **Work Mode Privilege Selection** — Choose your preferred privilege backend: Root, Shizuku, or Dhizuku
    More…
    - **Multi-Language Support** — In-app language switcher with support for English, Chinese, French, Spanish, and Arabic - **App Search** — Search across app lists instantly - **App Data Clearing** — Clear app data without leaving Thor - **Fix Store** — Installer repair tool to resolve broken Play Store installer states - **Room DB Caching** — App metadata is now cached locally for near-instant app-list loading - **External "Open with..." Installer** — Choose any installer when sideloading APKs - **Custom Hidden-API Bypass** — Internal implementation replacing the third-party `AndroidHiddenApiBypass` dependency --- ### 🎨 UI / UX - Redesigned **Home**, **Freezer**, **Settings**, and **App Details** screens - New **Asgardian** static theme with optional Material You dynamic colors - Redesigned dashboard and navigation bar with smoother animations - Card-based settings layout - Updated icons throughout with Material 3 theme refinements - **AMOLED dark mode** now set as the default dark theme - App details now show suspension indicators and installer names --- ### ⚙️ Improvements - Faster app-list updates with broadcast-triggered refresh - ViewModel-driven app-type selection on the dashboard - Broader installer error handling and smarter installer selection logic - Improved privilege-mode fallback behavior --- ### 🐛 Bug Fixes - Fixed edge cases in privilege-mode fallback and related privilege-switching behavior --- > 💬 Found a bug or have feedback? Open an issue or reach us on Telegram. > ❤️ If Thor saves you time, consider leaving a review on the Play Store. ## What's Changed * AndroidHiddenapiBypass to in house Bypass module by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/151 * Add Room database caching and external installer support by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/152 * UI Overhaul and feature upgrade by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/153 **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.71.7...v1.80.5 APK Size: around 4MB Play store download Size: 2.5MB
  • Feb 28, 2026 1.71.7
    ## What's Changed * Shizuku and Dhizuku app installer Stability fix by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/131 * New Settings page by @trinadhthatakula in https://github.com/trinadhthatakula/Thor/pull/135 **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.71.4...v1.71.7
  • Feb 24, 2026 1.71.5
  • Feb 17, 2026 1.71.4
    # Thor v1.71.4 Release Notes This release brings significant power to the installer with **Dhizuku** integration, **App Downgrade** support, and native handling of split APK formats (`.xapk`, `.apkm`). We have also overhauled the App List and Home Screen performance for a smoother experience. ### 🚀 New Features * **Dhizuku Integration:** Full support for Dhizuku as a privileged installation mode. * Implemented `DhizukuSystemGateway` for handling installs, uninstalls, and force-stop operations. * Added `DhizukuReflector` for cache clearing and app state management.
    More…
    **Dhizuku implementation is still in testing** * **Advanced Installation Modes:** * Added **Root** and **Shizuku** installation modes alongside the standard Package Installer. * **Split APK Support:** Added native support for installing `.xapk`, `.apks`, and `.apkm` file formats. * **App Downgrade Support:** * You can now downgrade apps via Root, Shizuku, or Dhizuku modes (includes `-d` flag injection). * Added UI warnings when a downgrade is detected. * **Reproducible Builds:** Implemented reproducible build setup using `gradle.properties` as the single source of truth for versioning. ### ⚡ Performance & UI * **App List Optimization:** * Converted selection logic to `O(1)` lookups. * Offloaded heavy sorting/filtering to `Dispatchers.Default`. * Hoisted `ColorMatrix` in `AppIcon` to reduce rendering overhead. * **Home Screen & Freezer:** * **Batch Loading:** App scanning now emits updates in batches of 20 for faster initial UI feedback. * **Freezer:** Refactored `FreezerViewModel` to use `StateFlow` and optimized `init` blocks for faster navigation. * **Visuals:** Replaced size animations in charts with GPU-accelerated `graphicsLayer` transformations to prevent layout thrashing. * **Installer UI:** * New `SplitButton` and `DropdownMenu` for selecting installation methods on the fly. * Now displays `versionCode` alongside `versionName`. ### 🛠 Under the Hood & CI/CD * **Logging Overhaul:** Replaced standard `android.util.Log` with a project-specific `Logger` utility (Debug-only for Koin and App modules). * **Fastlane & GitHub Actions:** * Added specific lanes for `distribute_dev` (Internal Track) and `distribute_production`. * Automated GitHub Pre-releases for dev builds. * **Refactoring:** * Moved `ShellRepository` to `com.valhalla.superuser.ktx`. * Updated `HomeActivity` to explicitly handle `enableEdgeToEdge`. --- **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/v1.71.1...v1.71.4
  • Feb 16, 2026 1.71.3
  • Feb 14, 2026 1.71.2
  • Feb 13, 2026 1.71.1-foss
    ## What's Changed * Bug fixes and minor UI enhancements * Major CI/CD pipeline fixes ## New Contributors * @TangHanchen made their first contribution in https://github.com/trinadhthatakula/Thor/pull/102 **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/Thor_v1709...v1.71.1
  • Dec 29, 2025 1.70.9
    <h1>Thor v1.70.9 Release Notes</h1> <p>This update introduces persistent user preferences, major UI refactors for better usability, and significant performance optimizations for app list handling.</p> <h2><span>💾</span> User Preferences & Persistence</h2> <ul> <li> <span class="tag feat">[FEATURE]</span> <strong>Settings Persistence</strong><br> Your sorting order, filter selections, and UI toggles are now saved automatically. Thor remembers exactly how you left it. </li> <li>
    More…
    <span class="tag feat">[FEATURE]</span> <strong>Customizable Home</strong><br> Added the ability to dismiss the "Reinstall All" card from the dashboard. Your preference is saved permanently. </li> <li> <span class="tag refactor">[ARCH]</span> <strong>DataStore Integration</strong><br> Implemented a robust <code>PreferenceRepository</code> using AndroidX DataStore to manage app configuration cleanly and reactively. </li> </ul> <h2><span>⚡</span> Performance & Stability</h2> <ul> <li> <span class="tag perf">[CORE]</span> <strong>Reactive Repository</strong><br> Refactored the app engine to listen for system broadcasts (install/remove/update) in real-time. The app list now updates automatically without manual refreshes. </li> <li> <span class="tag perf">[OPTIMIZE]</span> <strong>Debounced Updates</strong><br> Implemented smart debouncing logic to prevent lag during batch operations (like freezing multiple apps). The UI now updates smoothly once the system settles. </li> <li> <span class="tag fix">[FIX]</span> <strong>Bottom Sheet Crash</strong><br> Resolved a crash in <code>AppInfoDialog</code> related to layout offset calculations by stabilizing the bottom sheet state. </li> </ul> <h2><span>🎨</span> UI Redesign & Polish</h2> <ul> <li> <span class="tag ui">[STYLE]</span> <strong>Modern Dialogs</strong><br> Redesigned the App Info Dialog with a cleaner header, tonal action buttons, and better organization of standard vs. root actions. </li> <li> <span class="tag ui">[UX]</span> <strong>Improved Multi-Select</strong><br> Overhauled the floating multi-select toolbar with a horizontal layout, clearer icons, and smoother animations when selecting items. </li> <li> <span class="tag ui">[UX]</span> <strong>App List Refinements</strong><br> Updated the App List styling with better padding, refined search bar interactions, and a new tab-based filter/sort sheet. </li> </ul> <div class="concise-box"> <h2>📝 Play Store "What's New"</h2> <ul> <li><strong>Saved Preferences:</strong> Thor now remembers your sort order, filters, and dashboard settings.</li> <li><strong>Smart Updates:</strong> The app list auto-refreshes instantly when you install or remove apps.</li> <li><strong>Batch Performance:</strong> Smoother experience when freezing or modifying multiple apps at once.</li> <li><strong>UI Polish:</strong> Redesigned app info dialogs and selection toolbars for better usability.</li> <li><strong>Customization:</strong> Option to hide the "Reinstall All" card from the home screen.</li> </ul> </div> <footer> <p>&copy; 2025 Valhalla Labs. Built with ❤️ using Jetpack Compose & Koin.</p> </footer> **Full Changelog**: https://github.com/trinadhthatakula/Thor/compare/Thor_v1707...Thor_v1709