2 Commits
Author SHA1 Message Date
semantic-release-bot 9540e6443a chore: Release v1.2.0 [skip ci]
## [1.2.0](http://gitea:3000/StanPonomarev/twitter-patch/compare/v1.1.7...v1.2.0) (2026-09-01)

### ✨ New Features

* age verification ([7472659](http://gitea:3000/StanPonomarev/twitter-patch/commit/74726598be4ceb147817e34ccb6cf435ece8f0bc))
2026-09-01 20:43:46 +00:00
StanPonomarev 74726598be feat: age verification
Release / Release (push) Successful in 59s
2026-09-01 22:42:42 +02:00
7 changed files with 78 additions and 9 deletions
+6
View File
@@ -1,3 +1,9 @@
## [1.2.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.7...v1.2.0) (2026-09-01)
### ✨ New Features
* age verification ([7472659](https://git.krtss.de/StanPonomarev/twitter-patch/commit/74726598be4ceb147817e34ccb6cf435ece8f0bc))
## [1.1.7](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.6...v1.1.7) (2026-08-24) ## [1.1.7](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.6...v1.1.7) (2026-08-24)
### 🐛 Bug Fixes ### 🐛 Bug Fixes
+3 -2
View File
@@ -4,9 +4,9 @@ Patch bundle for X (Twitter), maintained by
[Stan Ponomarev](https://git.krtss.de/StanPonomarev). [Stan Ponomarev](https://git.krtss.de/StanPonomarev).
<!-- PATCHES_START --> <!-- PATCHES_START -->
> **[v1.1.7](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.7)**&nbsp;&nbsp;•&nbsp;&nbsp;`main`&nbsp;&nbsp;•&nbsp;&nbsp;2 patches total > **[v1.2.0](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.2.0)**&nbsp;&nbsp;•&nbsp;&nbsp;`main`&nbsp;&nbsp;•&nbsp;&nbsp;3 patches total
<details open> <details open>
<summary>📦 X&nbsp;&nbsp;•&nbsp;&nbsp;2 patches</summary> <summary>📦 X&nbsp;&nbsp;•&nbsp;&nbsp;3 patches</summary>
<br> <br>
**🎯 Supported versions:** **🎯 Supported versions:**
@@ -17,6 +17,7 @@ Patch bundle for X (Twitter), maintained by
| 💊&nbsp;Patch | 📜&nbsp;Description | ⚙️&nbsp;Options | | 💊&nbsp;Patch | 📜&nbsp;Description | ⚙️&nbsp;Options |
|----------|----------------|-----------| |----------|----------------|-----------|
| [Disable outdated version screen](#disable-outdated-version-screen) | Prevents X from blocking app access when it marks the client version as outdated. | | | [Disable outdated version screen](#disable-outdated-version-screen) | Prevents X from blocking app access when it marks the client version as outdated. | |
| [Remove post age verification](#remove-post-age-verification) | Allows age-gated posts to be viewed without completing age verification. | |
| [Remove timeline Upgrade button](#remove-timeline-upgrade-button) | Removes the Premium Upgrade button from the timeline's top bar. | | | [Remove timeline Upgrade button](#remove-timeline-upgrade-button) | Removes the Premium Upgrade button from the timeline's top bar. | |
</details> </details>
+1 -1
View File
@@ -1,4 +1,4 @@
org.gradle.parallel = true org.gradle.parallel = true
org.gradle.caching = true org.gradle.caching = true
kotlin.code.style = official kotlin.code.style = official
version = 1.1.7 version = 1.2.0
+4 -4
View File
@@ -1,7 +1,7 @@
{ {
"created_at": "2026-08-24T11:33:57", "created_at": "2026-09-01T20:43:32",
"description": "## [1.1.7](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.6...v1.1.7) (2026-08-24)\n\n### 🐛 Bug Fixes\n\n* version check again ([104ca41](https://git.krtss.de/StanPonomarev/twitter-patch/commit/104ca41fda3ee3ee9215519e6266c37f87e86ffc))", "description": "## [1.2.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.7...v1.2.0) (2026-09-01)\n\n### ✨ New Features\n\n* age verification ([7472659](https://git.krtss.de/StanPonomarev/twitter-patch/commit/74726598be4ceb147817e34ccb6cf435ece8f0bc))",
"download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.1.7/patches-1.1.7.mpp", "download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.2.0/patches-1.2.0.mpp",
"signature_download_url": "", "signature_download_url": "",
"version": "1.1.7" "version": "1.2.0"
} }
+27 -1
View File
@@ -1,6 +1,6 @@
{ {
"NOTE": "Do NOT manually edit this file. This file is automatically updated when semantic release (release.yml) runs. Manually editing this file can break your releases and break third party tools that use this file.", "NOTE": "Do NOT manually edit this file. This file is automatically updated when semantic release (release.yml) runs. Manually editing this file can break your releases and break third party tools that use this file.",
"version": "1.1.7", "version": "1.2.0",
"patches": [ "patches": [
{ {
"name": "Disable outdated version screen", "name": "Disable outdated version screen",
@@ -30,6 +30,32 @@
], ],
"options": [] "options": []
}, },
{
"name": "Remove post age verification",
"description": "Allows age-gated posts to be viewed without completing age verification.",
"default": true,
"dependencies": [],
"compatiblePackages": [
{
"packageName": "com.twitter.android",
"name": "X",
"description": null,
"apkFileType": "APKM",
"appIconColor": "#000000",
"signatures": null,
"targets": [
{
"version": "12.7.1-release.0",
"versionCodes": null,
"isExperimental": false,
"minSdk": 28,
"description": null
}
]
}
],
"options": []
},
{ {
"name": "Remove timeline Upgrade button", "name": "Remove timeline Upgrade button",
"description": "Removes the Premium Upgrade button from the timeline's top bar.", "description": "Removes the Premium Upgrade button from the timeline's top bar.",
@@ -49,6 +49,7 @@ class MorphePatchIntegrationTest {
"--exclusive", "--exclusive",
"--enable=$OUTDATED_PATCH_NAME", "--enable=$OUTDATED_PATCH_NAME",
"--enable=$UPGRADE_PATCH_NAME", "--enable=$UPGRADE_PATCH_NAME",
"--enable=$POST_AGE_VERIFICATION_PATCH_NAME",
"--unsigned", "--unsigned",
"--out=${patchedApk.absolutePathString()}", "--out=${patchedApk.absolutePathString()}",
"--result-file=${resultFile.absolutePathString()}", "--result-file=${resultFile.absolutePathString()}",
@@ -93,7 +94,9 @@ class MorphePatchIntegrationTest {
val appliedPatchNames = result.getAsJsonArray("appliedPatches") val appliedPatchNames = result.getAsJsonArray("appliedPatches")
.map { it.asJsonObject.get("name").asString } .map { it.asJsonObject.get("name").asString }
assertTrue( assertTrue(
appliedPatchNames.containsAll(listOf(OUTDATED_PATCH_NAME, UPGRADE_PATCH_NAME)), appliedPatchNames.containsAll(
listOf(OUTDATED_PATCH_NAME, UPGRADE_PATCH_NAME, POST_AGE_VERIFICATION_PATCH_NAME)
),
"Expected patches were not applied: $appliedPatchNames" "Expected patches were not applied: $appliedPatchNames"
) )
assertTrue(result.getAsJsonArray("failedPatches").isEmpty, "Morphe reported failed patches") assertTrue(result.getAsJsonArray("failedPatches").isEmpty, "Morphe reported failed patches")
@@ -148,6 +151,7 @@ class MorphePatchIntegrationTest {
private companion object { private companion object {
const val OUTDATED_PATCH_NAME = "Disable outdated version screen" const val OUTDATED_PATCH_NAME = "Disable outdated version screen"
const val UPGRADE_PATCH_NAME = "Remove timeline Upgrade button" const val UPGRADE_PATCH_NAME = "Remove timeline Upgrade button"
const val POST_AGE_VERIFICATION_PATCH_NAME = "Remove post age verification"
const val MORPHE_VERSION = "1.13.1" const val MORPHE_VERSION = "1.13.1"
const val MORPHE_SHA256 = "a212531f68d3ada4b504bf9dac3e02460589f3bf8868ee66e1b4780152d3466b" const val MORPHE_SHA256 = "a212531f68d3ada4b504bf9dac3e02460589f3bf8868ee66e1b4780152d3466b"
const val MORPHE_URL = const val MORPHE_URL =
@@ -0,0 +1,32 @@
package app.twitter.patches
import app.morphe.patcher.Fingerprint
import app.morphe.patcher.extensions.InstructionExtensions.addInstructions
import app.morphe.patcher.patch.bytecodePatch
import app.twitter.patches.shared.Constants.COMPATIBILITY_X
private val postAgeVerificationActionFingerprint = Fingerprint(
definingClass = "Lcom/twitter/model/mediavisibility/c${'$'}b;",
name = "a",
returnType = "Lcom/twitter/model/mediavisibility/c;",
parameters = listOf("Ljava/lang/String;")
)
@Suppress("unused")
val removePostAgeVerificationPatch = bytecodePatch(
name = "Remove post age verification",
description = "Allows age-gated posts to be viewed without completing age verification.",
default = true
) {
compatibleWith(COMPATIBILITY_X)
execute {
postAgeVerificationActionFingerprint.method.addInstructions(
0,
"""
const/4 v0, 0x0
return-object v0
"""
)
}
}