πŸ€“Docker-Py-ReVanced

July 31, 2026 Β· View on GitHub

Docker Pulls

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.

Pre-Built APKs

You can get pre-built apks here

Facing issues? Click here.

Build Yourself

You can use any of the following methods to build.

  • πŸš€ GitHub (Recommended)

    1. Click Star to support the project.

    2. Fork the project.

    3. Add ENVS (optional) secret to the repo. Required only if you want to cook specific apps/versions.

      🚢Detailed step by step guide
      • Go to the repo settings and then to actions->secret

      • Add Repository secret
    4. Go to actions tab. Select Build & Release.Click on Run Workflow.

      🚢Detailed step by step guide
      • Go to actions tab

      • Check the status of build, It should look green.
    5. If the building process is successful, you'll get your APKs in the

    6. Make sure to do below steps once in a while(daily or weekly) to keep the builder bug free.

  • 🐳 Docker Compose

    1. Install Docker Desktop.
    2. Clone the repo
      git clone https://github.com/nikhilbadyal/docker-py-revanced
      
    3. cd to the cloned repo
      cd docker-py-revanced
      
    4. Update .env file if you want some customization(See notes)
    5. Run script with
      docker compose up --build
      
  • 🐳With Docker

    1. Install Docker or Docker Desktop.
      curl -fsSL https://get.docker.com -o get-docker.sh
      sh get-docker.sh
      
    2. Run script with
      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

    1. Install Java >= 21
    2. Install Python >= 3.11
    3. Create virtual environment
      python3 -m venv venv
      
    4. Activate virtual environment
      source venv/bin/activate
      
    5. Install Dependencies with
      pip install -r requirements.txt
      
    6. Run the script with
      python main.py
      

Configurations

Global Config

Env NameDescriptionDefault
PATCH_APPSApps to patch/buildyoutube
EXISTING_DOWNLOADED_APKS Already downloaded clean apks[]
PERSONAL_ACCESS_TOKENGitHub/GitLab Token to be usedNone
DRY_RUNDo a dry runFalse
GLOBAL_CLI_DL*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*Key file to be used for signing appsBuilder'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 usedBuilder'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 argsNone
GLOBAL_CLI_PARGS*Override map for patch command argsNone
CLI_TEMP_FOLDER_NAMEParent folder for per-app CLI temporary filespatch-source-temporary-files
REDDIT_CLIENT_IDReddit Client ID to patch reddit appsNone
TELEGRAM_CHAT_IDReceiver in Telegram uploadNone
TELEGRAM_BOT_TOKENAPKs Sender for Telegram uploadNone
TELEGRAM_API_IDUsed for telegram AuthenticationNone
TELEGRAM_API_HASHUsed for telegram AuthenticationNone
EXTRA_FILESExtra files apk to upload in GitHub upload.None
APPRISE_URLApprise URL .None
APPRISE_NOTIFICATION_TITLEApprise Notification Title .None
APPRISE_NOTIFICATION_BODYApprise Notification Body .None
MAX_RESOURCE_WORKERSMaximum workers for downloading resources3
MAX_PARALLEL_APPSMaximum number of apps to process in parallel4
DISABLE_CACHINGDisable download and resource cachingFalse

* - Can be overridden for individual app.

App Level Config

Env NameDescriptionDefault
APP_NAME_CLI_DLDL for CLI to be used for patching APP_NAME.(Disabled Temp)GLOBAL_CLI_DL
APP_NAME_PATCHES_DLDL for Patches to be used for patching APP_NAME. Supports multiple bundles via comma separation.GLOBAL_PATCHES_DL
APP_NAME_SPACE_FORMATTED_PATCHESWhether patches are space formatted. APP_NAME.GLOBAL_SPACE_FORMATTED_PATCHES
APP_NAME_KEYSTORE_FILE_NAMEKey file to be used for signing APP_NAME.GLOBAL_KEYSTORE_FILE_NAME
APP_NAME_OLD_KEYWhether key used was generated with cli > v4(new)

APP_NAME.

GLOBAL_OLK_KEY
APP_NAME_ARCHS_TO_BUILDArch to keep in the patched APP_NAME.GLOBAL_ARCHS_TO_BUILD
APP_NAME_CLI_ARGSFCLI argument profile for APP_NAME.GLOBAL_CLI_ARGSF
APP_NAME_CLI_LPARGSOverride map for APP_NAME list-patches args.GLOBAL_CLI_LPARGS
APP_NAME_CLI_PARGSOverride 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_VERSIONVersion to use for download for patching.Recommended by patch resources
APP_NAME_PACKAGE_NAME***Package name of the app to be patchedNone
APP_NAME_DL_SOURCE***Download source of any of the supported scrapperNone
APP_NAME_DL***Direct download Link for clean apkNone

** - 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).

Note

  1. Officially Supported values for APP_NAME** are :


    ** - 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:

    1. APKMIRROR - Supports downloading any available version
      1. Link Format - https://www.apkmirror.com/apk//app-name/
      2. Example Link - https://www.apkmirror.com/apk/google-inc/youtube/
    2. UPTODOWN - Supports downloading any available version
      1. Link Format - https://.en.uptodown.com/android
      2. Example Link - https://spotify.en.uptodown.com/android
    3. APKEEP - Support downloading using APKEEP
      1. Link Format - apkeep
      2. Example Link - apkeep Note - You need to provide APKEEP_EMAIL and APKEEP_TOKEN in the DOCKER_PY_REVANCED_SECRETS Github Secrets.


    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.

  2. By default, script build the latest version mentioned in patches.json file.

  3. Remember to download the Microg. Otherwise, you may not be able to open YouTube/YouTube Music.

  4. 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.

  5. 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.

  6. 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>
    
  7. 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.

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            β”‚
                                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. 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 -

    1. Possible values are: armeabi-v7a,x86,x86_64,arm64-v8a
    2. Make sure the patching resource(CLI) support this feature.
  2. If 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

    EXTRA_FILES=<url>@<appName>.apk
    

    Example:

     EXTRA_FILES=https://github.com/inotia00/mMicroG/releases/latest@mmicrog.apk
    
  3. 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 -

    1. All the patches for an app are included by default.
    2. Revanced patches are provided as space separated, make sure you type those - separated here. It means a patch named Hey There must be entered as hey-there in the above example.
  4. 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>
    

    Example:

     YOUTUBE_INCLUDE_PATCH=remove-screenshot-restriction
    

    Note -

    1. Revanced patches are provided as space separated, make sure you type those - separated here. It means a patch named Hey There must be entered as hey-there in the above example.
  5. 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
    
  6. 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
    
  7. For Telegram Upload.

    1. Set up a telegram channel, send a message to it and forward the message to this telegram bot
    2. Copy id and save it to TELEGRAM_CHAT_ID

    3. TELEGRAM_BOT_TOKEN - Telegram provides BOT_TOKEN. It works as sender. Open bot and create one copy api key

    4. TELEGRAM_API_ID - Telegram API_ID is provided by telegram here

    5. TELEGRAM_API_HASH - Telegram API_HASH is provided by telegram here

    6. After Everything done successfully a part of the actions secrets of the repository may look like
  8. 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.

  9. Sample Envs

  10. 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
    
  11. Obtainium
    We support generating HTML files for Obtainium to scrape and download the latest patched APKs directly from your GitHub Releases. Enable this only when you are comfortable exposing a public APK discovery URL for your fork or self-hosted setup. Add below envs in .env file or in ENVS in GitHub secrets (Recommended) in the format

    OBTAINIUM_EXPORT=true
    

    This will generate an obtainium_sources/ folder in the changelogs branch containing HTML files (e.g., youtube.html). You can then add the raw GitHub URL of these HTML files to Obtainium as an "HTML" source. Example URL: https://raw.githubusercontent.com/<user>/<repo>/changelogs/obtainium_sources/youtube.html Obtainium's HTML source can use the APK link hash as its release ID, so patch-only updates are detected through the generated release asset name without requiring a custom version extraction regex.

    Optional Configuration:

    OBTAINIUM_GITHUB_TAG=latest
    

    By default, links point to the latest release. If you want to link to a specific tag, set this variable.

    Warning: Ensure your CI workflow is configured to release with the exact tag you specify. The default CI uses dynamic timestamp-based tags.