AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
한 번 클릭으로 모든 Revanced 앱을 빌드하는 Python 유틸
One Click Python util to build all Revanced apps.
개발 도구Python · ShellGitHub @nikhilbadyal직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A little python script that will help you in building Revanced apps and sharing them anywhere.
Note - If you are a root user and want magisk module (Extended). Get them here
This is just a builder for revanced and not a revanced support. Please be understanding and refrain from asking about revanced features/bugs. Discuss those on proper relevant forums.
You can get pre-built apks here
You can use any of the following methods to build.
🚀 GitHub (Recommended)
Click Star to support the project.
Fork the project.
Add ENVS (optional) secret to the repo. Required only if you want to cook specific apps/versions.
Go to actions tab. Select Build & Release.Click on Run Workflow.
If the building process is successful, you'll get your APKs in the
Make sure to do below steps once in a while(daily or weekly) to keep the builder bug free.
🐳 Docker Compose
git clone https://github.com/nikhilbadyal/docker-py-revanced
cd docker-py-revanced
.env file if you want some customization(See notes)docker compose up --build
🐳With Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
docker run -v "$(pwd)"/apks:/app/apks/ nikhilbadyal/docker-py-revanced
You can pass the below environment variables (See notes) with the -e flag or use the --env-file
flag.🫠Without Docker
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python main.py
| Env Name | Description | Default |
|---|---|---|
| PATCH_APPS | Apps to patch/build | youtube |
| EXISTING_DOWNLOADED_APKS | Already downloaded clean apks | [] |
| PERSONAL_ACCESS_TOKEN | GitHub/GitLab Token to be used | None |
| DRY_RUN | Do a dry run | False |
| DL for CLI to be used for patching apps.(Disabled Temp) | Revanced CLI | |
| GLOBAL_PATCHES_DL* | DL for Patches to be used for patching apps. | ReVanced API patches bundle |
| GLOBAL_SPACE_FORMATTED_PATCHES* | Whether patches are space formatted. | True |
| GLOBAL_KEYSTORE_FILE_NAME* |
* - Can be overridden for individual app.
| Env Name | Description | Default |
|---|---|---|
| DL for CLI to be used for patching APP_NAME.(Disabled Temp) | GLOBAL_CLI_DL | |
| APP_NAME_PATCHES_DL | DL for Patches to be used for patching APP_NAME. Supports multiple bundles via comma separation. | GLOBAL_PATCHES_DL |
| APP_NAME_SPACE_FORMATTED_PATCHES | Whether patches are space formatted. APP_NAME. | GLOBAL_SPACE_FORMATTED_PATCHES |
| APP_NAME_KEYSTORE_FILE_NAME | Key file to be used for signing APP_NAME. | GLOBAL_KEYSTORE_FILE_NAME |
| APP_NAME_OLD_KEY | Whether key used was generated with cli > v4(new) APP_NAME. | GLOBAL_OLK_KEY |
| APP_NAME_ARCHS_TO_BUILD | Arch to keep in the patched APP_NAME. | GLOBAL_ARCHS_TO_BUILD |
** - By default all patches for a given app are included.
** - Can be used to included universal patch.
*** - Can be used for unavailable apps in the repository (unofficial apps).
Optional integration with Obtainium so patched APKs can be installed and updated straight from your GitHub Releases. See obtainium.md for setup steps, how it works, and full option details.
| Env Name | Description | Default |
|---|---|---|
| OBTAINIUM_EXPORT | Generate per-app HTML sources for Obtainium | False |
| OBTAINIUM_GITHUB_TAG | Release tag the generated links point to | latest |
| OBTAINIUM_SITE_EXPORT | Generate a one-click install site (index.html at branch root) | False |
| OBTAINIUM_VERSION_EXTRACTION_REGEX | Regex used to extract app + patch version for display | See docs |
| OBTAINIUM_VERSION_MATCH_GROUP | Match-group template used with the regex above | $1+$2 |
Officially Supported values for APP_NAME** are :
7a. CLI argument compatibility profiles and overrides:
This builder now supports multiple CLI syntax families and key-value override maps.
dotenv # Default profile (recommended today) GLOBAL_CLI_ARGSF=revanced-cli
Built-in profile values:
- revanced-cli (default, current flag-based ReVanced CLI format)
- morphe-cli (morphe-style list-patches requires --patches)
Override maps use unordered `KEY=value` pairs in a single string:
```dotenv
GLOBAL_CLI_LPARGS="CMD=list-patches INDEX=-i PACKAGES=-p UNIVERSAL=-u VERSIONS=-v OPTIONS=-o PATCHES=__POSITIONAL__ PATCHES_POST= TEMPORARY_FILES_PATH="
GLOBAL_CLI_PARGS="CMD=patch PATCHES=-p PATCHES_POST= ENABLED=-e DISABLED=-d OPTIONS=-O PURGE=--purge KEYSTORE=--keystore KEYSTORE_ENTRY_ALIAS=--keystore-entry-alias=alias KEYSTORE_ENTRY_PASSWORD=--keystore-entry-password=ReVanced KEYSTORE_PASSWORD=--keystore-password=ReVanced EXCLUSIVE=--exclusive APK=__POSITIONAL__ OUTPUT=-o FORCE=--force RIP_LIB=--rip-lib TEMPORARY_FILES_PATH=-t"
```
`PATCHES_POST` is an optional companion argument appended after every patch bundle (used by ReVanced v6 with `-b`).
`TEMPORARY_FILES_PATH` is a dynamic argument; when a CLI profile sets it, the builder passes
`<apks>/<CLI_TEMP_FOLDER_NAME>/<patch-source-app-name>` so parallel patchers do not share purge-sensitive temp files.
ReVanced and Morphe patch commands expose `-t`; Morphe list-patches also exposes `-t`, while ReVanced list-patches does not.
`CONTINUE_ON_ERROR` is an optional patch flag; the built-in `morphe-cli` profile enables `--continue-on-error`
because Morphe can skip one failed patch while still producing the app.
App-level overrides are also supported and take precedence:
```dotenv
YOUTUBE_CLI_ARGSF=morphe-cli
YOUTUBE_CLI_LPARGS="PATCHES=--patches TEMPORARY_FILES_PATH=-t"
YOUTUBE_CLI_PARGS="PATCHES=-p STRIPLIBS=--striplibs TEMPORARY_FILES_PATH=-t"
```
Example configuration for the standard ReVanced CLI:
```dotenv
GLOBAL_CLI_ARGSF=revanced-cli
```
8. If you don't want to use default keystore. You can provide your own by
placing it inside apks folder. And adding the name of keystore-file in .env file or in ENVS in GitHub secrets (Recommended) in the format
GLOBAL_KEYSTORE_FILE_NAME=revanced.keystore
Tool also support providing secret key at app level. You can sign A app with X key while signing B with Y key. Example:
YOUTUBE_KEYSTORE_FILE_NAME=youtube.keystore
Note - If you are using your own keystore.And it was generated with cli > v4 Add Example:
GLOBAL_OLD_KEY=False
if you are using different key for different apps. You need to specify at app level. ```dotenv YOUTUBE_OLD_KEY=False
9. <a id="global-options-file"></a>If you don't want to use default options.json file. You can provide your own by
placing it inside `apks` folder. And adding the name of `options-file` in `.env` file or in `ENVS` in `GitHub
secrets` (Recommended) in the format
```dotenv
GLOBAL_OPTIONS_FILE=my_options.json
Tool also supports providing options file at app level. When an app-specific options file is provided, it is merged with the global options file. App-specific options override global options for the same patch name, while all other global options are preserved.
Example:
YOUTUBE_OPTIONS_FILE=my_cool_yt_options.json
Options Merging Example:
If your global options.json contains Theme and SponsorBlock options, and your app-specific
my_cool_yt_options.json contains only a custom package name option, the final merged options will include
all three. This is useful when using different patch sources (like Morphe, anddea, ReVanced) that require
different patch option names for the same functionality.
Global options.json App options.json Final Merged Options
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Theme │ │ Change package │ => │ Theme │
│ SponsorBlock │ + │ name │ │ SponsorBlock │
│ Custom branding │ └─────────────────┘ │ Change package │
└─────────────────┘ │ name │
└─────────────────┘
You can build only for a particular arch in order to get smaller apk files.This
can be done with by adding comma separated ARCHS_TO_BUILD in ENVS in GitHub secrets (Recommended) in the
format.
GLOABAL_ARCHS_TO_BUILD=arm64-v8a,armeabi-v7a
Tool also support configuring at app level.
Example:
YOUTUBE_ARCHS_TO_BUILD=arm64-v8a,armeabi-v7a
Note -
armeabi-v7a,x86,x86_64,arm64-v8aIf you want to include any extra file to the Github upload. Set comma arguments
in .env file or in ENVS in GitHub secrets (Recommended) in the format
# Exact filename match
EXTRA_FILES=<url>@<appName>.apk
# Regex pattern match for dynamic/versioned asset names
EXTRA_FILES=<url>@/<regex-pattern>/
Example:
EXTRA_FILES=https://github.com/inotia00/mMicroG/releases/[email protected]
# Regex example matching versioned MicroG filenames:
EXTRA_FILES=https://github.com/microg/GmsCore/releases/latest@/com\.google\.android\.gms-\d+\.apk$/
If you want to exclude any patch. Set comma separated patch in .env file
or in ENVS in GitHub secrets (Recommended) in the format
<APP_NAME>_EXCLUDE_PATCH=<PATCH_TO_EXCLUDE-1,PATCH_TO_EXCLUDE-2>
Example:
YOUTUBE_EXCLUDE_PATCH=custom-branding,hide-get-premium
YOUTUBE_MUSIC_EXCLUDE_PATCH=yt-music-is-shit
Note -
If you want to include any universal patch. Set comma separated patch in .env
file or in ENVS in GitHub secrets (Recommended) in the format
<APP_NAME>_INCLUDE_PATCH=<PATCH_TO_EXCLUDE-1,PATCH_TO_EXCLUDE-2>
| Key file to be used for signing apps |
| Builder's own key |
| GLOBAL_OLD_KEY* | Whether key was generated with cli v4(new) or not | Builder's v3(old) own key |
| GLOBAL_OPTIONS_FILE* | Options file to be used | Builder's default file |
| GLOBAL_ARCHS_TO_BUILD* | Arch to keep in the patched apk. | All |
| GLOBAL_CLI_ARGSF* | CLI argument profile (revanced-cli default) | revanced-cli |
| GLOBAL_CLI_LPARGS* | Override map for list-patches command args | None |
| GLOBAL_CLI_PARGS* | Override map for patch command args | None |
| CLI_TEMP_FOLDER_NAME | Parent folder for per-app CLI temporary files | patch-source-temporary-files |
| REDDIT_CLIENT_ID | Reddit Client ID to patch reddit apps | None |
| TELEGRAM_CHAT_ID | Receiver in Telegram upload | None |
| TELEGRAM_BOT_TOKEN | APKs Sender for Telegram upload | None |
| TELEGRAM_API_ID | Used for telegram Authentication | None |
| TELEGRAM_API_HASH | Used for telegram Authentication | None |
| EXTRA_FILES | Extra files apk to upload in GitHub upload. | None |
| APPRISE_URL | Apprise URL . | None |
| APPRISE_NOTIFICATION_TITLE | Apprise Notification Title . | None |
| APPRISE_NOTIFICATION_BODY | Apprise Notification Body . | None |
| MAX_RESOURCE_WORKERS | Maximum workers for downloading resources | 3 |
| MAX_PARALLEL_APPS | Maximum number of apps to process in parallel | 4 |
| DISABLE_CACHING | Disable download and resource caching | False |
| CLI argument profile for APP_NAME. |
| GLOBAL_CLI_ARGSF |
| APP_NAME_CLI_LPARGS | Override map for APP_NAME list-patches args. | GLOBAL_CLI_LPARGS |
| APP_NAME_CLI_PARGS | Override map for APP_NAME patch args. | GLOBAL_CLI_PARGS |
| APP_NAME_EXCLUDE_PATCH** | Patches to exclude while patching APP_NAME. | [] |
| APP_NAME_INCLUDE_PATCH** | Patches to include while patching APP_NAME. | [] |
| APP_NAME_VERSION | Version to use for download for patching. | Recommended by patch resources |
| APP_NAME_PACKAGE_NAME*** | Package name of the app to be patched | None |
| APP_NAME_DL_SOURCE*** | Download source of any of the supported scrapper | None |
| APP_NAME_DL*** | Direct download Link for clean apk | None |
** - You can also patch any other app which is not supported officially.To do so, you need to provide
few more inputs to the tool which are mentioned below. These config will override the sources config from the tool.
<APP_NAME>_DL_SOURCE=<apk-link-to-any-of-the-suppored-scrapper>
<APP_NAME>_PACKAGE_NAME=<package-name-of-the-application>
You can also provide DL to the clean apk instead of providing DL_SOURCES as mentioned in this note. Supported Scrappers are:
<APP_NAME>_DL_SOURCE
to apkeep (defaults to the google-play provider) or apkeep:<provider> to pick any provider apkeep
itself supports - e.g. apkeep:f-droid, apkeep:apk-pure.
apkeep or apkeep:<provider>apkeep:f-droid
Note - APKEEP_EMAIL and APKEEP_TOKEN (in the DOCKER_PY_REVANCED_SECRETS Github Secrets) are only
needed for the google-play provider, since that's the only one apkeep requires an authenticated
Google account for. google-play cannot download a specific <APP_NAME>_VERSION; use latest
for that provider. Only f-droid and apk-pure are documented by apkeep as supporting <APP_NAME>_VERSION
pinning to a specific version - other providers' version-pinning support isn't documented, so
don't assume it works there.Please verify the source of original APKs yourself with links provided. I'm not responsible for any damage caused.If you know any better/safe source to download clean. Open a discussion.
By default, script build the latest version mentioned in patches.json file.
Remember to download the Microg. Otherwise, you may not be able to open YouTube/YouTube Music.
By default, tool will build only youtube,youtube_music. To build other apps supported by patching
resources.Add the apps you want to build in .env file or in ENVS in GitHub secrets in the format
PATCH_APPS=<APP_NAME>
Example:
PATCH_APPS=youtube,twitter,reddit
Tip - If for some reason you want to patch app but want to go through all this .env while running you can enter app name in to be patched box.
If APKMirror or other apk sources are blocked in your region or script
somehow is unable to download from apkmirror. You can download apk manually from any source. Place them in
/apks directory and provide environment variable in .env file or in ENVS in GitHub secrets(Recommended)
in the format.
EXISTING_DOWNLOADED_APKS=<Comma,Seperate,App,Name>
Example:
EXISTING_DOWNLOADED_APKS=youtube,youtube_music
If you add above. Script will not download the youtube & youtube_musicapk from internet and expects an apk in
/apks folder with same name.
If you run script again & again. You might hit GitHub/GitLab API limits.
In that case you can provide your Personal Access Token in .env file or in ENVS in GitHub secrets (Recommended)
in the format -
PERSONAL_ACCESS_TOKEN=<PAT>
Alternatively, you can add a dedicated PERSONAL_ACCESS_TOKEN secret to the repo (Settings ->
Secrets and variables -> Actions) instead of embedding it in ENVS. It's used automatically unless
ENVS already sets PERSONAL_ACCESS_TOKEN to a non-empty value, in which case ENVS takes priority.
You can provide Direct download to the resource to used for patching apps .env file
or in ENVS in GitHub secrets (Recommended) in the format -
GLOBAL_CLI_DL=https://github.com/revanced/revanced-cli
GLOBAL_PATCHES_DL=https://api.revanced.app/v5/patches.rvp
The ReVanced API .rvp endpoint is the default patches source because it provides the binary patch bundle directly.
GitLab release URLs are also supported for resources. The tool resolves the latest release through GitLab's
release API and filters release links/sources with the same asset extension regex used for GitHub.
GLOBAL_CLI_DL=https://gitlab.com/example/revanced-cli
GLOBAL_PATCHES_DL=https://gitlab.com/example/revanced-patches/-/releases/permalink/latest
Resources downloaded from envs and will be used for patching for any APP_NAME. Unless provided different resource for the individual app. Tool also support resource config at app level. You can patch A app with X resources while patching B with Y resources. This can be done by providing Direct download link for resources for app. Example:
YOUTUBE_CLI_DL=https://github.com/inotia00/revanced-cli
YOUTUBE_PATCHES_DL=https://github.com/inotia00/revanced-patches
With the config tool will try to patch YouTube with resources from inotia00 while other global resource will used for patching other apps.
Multi-Patching Support: You can now use multiple patch bundles from different creators for the same app:
# Comma-separated URLs
YOUTUBE_PATCHES_DL=https://gitlab.com/revanced/revanced-patches,https://github.com/indrastorm/Dropped-patches
The tool will download all specified patch bundles and apply them together using the ReVanced CLI's multiple -p argument support.
If you have want to provide resource locally in the apks folder. You can specify that by mentioning filename
prefixed with local://.
Note - The link provided must be DLs. Unless they are from GitHub or GitLab.
Note - If your patches resource are available on GitHub/GitLab and you want to select latest resource without
excluding pre-release you can add latest-prerelease to the URL.
Example:
YOUTUBE_PATCHES_DL=https://github.com/inotia00/revanced-patches/releases/latest-prerelease
For above example tool while selecting latest patches will consider pre-releases/beta too.
For GitLab, latest-prerelease maps to GitLab's latest release because GitLab releases do not expose a separate
pre-release flag in the release API.
YOUTUBE_PATCHES_DL=https://github.com/inotia00/revanced-patches/releases/latest
For above example tool while selecting latest patches will exclude any pre-release/beta ie. will consider only
stable releases..
Note - Some of the patch source like inotia00 still provides - separated patches while revanced shifted to
Space formatted patches. Use SPACE_FORMATTED_PATCHES to define the type of patches.
Example:
YOUTUBE_INCLUDE_PATCH=remove-screenshot-restriction
Note -
If you want to build a specific version or latest version. Add version in .env file
or in ENVS in GitHub secrets (Recommended) in the format
<APP_NAME>_VERSION=<VERSION>
Example:
YOUTUBE_VERSION=17.31.36
YOUTUBE_MUSIC_VERSION=X.X.X
TWITTER_VERSION=latest
If you have your personal source for apk to be downloaded. You can also provide that and tool
will not scarp links from apk sources.Add dl in .env file or in ENVS in GitHub secrets (Recommended) in
the format
<APP_NAME>_DL=<direct-app-download>
Example:
YOUTUBE_DL=https://example.com/youtube.apk
For Telegram Upload.
id and save it to TELEGRAM_CHAT_ID
TELEGRAM_BOT_TOKEN - Telegram provides BOT_TOKEN. It works as sender. Open bot and
create one copy api key
TELEGRAM_API_ID - Telegram API_ID is provided by telegram here
TELEGRAM_API_HASH - Telegram API_HASH is provided by telegram here
Configuration defined in ENVS in GitHub secrets will override the configuration in .env file. You can use this
fact to define your normal configurations in .env file and sometimes if you want to build something different just
once. Add it in GitHub secrets.
Sample Envs
Apprise
We also have apprise support to upload built apk anywhere.To use apprise. Add belows envs in .env file
or in ENVS in GitHub secrets (Recommended) in the format
APPRISE_URL=tgram://bot-token/chat-id
APPRISE_NOTIFICATION_BODY=What a great Body
APPRISE_NOTIFICATION_TITLE=What a great title