Skip to content

feat: Add ability to write patching results to JSON file - #25

Merged
wchill merged 5 commits into
devfrom
feat/patching-result-json
Jan 11, 2026
Merged

feat: Add ability to write patching results to JSON file#25
wchill merged 5 commits into
devfrom
feat/patching-result-json

Conversation

@wchill

@wchill wchill commented Jan 11, 2026

Copy link
Copy Markdown
Contributor

Adds the ability to dump the patching results to a JSON file by passing -r/--result-file. Currently this only exports the list of successful/failed patches; it may be worth adding the results of dex compilation/aligning/signing as well.

Example JSON (after pretty printing)

{
  "appliedPatches": [
    {
      "name": "Add archive links to context menu"
    },
    {
      "name": "Automatically undelete Imgur images"
    },
    {
      "name": "Automatically undelete Reddit content"
    },
    {
      "name": "Disable ads"
    },
    {
      "name": "Fix /s/ links"
    },
    {
      "name": "Fix Redgifs API"
    },
    {
      "name": "Fix missing audio in video downloads"
    },
    {
      "name": "Intercept HTTP requests"
    }
  ],
  "failedPatches": [
    {
      "patch": {
        "name": "Spoof client",
        "options": [
          {
            "key": "client-id",
            "value": null
          },
          {
            "key": "redirect-uri",
            "value": null
          },
          {
            "key": "user-agent",
            "value": null
          }
        ]
      },
      "reason": "app.morphe.patcher.patch.PatchException: When spoofing client, at least one of clientId, redirectUri or userAgent should be set.\n\tat app.morphe.patches.reddit.customclients.boostforreddit.api.SpoofClientPatchKt.spoofClientPatch$lambda$13$lambda$12(SpoofClientPatch.kt:26)\n\tat app.morphe.patcher.patch.Patch.execute(Patch.kt:71)\n\tat app.morphe.patcher.patch.BytecodePatch.execute$morphe_patcher(Patch.kt:160)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:104)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)\n\tat kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)\n\tat app.morphe.cli.command.PatchCommand$run$1$4.invokeSuspend(PatchCommand.kt:341)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)\n\tat kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:263)\n\tat kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:94)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:70)\n\tat kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)\n\tat kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)\n\tat app.morphe.cli.command.PatchCommand.run(PatchCommand.kt:340)\n\tat picocli.CommandLine.executeUserObject(CommandLine.java:2045)\n\tat picocli.CommandLine.access$1500(CommandLine.java:148)\n\tat picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2469)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2461)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2423)\n\tat picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)\n\tat picocli.CommandLine$RunLast.execute(CommandLine.java:2425)\n\tat picocli.CommandLine.execute(CommandLine.java:2174)\n\tat app.morphe.cli.command.MainCommandKt.main(MainCommand.kt:12)\n"
    }
  ]
}

@LisoUseInAIKyrios
LisoUseInAIKyrios changed the base branch from main to dev January 11, 2026 09:56
@wchill

wchill commented Jan 11, 2026

Copy link
Copy Markdown
Contributor Author

Updated results file

{
  "packageName": "com.rubenmayayo.reddit",
  "packageVersion": "1.12.12",
  "success": false,
  "patchingSteps": [
    {
      "step": "PATCHING",
      "success": true
    },
    {
      "step": "REBUILDING",
      "success": true
    },
    {
      "step": "SIGNING",
      "success": true
    }
  ],
  "appliedPatches": [
    {
      "name": "Add archive links to context menu"
    },
    {
      "name": "Automatically undelete Imgur images"
    },
    {
      "name": "Automatically undelete Reddit content"
    },
    {
      "name": "Disable ads"
    },
    {
      "name": "Fix /s/ links"
    },
    {
      "name": "Fix Redgifs API"
    },
    {
      "name": "Fix missing audio in video downloads"
    },
    {
      "name": "Intercept HTTP requests"
    }
  ],
  "failedPatches": [
    {
      "patch": {
        "name": "Spoof client",
        "options": [
          {
            "key": "client-id",
            "value": null
          },
          {
            "key": "redirect-uri",
            "value": null
          },
          {
            "key": "user-agent",
            "value": null
          }
        ]
      },
      "reason": "app.morphe.patcher.patch.PatchException: When spoofing client, at least one of clientId, redirectUri or userAgent should be set.\n\tat app.morphe.patches.reddit.customclients.boostforreddit.api.SpoofClientPatchKt.spoofClientPatch$lambda$13$lambda$12(SpoofClientPatch.kt:26)\n\tat app.morphe.patcher.patch.Patch.execute(Patch.kt:71)\n\tat app.morphe.patcher.patch.BytecodePatch.execute$morphe_patcher(Patch.kt:160)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:104)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)\n\tat kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)\n\tat app.morphe.cli.command.PatchCommand$run$1$4$1.invokeSuspend(PatchCommand.kt:352)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)\n\tat kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:263)\n\tat kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:94)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:70)\n\tat kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)\n\tat kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)\n\tat app.morphe.cli.command.PatchCommand.run$lambda$1$2(PatchCommand.kt:351)\n\tat app.morphe.cli.command.model.PatchingResultKt.addStepResult(PatchingResult.kt:26)\n\tat app.morphe.cli.command.PatchCommand.run(PatchCommand.kt:347)\n\tat picocli.CommandLine.executeUserObject(CommandLine.java:2045)\n\tat picocli.CommandLine.access$1500(CommandLine.java:148)\n\tat picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2469)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2461)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2423)\n\tat picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)\n\tat picocli.CommandLine$RunLast.execute(CommandLine.java:2425)\n\tat picocli.CommandLine.execute(CommandLine.java:2174)\n\tat app.morphe.cli.command.MainCommandKt.main(MainCommand.kt:12)\n"
    }
  ]
}

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds functionality to export patching results to a JSON file via the -r/--result-file command-line option. The feature tracks successful and failed patches along with their options, and optionally tracks the results of patching steps (PATCHING, REBUILDING, SIGNING, INSTALLING).

Changes:

  • Added Kotlin serialization support with new dependencies (kotlinx-serialization-json) and plugin
  • Created model classes to represent patching results, steps, and serializable patch information
  • Modified PatchCommand to collect and serialize patching results to a JSON file

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
gradle/libs.versions.toml Updated Kotlin version to 2.3.0 and kotlinx to 1.9.0, added kotlinx-serialization-json dependency and kotlin-serialization plugin
build.gradle.kts Added kotlin-serialization plugin and kotlinx-serialization-json dependency
src/main/kotlin/app/morphe/cli/command/model/PatchingStep.kt Created enum to represent different patching steps (PATCHING, REBUILDING, SIGNING, INSTALLING)
src/main/kotlin/app/morphe/cli/command/model/PatchingStepResult.kt Created data class to store the result of each patching step with success status and optional error message
src/main/kotlin/app/morphe/cli/command/model/FailedPatch.kt Created data class to represent a failed patch with its information and failure reason
src/main/kotlin/app/morphe/cli/command/model/SerializablePatch.kt Created serializable representation of a patch with custom serializer to handle options as JSON elements
src/main/kotlin/app/morphe/cli/command/model/PatchingResult.kt Created main result container with applied/failed patches, step results, and a helper function to track step execution
src/main/kotlin/app/morphe/cli/command/PatchCommand.kt Added result-file option, wrapped patching logic with result tracking, and added finally block to write JSON output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/main/kotlin/app/morphe/cli/command/model/SerializablePatch.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/PatchCommand.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/model/SerializablePatch.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/PatchCommand.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/PatchCommand.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/model/SerializablePatch.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/model/PatchingResult.kt
Comment thread src/main/kotlin/app/morphe/cli/command/model/PatchingResult.kt Outdated
Comment thread src/main/kotlin/app/morphe/cli/command/model/PatchingResult.kt Outdated
wchill and others added 2 commits January 11, 2026 13:54
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@wchill

wchill commented Jan 11, 2026

Copy link
Copy Markdown
Contributor Author

After changes to logic to rethrow exceptions from installer step:

{
  "packageName": "com.rubenmayayo.reddit",
  "packageVersion": "1.12.12",
  "success": false,
  "patchingSteps": [
    {
      "step": "PATCHING",
      "success": true
    },
    {
      "step": "REBUILDING",
      "success": true
    },
    {
      "step": "SIGNING",
      "success": true
    },
    {
      "step": "INSTALLING",
      "success": false,
      "message": "se.vidstige.jadb.JadbException: Could not install com.rubenmayayo.reddit_1.12.12-210011212_minAPI21(arm64-v8a,armeabi,armeabi-v7a,mips,mips64,x86,x86_64)(nodpi)_apkmirror.com-patched.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.rubenmayayo.reddit signatures do not match newer version; ignoring!]\n"
    }
  ],
  "appliedPatches": [
    {
      "name": "Add archive links to context menu"
    },
    {
      "name": "Automatically undelete Imgur images"
    },
    {
      "name": "Automatically undelete Reddit content"
    },
    {
      "name": "Disable ads"
    },
    {
      "name": "Fix /s/ links"
    },
    {
      "name": "Fix Redgifs API"
    },
    {
      "name": "Fix missing audio in video downloads"
    },
    {
      "name": "Intercept HTTP requests"
    }
  ],
  "failedPatches": [
    {
      "patch": {
        "name": "Spoof client",
        "options": [
          {
            "key": "client-id",
            "value": null
          },
          {
            "key": "redirect-uri",
            "value": null
          },
          {
            "key": "user-agent",
            "value": null
          }
        ]
      },
      "reason": "app.morphe.patcher.patch.PatchException: When spoofing client, at least one of clientId, redirectUri or userAgent should be set.\n\tat app.morphe.patches.reddit.customclients.boostforreddit.api.SpoofClientPatchKt.spoofClientPatch$lambda$13$lambda$12(SpoofClientPatch.kt:26)\n\tat app.morphe.patcher.patch.Patch.execute(Patch.kt:71)\n\tat app.morphe.patcher.patch.BytecodePatch.execute$morphe_patcher(Patch.kt:160)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)\n\tat app.morphe.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:104)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat app.morphe.patcher.Patcher$invoke$1.invoke(Patcher.kt)\n\tat kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)\n\tat kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)\n\tat app.morphe.cli.command.PatchCommand$run$1$4$1.invokeSuspend(PatchCommand.kt:351)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)\n\tat kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:263)\n\tat kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:94)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:70)\n\tat kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)\n\tat kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)\n\tat app.morphe.cli.command.PatchCommand.run$lambda$1$2(PatchCommand.kt:350)\n\tat app.morphe.cli.command.model.PatchingResultKt.addStepResult(PatchingResult.kt:24)\n\tat app.morphe.cli.command.PatchCommand.run(PatchCommand.kt:347)\n\tat picocli.CommandLine.executeUserObject(CommandLine.java:2045)\n\tat picocli.CommandLine.access$1500(CommandLine.java:148)\n\tat picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2469)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2461)\n\tat picocli.CommandLine$RunLast.handle(CommandLine.java:2423)\n\tat picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)\n\tat picocli.CommandLine$RunLast.execute(CommandLine.java:2425)\n\tat picocli.CommandLine.execute(CommandLine.java:2174)\n\tat app.morphe.cli.command.MainCommandKt.main(MainCommand.kt:12)\n"
    }
  ]
}

@wchill
wchill merged commit 304b3ea into dev Jan 11, 2026
1 check passed
@wchill
wchill deleted the feat/patching-result-json branch January 11, 2026 22:10
github-actions Bot pushed a commit that referenced this pull request Jan 11, 2026
# [1.2.0-dev.1](v1.1.0...v1.2.0-dev.1) (2026-01-11)

### Features

* Add ability to write patching results to JSON file ([#25](#25)) ([304b3ea](304b3ea))
github-actions Bot pushed a commit that referenced this pull request Feb 2, 2026
# [1.2.0](v1.1.0...v1.2.0) (2026-02-02)

### Features

* Add ability to write patching results to JSON file ([#25](#25)) ([304b3ea](304b3ea))
* Update to Morphe patcher / library 1.1.0 ([ef8e95d](ef8e95d))
AzyrRuthless pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Feb 6, 2026
Adds the ability to dump the patching results to a JSON file by passing
`-r`/`--result-file`. The result file contains package metadata, the result of the overall process, the result of each individual step, and a list of successfully applied/failed patches along with the options used and stacktraces (if applicable).
github-actions Bot pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Feb 6, 2026
# [1.0.0-dev.2](v1.0.0-dev.1...v1.0.0-dev.2) (2026-02-06)

### Features

* Add ability to write patching results to JSON file ([MorpheApp#25](https://github.com/AzyrRuthless/morphe-cli/issues/25)) ([ed0d1ef](ed0d1ef))
* Update to Morphe patcher / library 1.1.0 ([2445b24](2445b24))
* Update to Morphe patcher 1.1.1 ([8fa5a83](8fa5a83))
github-actions Bot pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Feb 6, 2026
# [1.1.0-dev.1](v1.0.0...v1.1.0-dev.1) (2026-02-06)

### Features

* Add ability to write patching results to JSON file ([MorpheApp#25](https://github.com/AzyrRuthless/morphe-cli/issues/25)) ([ed0d1ef](ed0d1ef))
* Update to Morphe patcher / library 1.1.0 ([2445b24](2445b24))
* Update to Morphe patcher 1.1.1 ([8fa5a83](8fa5a83))
github-actions Bot pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Feb 6, 2026
# [1.1.0](v1.0.0...v1.1.0) (2026-02-06)

### Features

* Add ability to write patching results to JSON file ([MorpheApp#25](https://github.com/AzyrRuthless/morphe-cli/issues/25)) ([ed0d1ef](ed0d1ef))
* Update to Morphe patcher / library 1.1.0 ([2445b24](2445b24))
* Update to Morphe patcher 1.1.1 ([8fa5a83](8fa5a83))
github-actions Bot pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Aug 24, 2026
# [1.8.0-dev.1](v1.7.1...v1.8.0-dev.1) (2026-08-24)

### Bug Fixes

* Add Enable-Native-Access attribute to jar manifest ([MorpheApp#249](https://github.com/AzyrRuthless/morphe-cli/issues/249)) ([d70a4c2](d70a4c2))
* Added progress bar to first time GUI download + Switched from materials icon to materials symbol + Cleaned up home screen code ([MorpheApp#234](https://github.com/AzyrRuthless/morphe-cli/issues/234)) ([39e948e](39e948e))
* Allow enabling/disabling patches using case insensitive patch names ([MorpheApp#48](https://github.com/AzyrRuthless/morphe-cli/issues/48)) ([03a280a](03a280a))
* Allow patches with empty targets to apply automatically ([MorpheApp#207](https://github.com/AzyrRuthless/morphe-cli/issues/207)) ([5a07bf7](5a07bf7))
* ARSCLib libraries are excluded during minimization ([2714ab5](2714ab5))
* ARSCLib libraries are not included in minimized fat jar ([5dce038](5dce038))
* Bump arsclib version, remove APKEditor ([412847e](412847e))
* clean up libs.versions.toml and build.gradle.kts configuration ([431bd82](431bd82))
* Clean up obsolete GUI dependencies ([MorpheApp#233](https://github.com/AzyrRuthless/morphe-cli/issues/233)) ([0d6816c](0d6816c))
* CLI --purge command does not cleanup temp APK ([MorpheApp#169](https://github.com/AzyrRuthless/morphe-cli/issues/169)) ([6163e9c](6163e9c))
* Close adb when app closes ([MorpheApp#153](https://github.com/AzyrRuthless/morphe-cli/issues/153)) ([a43de5a](a43de5a))
* continue-on-error fix + force windows to `FULL` ([MorpheApp#120](https://github.com/AzyrRuthless/morphe-cli/issues/120)) ([036faba](036faba))
* Dispatch error when launching app ([MorpheApp#79](https://github.com/AzyrRuthless/morphe-cli/issues/79)) ([989e72a](989e72a))
* Do not log patch name more than once if disabled ([MorpheApp#49](https://github.com/AzyrRuthless/morphe-cli/issues/49)) ([b980bb8](b980bb8))
* fix patch repo rate limiting by switching to raw links + stream downloads to disk ([MorpheApp#214](https://github.com/AzyrRuthless/morphe-cli/issues/214)) ([e21646c](e21646c))
* Handle GUI patching xapk / apks, add distinct patch-source channel colors, improve patch loading errors ([MorpheApp#180](https://github.com/AzyrRuthless/morphe-cli/issues/180)) ([d8245f0](d8245f0))
* Handle patching XAPK files ([MorpheApp#93](https://github.com/AzyrRuthless/morphe-cli/issues/93)) ([5d18490](5d18490))
* Handle running CLI in headless environment ([MorpheApp#95](https://github.com/AzyrRuthless/morphe-cli/issues/95)) ([70f2952](70f2952))
* Include Notice and License files in shadow jar release ([MorpheApp#113](https://github.com/AzyrRuthless/morphe-cli/issues/113)) ([a9a2402](a9a2402))
* move both HTTP clients to OkHttp for parity with manager ([MorpheApp#254](https://github.com/AzyrRuthless/morphe-cli/issues/254)) ([e8379be](e8379be))
* Multi patch source minor network times out ([MorpheApp#155](https://github.com/AzyrRuthless/morphe-cli/issues/155)) ([06e5788](06e5788))
* Preserve manifest attributes in minimized jar ([MorpheApp#255](https://github.com/AzyrRuthless/morphe-cli/issues/255)) ([e5684d9](e5684d9))
* Re-enable strip libs feature ([MorpheApp#117](https://github.com/AzyrRuthless/morphe-cli/issues/117)) ([6d2bb94](6d2bb94))
* Resilient patch bundle loading + quieter ADB logging + unique version output naming ([MorpheApp#224](https://github.com/AzyrRuthless/morphe-cli/issues/224)) ([8cb5250](8cb5250))
* resolve deprecation warnings and fix `list-versions` accuracy ([MorpheApp#225](https://github.com/AzyrRuthless/morphe-cli/issues/225)) ([9b79d69](9b79d69))
* signing improvements ([MorpheApp#160](https://github.com/AzyrRuthless/morphe-cli/issues/160)) ([166f940](166f940))
* Update dependencies ([83d3969](83d3969))
* Update patcher dependency ([7ba5e1c](7ba5e1c))
* Update to latest ARSCLib ([f62a179](f62a179))
* Update to latest patcher ([2c89128](2c89128))
* Update to latest patcher ([a0bea3d](a0bea3d))
* Update to latest patcher ([efd0cf1](efd0cf1))
* Update to latest Patcher ([fa1aa30](fa1aa30))
* Update to latest Patcher ([fbc6c9e](fbc6c9e))
* Update to latest patcher dev ([496d8e9](496d8e9))
* Update to latest patcher dev ([1356259](1356259))
* Update to latest patcher dev ([fb8a4ff](fb8a4ff))
* Update to latest patcher dev ([1551c8e](1551c8e))
* Update to Patcher 1.3.0 ([19c0846](19c0846))
* Update to Patcher 1.3.1 ([39bdd44](39bdd44))
* Update to Patcher 1.3.2 ([f4c00bb](f4c00bb))
* Update to Patcher 1.3.3 ([ca579fb](ca579fb))
* Update to patcher 1.5.1 ([d7c5036](d7c5036))
* Use GitHub raw links for CLI update check ([MorpheApp#87](https://github.com/AzyrRuthless/morphe-cli/issues/87)) ([2aa6263](2aa6263))
* Use latest library dev release ([b60ea86](b60ea86))
* use latest patcher ([d7e9b62](d7e9b62))
* Use latest patcher and library dev release ([2f21880](2f21880))
* Use latest patcher dev release ([ea6e231](ea6e231))
* Use latest patcher dev release ([2b33a6c](2b33a6c))
* Use latest patcher dev release ([baf34de](baf34de))
* Use latest patcher dev release ([9cf07f9](9cf07f9))
* Use latest patcher dev release ([791257c](791257c))
* Use latest patcher dev release ([7cc195a](7cc195a))
* Use latest patcher dev release ([f8bd235](f8bd235))
* Use more logging verbosity when updating options.json ([MorpheApp#72](https://github.com/AzyrRuthless/morphe-cli/issues/72)) ([4d223f2](4d223f2))
* Use patcher implementation of strip libs ([MorpheApp#83](https://github.com/AzyrRuthless/morphe-cli/issues/83)) ([43f50ea](43f50ea)), closes [MorpheApp#80](https://github.com/AzyrRuthless/morphe-cli/issues/80) [MorpheApp#82](https://github.com/AzyrRuthless/morphe-cli/issues/82)
* Use same default keystore values as Morphe Manager ([MorpheApp#96](https://github.com/AzyrRuthless/morphe-cli/issues/96)) ([2d70c01](2d70c01))

### Features

* "your apps" section + settings and tools split + re-orderable patch sources + block play store updates for patched apps ([MorpheApp#176](https://github.com/AzyrRuthless/morphe-cli/issues/176)) ([d865abd](d865abd))
* Add `--continue-on-error` argument, return non zero exit code if patching fails ([MorpheApp#47](https://github.com/AzyrRuthless/morphe-cli/issues/47)) ([255646b](255646b))
* Add `--include-experimental` flag to `list-patches` and `list-versions` ([MorpheApp#189](https://github.com/AzyrRuthless/morphe-cli/issues/189)) ([8ef916c](8ef916c))
* Add `--options-file` json patch/option configuration ([MorpheApp#53](https://github.com/AzyrRuthless/morphe-cli/issues/53)) ([44943da](44943da))
* Add `--out` and `--patches` arguments to `list-patches` command ([MorpheApp#60](https://github.com/AzyrRuthless/morphe-cli/issues/60)) ([ef9fc48](ef9fc48))
* Add `--striplibs` argument to strip unwanted architectures ([MorpheApp#46](https://github.com/AzyrRuthless/morphe-cli/issues/46)) ([7442d94](7442d94))
* Add ability to write patching results to JSON file ([MorpheApp#25](https://github.com/AzyrRuthless/morphe-cli/issues/25)) ([304b3ea](304b3ea))
* Add ARSCLib support ([MorpheApp#55](https://github.com/AzyrRuthless/morphe-cli/issues/55)) ([07c3f7e](07c3f7e))
* Add desktop GUI ([MorpheApp#42](https://github.com/AzyrRuthless/morphe-cli/issues/42)) ([cd627e6](cd627e6))
* Add GUI third party patch sources, add experimental app patching ([MorpheApp#98](https://github.com/AzyrRuthless/morphe-cli/issues/98)) ([da5ec1c](da5ec1c))
* Add icon studio ([MorpheApp#211](https://github.com/AzyrRuthless/morphe-cli/issues/211)) ([16e5cb3](16e5cb3))
* Add in-app dependency license viewer ([MorpheApp#114](https://github.com/AzyrRuthless/morphe-cli/issues/114)) ([77a1dde](77a1dde))
* Add ProGuard jar shrinking ([MorpheApp#227](https://github.com/AzyrRuthless/morphe-cli/issues/227)) ([0e6ae05](0e6ae05))
* Add search function to license viewer ([MorpheApp#124](https://github.com/AzyrRuthless/morphe-cli/issues/124)) ([d3d9feb](d3d9feb))
* Add setting menu to save patched app crash logs to file ([MorpheApp#143](https://github.com/AzyrRuthless/morphe-cli/issues/143)) ([90836b5](90836b5))
* Apply patches from multiple patch bundles, add GUI patch source selector  ([MorpheApp#145](https://github.com/AzyrRuthless/morphe-cli/issues/145)) ([44ed6c6](44ed6c6))
* Array GUI patches alphabetically, improve error logging, use separate class loader for multiple patch bundles ([MorpheApp#187](https://github.com/AzyrRuthless/morphe-cli/issues/187)) ([755909c](755909c))
* cli ignores unknown keys (fix) + unify CLI/GUI patch cache + add clear-cache + make purge opt-out ([MorpheApp#192](https://github.com/AzyrRuthless/morphe-cli/issues/192)) ([70d16f0](70d16f0))
* Custom output path + better GUI scrollbars ([MorpheApp#127](https://github.com/AzyrRuthless/morphe-cli/issues/127)) ([70e2721](70e2721))
* developer mode +  configurable data directory ([MorpheApp#220](https://github.com/AzyrRuthless/morphe-cli/issues/220)) ([a1ba3a2](a1ba3a2))
* dynamically download GUI dependencies to reduce jar size ([MorpheApp#232](https://github.com/AzyrRuthless/morphe-cli/issues/232)) ([d74a3c2](d74a3c2))
* Faster dex rebuilding + reduced memory requirements  ([MorpheApp#108](https://github.com/AzyrRuthless/morphe-cli/issues/108)) ([ed8918e](ed8918e))
* Inform user if cli is outdated ([MorpheApp#81](https://github.com/AzyrRuthless/morphe-cli/issues/81)) ([5bcd4f7](5bcd4f7))
* Patch sources follows latest (stable/dev) instead of to last used version ([MorpheApp#185](https://github.com/AzyrRuthless/morphe-cli/issues/185)) ([5d34993](5d34993))
* Rename project to "Morphe Desktop" ([MorpheApp#181](https://github.com/AzyrRuthless/morphe-cli/issues/181)) ([66a6de7](66a6de7))
* route links through patched app + uninstall from "Your Apps" section's cards ([MorpheApp#179](https://github.com/AzyrRuthless/morphe-cli/issues/179)) ([1626ce5](1626ce5))
* Support GitHub repo urls with `--patches` argument ([MorpheApp#71](https://github.com/AzyrRuthless/morphe-cli/issues/71)) ([2cc09a9](2cc09a9))
* Support patching APKM bundles ([MorpheApp#40](https://github.com/AzyrRuthless/morphe-cli/issues/40)) ([bfe43d0](bfe43d0))
* UI improvements and fixes ([MorpheApp#128](https://github.com/AzyrRuthless/morphe-cli/issues/128)) ([980ebac](980ebac))
* Update to Morphe patcher / library 1.1.0 ([ef8e95d](ef8e95d))
* Update to Morphe patcher 1.1.1 ([6162983](6162983))
github-actions Bot pushed a commit to AzyrRuthless/morphe-cli that referenced this pull request Aug 24, 2026
# [1.8.0](v1.7.1...v1.8.0) (2026-08-24)

### Bug Fixes

* Add Enable-Native-Access attribute to jar manifest ([MorpheApp#249](https://github.com/AzyrRuthless/morphe-cli/issues/249)) ([d70a4c2](d70a4c2))
* Added progress bar to first time GUI download + Switched from materials icon to materials symbol + Cleaned up home screen code ([MorpheApp#234](https://github.com/AzyrRuthless/morphe-cli/issues/234)) ([39e948e](39e948e))
* Allow enabling/disabling patches using case insensitive patch names ([MorpheApp#48](https://github.com/AzyrRuthless/morphe-cli/issues/48)) ([03a280a](03a280a))
* Allow patches with empty targets to apply automatically ([MorpheApp#207](https://github.com/AzyrRuthless/morphe-cli/issues/207)) ([5a07bf7](5a07bf7))
* ARSCLib libraries are excluded during minimization ([2714ab5](2714ab5))
* ARSCLib libraries are not included in minimized fat jar ([5dce038](5dce038))
* Bump arsclib version, remove APKEditor ([412847e](412847e))
* clean up libs.versions.toml and build.gradle.kts configuration ([431bd82](431bd82))
* Clean up obsolete GUI dependencies ([MorpheApp#233](https://github.com/AzyrRuthless/morphe-cli/issues/233)) ([0d6816c](0d6816c))
* CLI --purge command does not cleanup temp APK ([MorpheApp#169](https://github.com/AzyrRuthless/morphe-cli/issues/169)) ([6163e9c](6163e9c))
* Close adb when app closes ([MorpheApp#153](https://github.com/AzyrRuthless/morphe-cli/issues/153)) ([a43de5a](a43de5a))
* continue-on-error fix + force windows to `FULL` ([MorpheApp#120](https://github.com/AzyrRuthless/morphe-cli/issues/120)) ([036faba](036faba))
* Dispatch error when launching app ([MorpheApp#79](https://github.com/AzyrRuthless/morphe-cli/issues/79)) ([989e72a](989e72a))
* Do not log patch name more than once if disabled ([MorpheApp#49](https://github.com/AzyrRuthless/morphe-cli/issues/49)) ([b980bb8](b980bb8))
* fix patch repo rate limiting by switching to raw links + stream downloads to disk ([MorpheApp#214](https://github.com/AzyrRuthless/morphe-cli/issues/214)) ([e21646c](e21646c))
* Handle GUI patching xapk / apks, add distinct patch-source channel colors, improve patch loading errors ([MorpheApp#180](https://github.com/AzyrRuthless/morphe-cli/issues/180)) ([d8245f0](d8245f0))
* Handle patching XAPK files ([MorpheApp#93](https://github.com/AzyrRuthless/morphe-cli/issues/93)) ([5d18490](5d18490))
* Handle running CLI in headless environment ([MorpheApp#95](https://github.com/AzyrRuthless/morphe-cli/issues/95)) ([70f2952](70f2952))
* Include Notice and License files in shadow jar release ([MorpheApp#113](https://github.com/AzyrRuthless/morphe-cli/issues/113)) ([a9a2402](a9a2402))
* move both HTTP clients to OkHttp for parity with manager ([MorpheApp#254](https://github.com/AzyrRuthless/morphe-cli/issues/254)) ([e8379be](e8379be))
* Multi patch source minor network times out ([MorpheApp#155](https://github.com/AzyrRuthless/morphe-cli/issues/155)) ([06e5788](06e5788))
* Preserve manifest attributes in minimized jar ([MorpheApp#255](https://github.com/AzyrRuthless/morphe-cli/issues/255)) ([e5684d9](e5684d9))
* Re-enable strip libs feature ([MorpheApp#117](https://github.com/AzyrRuthless/morphe-cli/issues/117)) ([6d2bb94](6d2bb94))
* Resilient patch bundle loading + quieter ADB logging + unique version output naming ([MorpheApp#224](https://github.com/AzyrRuthless/morphe-cli/issues/224)) ([8cb5250](8cb5250))
* resolve deprecation warnings and fix `list-versions` accuracy ([MorpheApp#225](https://github.com/AzyrRuthless/morphe-cli/issues/225)) ([9b79d69](9b79d69))
* signing improvements ([MorpheApp#160](https://github.com/AzyrRuthless/morphe-cli/issues/160)) ([166f940](166f940))
* Update dependencies ([83d3969](83d3969))
* Update patcher dependency ([7ba5e1c](7ba5e1c))
* Update to latest ARSCLib ([f62a179](f62a179))
* Update to latest patcher ([2c89128](2c89128))
* Update to latest patcher ([a0bea3d](a0bea3d))
* Update to latest patcher ([efd0cf1](efd0cf1))
* Update to latest Patcher ([fa1aa30](fa1aa30))
* Update to latest Patcher ([fbc6c9e](fbc6c9e))
* Update to latest patcher dev ([496d8e9](496d8e9))
* Update to latest patcher dev ([1356259](1356259))
* Update to latest patcher dev ([fb8a4ff](fb8a4ff))
* Update to latest patcher dev ([1551c8e](1551c8e))
* Update to Patcher 1.3.0 ([19c0846](19c0846))
* Update to Patcher 1.3.1 ([39bdd44](39bdd44))
* Update to Patcher 1.3.2 ([f4c00bb](f4c00bb))
* Update to Patcher 1.3.3 ([ca579fb](ca579fb))
* Update to patcher 1.5.1 ([d7c5036](d7c5036))
* Use GitHub raw links for CLI update check ([MorpheApp#87](https://github.com/AzyrRuthless/morphe-cli/issues/87)) ([2aa6263](2aa6263))
* Use latest library dev release ([b60ea86](b60ea86))
* use latest patcher ([d7e9b62](d7e9b62))
* Use latest patcher and library dev release ([2f21880](2f21880))
* Use latest patcher dev release ([ea6e231](ea6e231))
* Use latest patcher dev release ([2b33a6c](2b33a6c))
* Use latest patcher dev release ([baf34de](baf34de))
* Use latest patcher dev release ([9cf07f9](9cf07f9))
* Use latest patcher dev release ([791257c](791257c))
* Use latest patcher dev release ([7cc195a](7cc195a))
* Use latest patcher dev release ([f8bd235](f8bd235))
* Use more logging verbosity when updating options.json ([MorpheApp#72](https://github.com/AzyrRuthless/morphe-cli/issues/72)) ([4d223f2](4d223f2))
* Use patcher implementation of strip libs ([MorpheApp#83](https://github.com/AzyrRuthless/morphe-cli/issues/83)) ([43f50ea](43f50ea)), closes [MorpheApp#80](https://github.com/AzyrRuthless/morphe-cli/issues/80) [MorpheApp#82](https://github.com/AzyrRuthless/morphe-cli/issues/82)
* Use same default keystore values as Morphe Manager ([MorpheApp#96](https://github.com/AzyrRuthless/morphe-cli/issues/96)) ([2d70c01](2d70c01))

### Features

* "your apps" section + settings and tools split + re-orderable patch sources + block play store updates for patched apps ([MorpheApp#176](https://github.com/AzyrRuthless/morphe-cli/issues/176)) ([d865abd](d865abd))
* Add `--continue-on-error` argument, return non zero exit code if patching fails ([MorpheApp#47](https://github.com/AzyrRuthless/morphe-cli/issues/47)) ([255646b](255646b))
* Add `--include-experimental` flag to `list-patches` and `list-versions` ([MorpheApp#189](https://github.com/AzyrRuthless/morphe-cli/issues/189)) ([8ef916c](8ef916c))
* Add `--options-file` json patch/option configuration ([MorpheApp#53](https://github.com/AzyrRuthless/morphe-cli/issues/53)) ([44943da](44943da))
* Add `--out` and `--patches` arguments to `list-patches` command ([MorpheApp#60](https://github.com/AzyrRuthless/morphe-cli/issues/60)) ([ef9fc48](ef9fc48))
* Add `--striplibs` argument to strip unwanted architectures ([MorpheApp#46](https://github.com/AzyrRuthless/morphe-cli/issues/46)) ([7442d94](7442d94))
* Add ability to write patching results to JSON file ([MorpheApp#25](https://github.com/AzyrRuthless/morphe-cli/issues/25)) ([304b3ea](304b3ea))
* Add ARSCLib support ([MorpheApp#55](https://github.com/AzyrRuthless/morphe-cli/issues/55)) ([07c3f7e](07c3f7e))
* Add desktop GUI ([MorpheApp#42](https://github.com/AzyrRuthless/morphe-cli/issues/42)) ([cd627e6](cd627e6))
* Add GUI third party patch sources, add experimental app patching ([MorpheApp#98](https://github.com/AzyrRuthless/morphe-cli/issues/98)) ([da5ec1c](da5ec1c))
* Add icon studio ([MorpheApp#211](https://github.com/AzyrRuthless/morphe-cli/issues/211)) ([16e5cb3](16e5cb3))
* Add in-app dependency license viewer ([MorpheApp#114](https://github.com/AzyrRuthless/morphe-cli/issues/114)) ([77a1dde](77a1dde))
* Add ProGuard jar shrinking ([MorpheApp#227](https://github.com/AzyrRuthless/morphe-cli/issues/227)) ([0e6ae05](0e6ae05))
* Add search function to license viewer ([MorpheApp#124](https://github.com/AzyrRuthless/morphe-cli/issues/124)) ([d3d9feb](d3d9feb))
* Add setting menu to save patched app crash logs to file ([MorpheApp#143](https://github.com/AzyrRuthless/morphe-cli/issues/143)) ([90836b5](90836b5))
* Apply patches from multiple patch bundles, add GUI patch source selector  ([MorpheApp#145](https://github.com/AzyrRuthless/morphe-cli/issues/145)) ([44ed6c6](44ed6c6))
* Array GUI patches alphabetically, improve error logging, use separate class loader for multiple patch bundles ([MorpheApp#187](https://github.com/AzyrRuthless/morphe-cli/issues/187)) ([755909c](755909c))
* cli ignores unknown keys (fix) + unify CLI/GUI patch cache + add clear-cache + make purge opt-out ([MorpheApp#192](https://github.com/AzyrRuthless/morphe-cli/issues/192)) ([70d16f0](70d16f0))
* Custom output path + better GUI scrollbars ([MorpheApp#127](https://github.com/AzyrRuthless/morphe-cli/issues/127)) ([70e2721](70e2721))
* developer mode +  configurable data directory ([MorpheApp#220](https://github.com/AzyrRuthless/morphe-cli/issues/220)) ([a1ba3a2](a1ba3a2))
* dynamically download GUI dependencies to reduce jar size ([MorpheApp#232](https://github.com/AzyrRuthless/morphe-cli/issues/232)) ([d74a3c2](d74a3c2))
* Faster dex rebuilding + reduced memory requirements  ([MorpheApp#108](https://github.com/AzyrRuthless/morphe-cli/issues/108)) ([ed8918e](ed8918e))
* Inform user if cli is outdated ([MorpheApp#81](https://github.com/AzyrRuthless/morphe-cli/issues/81)) ([5bcd4f7](5bcd4f7))
* Patch sources follows latest (stable/dev) instead of to last used version ([MorpheApp#185](https://github.com/AzyrRuthless/morphe-cli/issues/185)) ([5d34993](5d34993))
* Rename project to "Morphe Desktop" ([MorpheApp#181](https://github.com/AzyrRuthless/morphe-cli/issues/181)) ([66a6de7](66a6de7))
* route links through patched app + uninstall from "Your Apps" section's cards ([MorpheApp#179](https://github.com/AzyrRuthless/morphe-cli/issues/179)) ([1626ce5](1626ce5))
* Support GitHub repo urls with `--patches` argument ([MorpheApp#71](https://github.com/AzyrRuthless/morphe-cli/issues/71)) ([2cc09a9](2cc09a9))
* Support patching APKM bundles ([MorpheApp#40](https://github.com/AzyrRuthless/morphe-cli/issues/40)) ([bfe43d0](bfe43d0))
* UI improvements and fixes ([MorpheApp#128](https://github.com/AzyrRuthless/morphe-cli/issues/128)) ([980ebac](980ebac))
* Update to Morphe patcher / library 1.1.0 ([ef8e95d](ef8e95d))
* Update to Morphe patcher 1.1.1 ([6162983](6162983))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants