Third-party Morphe patches for SonyLIV, Nutrilio, Threads, Arrow Puzzle, CrazyGames, JioHotstar (TV), Vi Movies and TV (TV) and JioTV+ (TV).
A set of patches that modify these apps at the bytecode/resource level, applied with Morphe (a fork of ReVanced). These patches are an independent project and are not affiliated with Sony, SonyLIV, Nutrilio, Meta, Threads, Instagram, ReVanced, or the Morphe project.
| App | Package | Tested version | Notes |
|---|---|---|---|
| SonyLIV | com.sonyliv |
6.23.1 (Android TV / leanback) |
Media3 (ExoPlayer) |
| Nutrilio | net.nutrilio |
1.20.2 (phone) |
split APKS bundle |
| Threads | com.instagram.barcelona |
434.0.0.41.74 (phone) |
Instagram codebase; split APKS bundle |
| Arrow Puzzle | com.easybrain.arrow.puzzle.game |
1.7.0 (phone) |
Easybrain Unity game; single universal APK |
| CrazyGames | com.crazygames.crazygamesapp |
1.6.7 (phone) |
Capacitor (Ionic) WebView portal; single universal APK |
| JioHotstar | in.startv.hotstar |
26.06.22.3 (Android TV) |
leanback split bundle (.apkm); heavily R8-obfuscated |
| Vi Movies and TV | com.vimtv |
10.8 (Android TV) |
YuppTV OTT; leanback split bundle |
| JioTV+ | com.jio.media.jiotvplus |
2.6.4_2076 (Android TV) |
PatchWall UI; leanback split bundle |
| Patch | What it does | Status |
|---|---|---|
| Remove video ads | Forces PlayerUtil.isAdEnable() to false so the player neither requests nor plays ads. Removes client-side (Google IMA) ads. |
β Applies cleanly; pending on-device confirmation |
| Auto skip intro and recap | Automatically skips intro, recap and song segments as soon as the "Skip" button would appear, without waiting for a tap. | β Applies cleanly; pending on-device confirmation |
| Auto-skip Up Next | Plays the next episode immediately when the "Up Next" card appears, skipping the auto-play countdown. | β Applies cleanly; pending on-device confirmation |
| Hide promo banners | Hides the CleverTap-driven subscribe/premium promo banners and promo trays on the home screen. Content rows and CleverTap pop-ups/overlays are unaffected. | β Applies cleanly; pending on-device confirmation |
| Suppress geo / VPN block | Downgrades the geo / "VPN detected" block to a generic error so the dedicated block screens aren't shown. Does not grant access β geoblocking is server-side by IP; a valid in-region (India) connection is still required. | β Applies cleanly; pending on-device confirmation |
| Disable AppsFlyer tracking | Disables AppsFlyer attribution and event tracking by forcing isAppsFlyerSupported() to false. |
β Applies cleanly |
| Disable Firebase tracking | Disables Firebase Analytics, Crashlytics and Performance collection via manifest flags. Push notifications are unaffected. | β Applies cleanly |
| Disable forced update | Removes the forced ("immediate") and optional ("flexi") "update available" popup shown on the home screen. | β Applies cleanly |
| Change app name (opt-in) | Renames the app shown under the launcher icon. Editable in patch options (App name, pre-filled Sony LIV). |
β Verified |
| Change package name (opt-in) | Renames the package so the patched app installs alongside the original, rewriting provider authorities. Editable in patch options (Package name, pre-filled com.sonyliv.chiggi). |
β Verified |
All patches are verified to resolve and apply against com.sonyliv 6.23.1 using morphe-cli.
Runtime behaviour should still be confirmed on a device.
- Ads on live content β "Remove video ads" disables the client-side (Google IMA) ad path. SonyLIV also uses server-side ad insertion (AWS MediaTailor / VisualOn SSAI) for some live streams; ads stitched into the video server-side cannot be removed by a client patch and may still appear on live content.
- CleverTap is intentionally not disabled. It is dependency-injected and drives in-app overlays / native-display UI, so disabling it would crash parts of the app. "Disable analytics" here covers AppsFlyer and the Firebase stack only.
| Patch | What it does | Status |
|---|---|---|
| Unlock Plus | Forces the premium gate (PremiumModule.t2()) to true, unlocking all Nutrilio PLUS+ features (custom colors, all charts, app lock, all tracking options). Client-side only; does not grant a real Google Play subscription. |
β Applies cleanly; pending on-device confirmation |
| Disable analytics | Disables Firebase/Google Analytics, Crashlytics and Performance via manifest flags and removes the advertising-id (AD_ID) permissions. Push notifications are unaffected. |
β Applies cleanly |
| Add food search bar (opt-in) | Adds a live search box below each meal-time header in the day/meal form; typing filters that meal's food chips. Filtering only hides chips, so already-added items stay added. | β Applies cleanly; pending on-device confirmation |
| Local backup & restore (on by default) | Adds a native Local backup & restore row to the Backup screen (above Restore Backup) that opens Nutrilio's built-in (normally hidden) local file backup/restore. There you can export everything β all entries, images and settings β to a portable .nutrilio file (a ZIP) via the share sheet, and restore one from a file you pick. No Google account or premium needed. |
β Applies cleanly; pending on-device confirmation |
| Change app name (on by default) | Renames the app to Nutrilio Morphe (editable in patch options). | β Verified |
| Change package name (on by default) | Renames the package to net.nutrilio.morphe so it installs alongside the original (editable in patch options). | β Verified |
- Version β pinned to
1.20.2. A null ("any") version is rejected by Morphe Manager (it makes the whole source fail to load), and Nutrilio is R8-obfuscated, so the two bytecode patches (Unlock Plus, Add food search bar) only verifiably resolve on1.20.2. They are hardened (Unlock Plus anchors on a stable backend string instead of the obfuscated method name; the search bar resolves resource ids by name at runtime) to tolerate minor drift, but a different version may need re-fingerprinting. - Add food search bar is the most update-fragile patch (it hooks the obfuscated form adapter) and is off by default so it can never block the other patches.
- Local backup & restore reuses Nutrilio's own backup engine, so the file it produces keeps the
.nutrilioextension (it is a ZIP internally) β keep that extension or restore won't recognise it. This is a local file backup; Google Drive auto-backup is separate and needs Google Sign-In, which does not work on a re-signed/renamed build (the OAuth client is bound to the original signature and package), so Drive backup is effectively unavailable on the patched app.
| Patch | What it does | Status |
|---|---|---|
| Hide ads | Hides sponsored posts and injected "suggested"/netego units from the feed via two hooks: marks every media as organic (Media.DED() β false, covers server-inline ads) and blocks the feed ad-injection scheduler (BarcelonaSpoolFeedCacheHandler β no inject, covers injected ads). Client-side only. |
β Applies cleanly; pending on-device confirmation |
| Remove AD_ID permission | Removes the advertising-id (AD_ID / ACCESS_ADSERVICES_AD_ID) permissions so the device ad id can't be read. Does not disable Meta's core analytics. |
β Applies cleanly |
| Change app name (on by default) | Renames the app to Threads Morphe (editable in patch options). | β Verified |
| Change package name (on by default) | Renames the package to com.instagram.barcelona.morphe so it installs alongside the original (editable in patch options). | β Verified |
- Version β pinned to
434.0.0.41.74. Threads is built from the heavily R8-obfuscated Instagram codebase, whose class/method names shift on nearly every Meta release; the Hide ads hooks are anchored on stable named classes but a different version may still need re-fingerprinting. - Account / integrity risk β Threads is a Meta account app. Re-signing and renaming the package can trip Play Integrity / Meta app-attestation, which may cause feed-refresh failures, forced logout, or account action. Test on a secondary account first. If login breaks, disable Change package name.
- Analytics β Threads uses Meta's own telemetry (analytics2 / OneFabric), not Firebase, so there
is no manifest flag to flip; only the
AD_IDpermission is removed. - Scope β Hide ads forces the global isAd predicate false, so it also suppresses ad treatment on non-feed surfaces (e.g. reels). Server-side fetching of ads is unchanged; the patch only refuses to surface them.
| Patch | What it does | Status |
|---|---|---|
| Remove ads | Removes all ads (banner + interstitial + rewarded) by neutering the UnityβAndroid ad facade (com.easybrain.ads.unity.AdsPlugin): availability/show booleans return false, banner shows are no-ops, banner height is 0. One named chokepoint covers every mediation network (ironSource/AppLovin/AdMob/Pangle). |
β Applies cleanly; pending on-device confirmation |
| Disable analytics | No-ops Easybrain analytics event upload (AnalyticsPlugin.AnalyticsSendEvent + the central AnalyticsController collector). SDK init is left intact so ad removal stays stable. |
β Applies cleanly |
| Remove AD_ID permission | Removes the advertising-id + Ad Services (Privacy Sandbox) permissions. | β Applies cleanly |
| Change app name (on by default) | Renames the app to Arrow Puzzle Morphe (editable in patch options). | β Verified |
| Change package name (on by default) | Renames the package to com.easybrain.arrow.puzzle.game.morphe so it installs alongside the original (editable in patch options). | β Verified |
- Unity game β gameplay is native (IL2CPP), but ads + analytics run on the Android/DEX side via the Easybrain SDK, which is where these patches apply.
- Removing all ads removes rewarded ads too β watch-to-earn rewards (coins/hints) no longer work, by design.
- Native anti-tamper β the game ships
libsigner.so/libpglarmor.so; a re-signed + renamed package may trip a native integrity check. If the app crashes or closes on launch, disable Change package name (and test the unrenamed build). - Version β pinned to
1.7.0. The ad/analytics JNI facades (AdsPlugin/AnalyticsPlugin) keep stable names, but the central analytics collector is obfuscated and may need re-fingerprinting on updates.
| Patch | What it does | Status |
|---|---|---|
| Bypass Play license check (on by default) | Neuters Google Play's Automatic Integrity Protection (PairIP) license check (com.pairip.licensecheck.LicenseClient) that, on a re-signed/sideloaded build, redirects the app to the Play Store ("get it on Google Play"). Required for the patched app to open. |
β Applies cleanly; pending on-device confirmation |
| Remove ads | Neuters the native Capacitor AdMob plugin (com.getcapacitor.community.admob.AdMob): no video plays for interstitial or rewarded ads β the show methods instead fire the ad's lifecycle events (Showed/Dismissed, or Reward/Dismissed) so the game's loading overlay dismisses and rewarded ads still credit their reward; banners never display. One named chokepoint covers AdMob and its Pangle / Audience Network mediation. |
β Applies cleanly; pending on-device confirmation |
| Disable analytics | Stops native Sentry crash/telemetry upload by neutering the Capacitor Sentry plugin's native init (SentryCapacitor.initNativeSdk). Firebase auth, ConfigCat and push are unaffected. |
β Applies cleanly |
| Remove AD_ID permission | Removes the advertising-id + Ad Services (Privacy Sandbox) permissions (AD_ID, ACCESS_ADSERVICES_*). |
β Applies cleanly |
| Change app name (on by default) | Renames the app to CrazyGames Morphe (editable in patch options). | β Verified |
- Play Automatic Integrity Protection (PairIP) β CrazyGames ships with Google Play's PairIP licensing guard, which redirects any non-Play / re-signed install to the store. Bypass Play license check is required and on by default; without it the patched app won't open. This build has no PairIP code-virtualization (VMRunner), so neutering the license check is safe.
- Capacitor WebView app β most of CrazyGames is the remote Next.js portal (
app.crazygames.com) rendered in a WebView. These patches only touch the native ad/telemetry shell. - In-page web video ads remain β the pre/mid-roll ads shown inside a game come from CrazyGames' servers as web content, not the native ad SDK, so they are not in the app bytecode and cannot be removed here. "Remove ads" kills the native interstitial/banner/rewarded layer only.
- Auto-reward is client-side β the rewarded bypass fires the reward listener event the web grants on. If CrazyGames adds server-side reward verification, the reward simply won't be granted (no crash).
- Package kept β the package is not renamed, so Google/Facebook/Apple sign-in keeps working. The patched app installs over / conflicts with the Play Store version rather than alongside it.
- Native anti-tamper β the app ships ByteDance Pangle's
libpglarmor.so/libsigner.so; a re-signed APK may trip a native integrity check (best case Pangle silently no-fills, worst case a launch crash β untested). - Version β pinned to
1.6.7. The AdMob/Sentry plugin classes and method names are stable, but the Capacitor helper classes (PluginCall/JSObject/resolve) are R8-obfuscated, so the injected bytecode is version-specific.
Android TV build (in.startv.hotstar, leanback), supplied as the .apkm split bundle.
| Patch | What it does | Status |
|---|---|---|
| Bypass proxy/VPN security block (on by default) | Defeats the "Something is interfering with your secure connection" (NET_201) screen shown on a VPN. The app self-enforces a server-sent proxy verdict (X-Hs-SetProxyState) via the ProxyStateInterceptor; this neuters the handler that stores that verdict (client stays "unblocked") and the periodic proxy-state refresh coroutines that otherwise re-fetch endlessly and make the app lag. |
β Device-confirmed (India VPN works, playback OK) |
| Remove ads | Clears the SSAI ssaiTag in the AdMetadata constructor so the client requests a clean, non-ad-stitched stream (removes mid/pre-roll), and hides the home masthead banner render. |
β Applies cleanly |
| Spoof device-integrity self-report | Forces the securityLib checks (VPN/proxy/root/debugger/ports/files) false so the attestation the app sends looks clean. |
β Applies cleanly |
| Spoof device attestation | Forces all 8 security flags in the attestation blob (Kg/b) β including IsTampered (from the native tamper checker, which the self-report patch above does NOT cover) β to false at the constructor. The re-signed build otherwise sends IsTampered=true, which flags the account and locks it 24h (error NM-4290). |
β Applies cleanly |
| Disable analytics / Remove AD_ID | Firebase flags off (CleverTap left intact) + strips AD_ID/AdServices perms. | β Applies cleanly |
| Premium unlock (UI) | MyPageData.getIsSubscribedβtrue, DownloadInfo.getIsPremiumβfalse, subscription nudge suppressed. UI only β real content stays server + Widevine gated. |
β Applies cleanly |
| Enable screenshots / screen mirroring / all codecs+4K / HDR10 | FLAG_SECURE off (UI only), multi-display block relaxed, codec/HDR capability checks forced on. | β Applies cleanly |
| Change app name (on by default) | Renames to JioHotstar Morphe (package kept). | β Verified |
β οΈ Account-ban risk β JioHotstar does server-side fraud analysis. Re-signing + VPN + these client patches got a real account locked 24h for "suspicious activity" (NM-4290) because the attestation blob was sendingIsTampered=true. The Spoof device attestation patch fixes that client-sent signal, but the server still sees your VPN exit IP and an already-flagged account stays on their radar. Do not run this on an account you cannot afford to lose β test on a throwaway Jio number first. For a real/paid subscription, use the official app.- VPN bypass is novel β it is not in any public reference set; the block is client-enforced off a server verdict, so neutering the client store defeats it. If JioHotstar adds pure server-side IP playback enforcement in future, this could stop working.
- Flagged VPN exit IP β if the security error or a lock appears, the specific VPN server's IP is likely blocklisted; switching to a different (ideally residential/dedicated) India IP clears it. Multiple apps breaking at once on the same VPN = flagged IP, not a patch fault.
- Corner brand watermark cannot be removed β it is forensic/stream-baked (server-side), not a client render.
- Signature bypass not needed / not ported β the re-signed build already plays, and the reference
getSignFromJNItamper hook does not exist in this version. - Ad approach credited to Paresh-Maheshwari (GPL-3.0) for the premium/screenshot/mirroring/codecs/HDR hooks.
Android TV build (com.vimtv, YuppTV OTT). No anti-tamper/VPN β clean re-sign.
| Patch | What it does | Status |
|---|---|---|
| Remove ads | Forces AdUrlResponse.getAdUrlTypes()βnull and TorcAiAdConfig.isAdEnabled()βfalse, so the player builds no IMA/SSAI ad-tag URL and no pre/mid-roll ad loads. |
β Applies cleanly |
| Disable analytics / Remove AD_ID | Firebase flags off (CleverTap left) + strips AD_ID/AdServices perms. | β Applies cleanly |
| Change app name (on by default) | Renames to Vi Movies and TV Morphe (package kept). | β Verified |
| Premium unlock (UI) | Forces client isSubscribed flags true. UI only β content stays server + Widevine gated (may show items as available that the server still refuses). |
β Applies cleanly |
Android TV build (com.jio.media.jiotvplus, PatchWall UI). No anti-tamper/VPN β clean re-sign.
| Patch | What it does | Status |
|---|---|---|
| Remove ads | Neuters JioAds display/banner ads (JioAdView.loadAd/cacheAd) and all player video ads β pre/mid/post-roll + SSAI stitch β by no-oping VMAPAdsHelper.fetchAds. |
β Applies cleanly |
| Disable analytics / Remove AD_ID | Firebase flags off (CleverTap left) + strips AD_ID/AdServices perms. | β Applies cleanly |
| Change app name (on by default) | Renames to JioTV+ Morphe (package kept). | β Verified |
- No premium patch β JioTV+ has no client paywall flag (the
isPremiumfield is ad-request telemetry). Content is server-entitlement + Widevine gated, so there is nothing client-side to unlock.
These patches are distributed as a .mpp bundle for Morphe Manager.
- In Morphe Manager β Patch bundles β Add β Enter URL, paste the raw
patches-bundle.jsonURL (this is the source URL the Manager expects β not the repository URL):https://raw.githubusercontent.com/durgesh0505/chiggi_morphe_patches/refs/heads/main/patches-bundle.json - Or download the bundle directly:
patches-1.15.1.mpp
Patch the SonyLIV Android TV APK or the Nutrilio bundle with Morphe, then sideload the result onto your device (both ship as split APKs; Morphe handles merging and signing).
scripts/repatch_sonyliv.sh patches a SonyLIV Android TV .apkm with this patch set
(merging splits into one universal APK), applies the app-name / package-name options, and
signs it with a keystore:
./scripts/repatch_sonyliv.sh path/to/sonyliv.apkm
# or run with no argument to pick the .apkm interactivelyOverride the defaults with environment variables, e.g.
APP_NAME="My LIV" PACKAGE_NAME=com.sonyliv.custom KEYSTORE=./my.keystore ./scripts/repatch_sonyliv.sh app.apkm.
scripts/repatch_nutrilio.sh does the same for the Nutrilio split bundle (accepts the .zip
download, copies it to .apks, enables the rename + food-search-bar patches, and signs):
./scripts/repatch_nutrilio.sh net.nutrilio.zip
# defaults: APP_NAME="Nutrilio Morphe" PACKAGE_NAME=net.nutrilio.morphe SEARCH_BAR=1Both scripts use a locally built bundle if present, otherwise download the latest release. Requires JDK 17+, the Android SDK, and morphe-cli.
Requirements: JDK 17+ and the Android SDK (compileSdk 36).
A GitHub Personal Access Token with the read:packages scope is required to resolve
morphe-patcher from the Morphe GitHub Packages registry. Add it to ~/.gradle/gradle.properties:
gpr.user=YOUR_GITHUB_USERNAME
gpr.key=YOUR_GITHUB_TOKENThen build the patch bundle:
./gradlew buildAndroid
# Output: patches/build/libs/patches-<version>.mppList or apply the patches with morphe-cli:
java -jar morphe-cli.jar list-patches --patches=patches/build/libs/patches-1.15.1.mpp -v
java -jar morphe-cli.jar patch -p patches/build/libs/patches-1.15.1.mpp -o out.apk base.apkLicensed under the GNU General Public License v3.0, with the additional GPL Section 7
terms described in NOTICE. These patches are based on the prior work of
Morphe and ReVanced; the NOTICE
file is preserved as required. This project uses its own identity and is not associated with the
Morphe project name.