Dev Build v1.96.0
Pre-releaseThor 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,
v1.95.1,
v1.95.2, and
v1.95.4.
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, #381, #385, #389, #412, #413
- The Home Backup & Restore Hub scans
Downloads/Thor, MediaStore, and the configured SAF
directory for.thorbak,.xapk,.apks, and.apkfiles 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
.thorbakthrough Install from file or
a supported external file-manager intent routes to the restore sheet. - Offline
.thorbakbackups 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, #453, #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
.thorbakjust 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, #461, #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, #378, #389, #453, #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, #436, #439, #440, #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, #418, #420, #421, #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, #415, #437, #438, #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, #446, #451, #464, #466, #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, #417, #419, #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'spm grantcall 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, #383, #395, #397, #398, #400, #420, #434, #438, #439, #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,
#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,
#443,
#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,
#428,
#433,
#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;
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,
#471,
#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
.omodirectory (#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:
./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
MissingTranslationor
SyntheticAccessorfindings, and nine Hint findings each. Explicit:bypass:lintDebugand
:bypass:lintReleasechecks 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.
496fa740docs(web): stop telling users Dhizuku destroys system-app data56294b15docs(web): name the user argument in the fallback command5e4618f4docs(web): the API 37 refusal is uid-0-only, not shell-only560f9617feat(web): sync web landing page, downloads hero, themes, SEO & GEO to master for production deploymentb5ddd4c4fix(deps): resolve Dependabot security alerts for nanoid and ruby jsond086c11afeat(web): sync web layer, enhance llms.txt and robots.txtab4198c7feat(web): add IndexNow protocol support and automated submissionca6f6c42fix(web): add 10s timeout to IndexNow and verify staged deployment directory1d2bf9c6fix(apps): restore package visibility and app list fetching on fresh installsb6044de4fix(permissions): synchronize SelfPermissionGranter and privilege events with AppRepository rescans1f70dfb8fix(permissions): grant Chinese OEM AppOps and fallback package flags on visibility collapsee2d71218fix(privileges): invalidate non-root Odin shell cache on refresh and add in-app Dhizuku grant supportff6851a6feat(privilege): add PrivilegeManagerApp registry and dynamically show installed managers560ba578fix(privileges): add in-app Shizuku grant request and remove FLAG_MOUNT_MASTER to fix KernelSU/APatch root acquisitionccd2aba3fix(home): reactively trigger data reload and scan bump on privilege state changes01323101fix(activity): re-probe privileges on activity onResume to auto-acquire root grants1489c9b4fix(app-list): resolve sort and filter touch conflicts in bottom sheetf31f52f9fix(app-list): scroll list and grid to top on sort, filter, or search changeb83fb664fix(review): address CodeRabbit review feedback on gateways, cache sync, privilege registry, and freezer scroll8ffb5ee4fix(review): address self-review findings on PR #41743630a15fix(customization): pin the action preview above the scrolling list60f341dffix(customization): rework drag-and-drop, a11y and header layoutce4048d6fix(visibility): stop gating GET_INSTALLED_APPS app-ops on the pm grant exit code070fc5c7fix(review): close the scan-revision window opened by drop(1)7829c618fix(i18n): make the language picker sheet scrollabled5d4c1e0fix(backup): stop stranding staged copies in /data/local/tmp on cancellation8020e7f7fix(visibility): close the GET_INSTALLED_APPS app-op on revoke5406c046fix(backup): sweep the staging directory under both rootsdae9f613fix(app-info): dismiss the sheet when opening the permissions screena86409aaperf(backup): stop copying whole archives to draw a 44 dp icon41779d87fix(backup): report a delete the volume refused679c19fafix(customization): three ways a reorder drag came apartdb45cb6ci18n(pt-BR): Brazilian wording for the Backup Hub strings1005dbc2test(scan): make the cache-policy tests able to fail77f9386cfix(web,tools): three quiet wrong answers2fb42af4fix(visibility): report the gate that actually opened, not just for self683b9b9ffix(reorder): key each drag delta to the gesture that owns it4896c5b2fix(analyzer,icons): bound the two copies that had no ceiling947aad47docs(i18n,web,tools): three wordings that said the wrong thing66bc3a32fix(restore): bound the third copy out of an untrusted archive0d35576ffix(icons): make the pixel ceiling hold for a one-pixel axis32ca102cfix(visibility,restore,tools): three logs that misreport what happened02e5363cfix(icons,visibility): correct two claims the verification pass refuted0bf9b212fix(restore,reorder): three regressions this branch introducede3b99cd5fix(backup): measure the staging volume the tar will actually use12f215cefeat(app-info): tap the icon to open an app, long-press for its settingse34915d3fix(app-info): the glow ended in a straight line, not a fadee6e35873fix(glow): derive the header glow's margins instead of hand-tuning themb6991044fix(store): re-vendor the live Shizu schema and rename ad -> has_adsdc997e65fix(store): restore Shizu listing validity and fill the developer profiledb51f0e4feat(store): fill the Shizu developer profile and the app website slotaef0f20dchore(release): bump version to 1951 (v1.95.1) and add release notes71b33dd9chore(deps): bump the web group in /web with 3 updates91f5f784chore(deps): bump github/codeql-action in the actions group0541d937chore(deps): bump gradle-wrapper from 9.7.0 to 9.7.1 in the maven group61ab1ec6chore(shizu): sync store changelog to v1.95.10bd1369efix(installer): make the Shizuku and Dhizuku silent-install rungs actually work583198affix(backup): format the archive date in the app locale4d038c1adocs(installer): correct two overstated claims and one overstated test535e7c9fdocs(installer): say what actually exempts the shell from Android/dataf8408b48docs(components): design spec for per-component control in App Info3104018efeat(components): open, force-open, stop and disable individual componentscf19a134fix(components): read stopservice's verdict from stderr, not its exit code06781eacfix(components): rank failure markers by usefulness, not by line ordere7090e42fix(components): a dead transport is not a stopped service6ed95a38fix(components): answer the three review findings on the disable path037aaa3cfix(components): the session-consent box says whether it is ticked60cc4daffix(components): give the consent row back the 48dp the null handler gave upe0ed3f76fix(freezer): a watchlist write that fails must not take the processb8acbf0afix(freezer): the review follow-ups PR #437 left behindab029f94fix(uitext): make a leaked UiText legible and kill the obfuscated toast84422d9ddocs(components): document per-component control, and correct the spec's scope73c81259docs(components): Restore all is cross-app, not device-wide8b6382b0docs(components): say which rows a partial Restore all leaves behindde4119e3chore(lint): pin SyntheticAccessor in :app, and correct what it is worth6517660dfix(strings): a partial Restore All must not claim the rest are offdfd1a8b0docs(follow-ups): exact lint id, and every source set the :app fix touchedda6ce9c9chore(release): 1952 (v1.95.2) — per-component control, and a 20-release cap on this directory7b4419c1chore(release): translate the Hindi changelog, and time the pruning check right5349aaebdocs(release-notes): a placeholder nobody can run is worse than an example9e8611d2fix(installer): make the install-time permission grant opt-in4fc55d3ffeat(installer): let the user answer the permission grant per install35c21e2ai18n(settings): say which installs the permission grant reaches5c0f63fffix(installer): clear the per-install grant answer when a new package is parsed092050c9docs: record worker shell lane design6b150603fix(freezer): terminate bulk progress on cancellation7333706dtest(freezer): assert outer cancellation job7425be97chore(deps): bump the maven group with 3 updatesbf6b12b5feat(privilege): define execution lane contractsdb8184f7feat(privilege): coordinate package mutations4855a78bfix(privilege): make package lease handoff atomic2c1330a8feat(root): own isolated archive and sweep shells45c278bdfix(root): harden isolated Odin shell ownership53960f49fix(root): distinguish cancellation from command timeout3d7f9c63feat(root): route commands across three lanes41b195b2fix(root): make MainShell submission atomic49d7c8f2fix(root): handle MainShell acquisition failuref82507aerefactor(root): centralize privileged command routing042849barefactor(root): centralize privileged command routing93649881refactor(root): centralize privileged command routinga4ae5e37refactor(root): centralize privileged command routing4d7a6381test(root): cover concrete execution boundaries428d4e4dfix(archive): isolate root commands from interactive work97aa3817fix(archive): preserve force-stop execution metadatab30d7e64chore(deps): bump the web group in /web with 3 updates152e4618chore(deps): bump the actions group with 2 updates9aa77b03feat(sweep): persist durable request snapshots2ae1df2bfeat(sweep): enqueue and observe durable requests8e01e7d5fix(sweep): expose durable request discoverye44b1e94chore(deps): bump the maven group with 5 updates6b56bf74fix(backup): preserve enqueue handoff before background7cd21db0fix(archive): access private data through archive shellf55a4981fix(sweep): preserve enqueue and source observationbe5fb3a2feat(sweep): cancel the durable queue safelyd588143etest(room): enable migration foreign keys756700c6feat(sweep): execute durable privilege sweeps446c7fbbfix(privilege): exclude broker authorization self-grants61c8a888feat(sweep): migrate bulk freeze actions to WorkManager890bbf31fix(sweep): retain durable profile identityeca4eb74feat(sweep): render durable progress statesd6717b8bfix(sweep): prefer newest retained profile request0844212dfeat(sweep): add replay-safe cache and reinstall actions34f67e1efix(sweep): reject failed reinstall path lookups5479b643fix(deps): restore Asgard Material3 compatibility9ddcaa94docs(workers): document shell lanes and sweep statesce7e5895test(sweep): avoid restricted WorkManager states2fa5b714test(sweep): align dialog lifecycle assertions26fe6af0feat(archive): authenticate schema v2 manifestsce2b9fa0feat(archive): authenticate bundle bytes13d50cc7feat(archive): verify staged APK clusters7969ea37feat(archive): roll back unsafe new installs385b9bf5feat(archive): refuse unauthenticated restores7e07a2e9fix(archive): harden authenticated restore flow9671462cfix(archive): close install cancellation gapd516a54ddocs: record worker lane acceptance evidence41830645fix(root): drain cancelled interactive MainShell work23c4677cdocs: finalize worker lane acceptance evidence60dc074efix(web): exclude internal lane architecture page591c96ecfix(privilege): serialize root availability probesc1c4fe29docs(workers): capture service queue latency baselinec08bc4c4fix(ui): remove release latency draw hooksa70daf65feat(queue): define durable task contracts5ab628bffix(queue): validate durable task contractsc057ceeafix(queue): harden presentation argumentsc147f04dfeat(database): add complete durable queue schemae18762c8fix(database): harden durable task recovery0a8fbf8efix(database): require explicit recovery livenessc7f37826test(database): prove final drain writer contention148265defeat(database): add sweep target claim transactions1d70dd69fix(database): harden sweep claim recoverye1902e28fix(database): reject partial sweep ownershipb84dabe3fix(database): fence malformed sweep targets3fddfa47fix(database): validate sweep ownership tokens9e662f48fix(database): align sweep runnable detection6462fe90feat(queue): add durable data task acceptance5667f97cfix(queue): preserve keys after accepted cancellation0a8f5422refactor(backup): extract archive task runners5cee7b2fchore(deps): bump io.coil-kt.coil3:coil-compose in the maven group7e4ea876fix(backup): harden archive task recovery70be7af0refactor(export): add resumable data task runners8c49785ffix(export): reconcile durable publicationsb75964fcfix(export): fence durable publication leases33265150feat(service): add typed foreground prerequisites77b93451feat(service): activate durable data queuee8e7d98efix(service): harden data queue ownershipa4bd12dafix(service): fence data queue generationsf4f5a2bdfix(service): complete data queue fencing76f87280fix(service): close data queue recovery gaps67672a0dfix(service): settle exact data claims9be7d51afix(service): finish recovered data claimse76894e8fix(service): close data recovery racesb6efdb3cfix(service): preserve data recovery completiona0afd1abfix(service): retry inherited data recoveryb088330fchore(deps): bump the web group in /web with 4 updates17c75f05chore(deps): bump softprops/action-gh-release in the actions groupd535d3f5fix(service): gate inherited recovery retry3b7ca931feat(sweep): recover durable target state9a108824fix(sweep): preserve legacy work identity72fa4cf7feat(sweep): activate foreground service queuee5b80b5brefactor(workers): isolate compatibility execution0fc62497feat(queue): project durable task history81e7e73ffeat(queue): add task queue screenbaac6038feat(queue): add task detail logger1fe31820feat(queue): navigate to durable task details8efa11a7feat(share): queue durable share preparation and retentionba9f8281fix(share): reclaim cancelled and recovered share outputscc67ad66fix(queue): render localized progress and cancellation notificationsc8da3fb3chore(build): retain Studio AGP alpha04 update92e7d476docs(queue): record service migration and remaining acceptance gatesb4d3328bdocs(queue): record PR publication and final review gate93439274fix(test): avoid recursive source-sanitizer overflowd1eda765chore(web): update fast-uri to patched 3.1.798be2f6cdocs(queue): record CI corrections and review recoveryfd8b97c9fix(queue): harden task ownership, export publication and UI lifetimes25ffb74edocs(queue): record CI acceptance and bounded emulator measurements45bf8b24fix(queue): consolidate pending logs and space task controls225fce86feat(queue): add Guardians branding and operation iconseada3844chore(deps): bump the maven group across 1 directory with 2 updates1f6e8a7afix(export): reset sheet state after task navigation37831981fix(root): use mount-master for sweep cache operationscb1068d5chore(queue): remove acceptance probes and stabilize Back test8bc360d6docs(queue): reconcile physical and emulator validation9e65c745chore(deps): bump svgod3e8d418chore(web): sync Astro and js-yaml updates from master99ddd6acfix(deps): pin Material3 to the Asgard-compatible runtime634da1bafeat(installer): add legacy APK consent and readable settings95ba6770docs(community): record feature assessment and validation statusd91378d3docs(installer): clarify disposable smoke-test emulator9ed5a4d8feat(app-list): confirm bulk actions and improve task progressa629b0aefix(i18n): describe queued suspend and unsuspend actionsf5ad6f70chore(release): prepare v1.95.4 notes and metadatabd2d8c8afix(uninstall): sequence standard dialogs for batch fallbackdf4fff56chore(deps): update Kotlin and Android libraries825408eerefactor(kotlin): use stdlib ordering and hex encodinge5b61192refactor(kotlin): use explicit backing field for installer events22949711docs(perf): record emulator profiling resultsa691b773fix(build): increase Kotlin compiler heap for release buildsaa58f5b2feat(i18n): add English and Arabic legacy Fix Store guidanceb6aa4c3ffeat(i18n): translate legacy Fix Store guidance to Spanish and French67fa5df9feat(i18n): translate legacy Fix Store guidance to Polish and Portugueseb9e6dc22feat(i18n): translate legacy Fix Store guidance to Brazilian Portuguese and Chinesed4a1d4fafeat(installer): define version-aware Fix Store routing8db86e2ffeat(installer): verify legacy reinstalls and reject split APKsb83e7521fix(installer): track legacy install requests across lifecycle changesf3da333dfix(dhizuku): reject unsupported silent Fix Store operations1637179afix(ui): support readable logs and neutral completion states933f4a7dfeat(installer): integrate safe user-confirmed legacy Fix Storeae74c03efix(app-list): forward reinstall requests through shared routingd44b0894feat(ui): expose legacy Fix Store without elevated access6bbcb793docs(installer): document legacy Fix Store compatibility limits6e55aca3chore(deps): bump fastlane from 2.238.0 to 2.239.0 in the fastlane group59689621chore(deps): bump the web group in /web with 3 updatesc19b46a5chore(deps): bump the actions group with 2 updatesc2965493fix(installer): remove legacy Fix Store fallback6b4e562afeat(settings): add Asgard and system font presetsec5e010ffix(installer): show feedback while preferences load6748bb8ffix(lint): remove synthetic accessors and enforce the check
Changes after the 1950 release: v1.95.0-dev-40...f7bb000
Including the development cycle consolidated into 1950: v1.94.0...f7bb000