GrapheneOS rooted and served via its own OTA server on GitHub pages
235
stars
417
commits
Shell
primary language
Sep 9, 2026
updated
GrapheneOS over the air updates (OTAs) patched with Magisk allowing for AVB and locked bootloader and root access.
Can be upgraded over the air using Custota and its own OTA server.
Allows for switching between magisk and rootless via OTA upgrades.
⚠️ OS and root work in general. However, with upstream magisk zygisk does not (and likely never will) work, leading to magisk being easily discovered by other apps and lots of banking apps not working.
As an alternative we offer pixincreate's magisk that contains patches to make zygisk work. Before using it please note that this way you add another party to your supply chain that basically gains root acces to your device.
See below for more details and the reason why kernelsu cannot be integrated easily with this project.
See rooted-graphene/ota | .github/workflows/release-multiple.yaml.
I plan to support as many devices as the GitHub Action limit allows for as long as this project is useful to me.
If you would like to see more devices, add them via PR to the file mentioned above.
Alternatively, it's easy to set up your own builds, which also makes you the owner of the signing keys.
If this project is useful to you, please consider donating to GrapheneOS.
Please note that rooted-graphene is not an official GrapheneOS project.
As they do most of the heavy lifting, I think they deserve every support they can get.
These are only changes related to rooted-graphene, not GrapheneOS itself.
See grapheneos.org/releases for that.
Rooted-graphene opts-in to use the stable-security-preview.
Basically, this gets us security fixes a lot faster at the cost of patches not being open source at the moment of release.
The fact that rooted-graphene is patched into the original OTA binaries and not built from source makes this possible.
If you prefer staying with stable you can easily set up your own builds and set
OTA_CHANNEL to stable.
More info:
We're allowed to provide an early release with these patches and to list the CVEs but must wait until the embargo ends to publish sources or details on the patches. The positive side is that we can now provide patches to people who truly need them without even the previous 1 month embargo delay. https://grapheneos.org/releases#2025092500
We do consider the security previews to be the normal and recommended choice. https://grapheneos.social/@GrapheneOS/115272851393143127
Upgrade to Custota 5.12, which contained a major regression where settings did not get migrated properly and got reset. Unfortunately, you will have to set the OTA URL again, to get the next update.
Fixed with Custota 5.13, 6dc6c4f on July 18, 2025.
- Updating to this version will automatically restore the old settings without any manual intervention
- If noticed your settings get reset in 5.12 and already reconfigured the app, your new settings will not be touched.
Upgrades to magisk 29.
There seems to be a bug that can occur with magisk updates and avbroot.
chenxiaolong/avbroot#455 (comment)
contains some approaches to troubleshooting. This worked for me (at the expense of resetting Magisk's settings);
su -c 'rm -r /data/adb/magisk* && reboot'
See also rooted-graphene#5.
The OTA builds moved into a separate GitHub organization to get full GitHub action minutes budget.
With this, it is possible to add support for devices discontinued lately again 🥳.
⚠️ You need to change the OTA server url in custota app to either
https://rooted-graphene.github.io/ota/magisk
or
https://rooted-graphene.github.io/ota/rootless
Note that the old URL https://schnatterer.github.io/rooted-graphene/ will no longer receive new OTAs soon.
Some more details:
-magisk flavor of rooted-graphene, the custota magisk module should be automatically disabled
on start. You can safely remove it. Custota is now a system app.-rootless flavor the custota should be new, so no problems.-magisk flavor).adb sideload the -magisk first. Then custota should work as a system app.
Then you should be able to switch to -rootless with custota working.
Here are some troubleshooting tipps.
Version in custota and then selecting Allow reinstall.-magisk to -rootless (and back if everything works as planned)./sdcard/Android/data/com.chiller3.custota//data/ota_packagecare_map.pbadb, see #82.avb_pkmd.bin from this repo.⚠️ Please be aware that there is always some risk involved when flashing your device.
Especially since the first Device is corrupt. It can't be trusted messages started appearing in 2025032500.
In relation to this error,
we heard multiple reports about hard bricks.
The steps listed below should work around this issue, though.
Still, if flashing fails, don't switch the slot.
Read through the comments on this issue or reach out for help.
In case your device should refuse to boot, this project might be helpful.
Be careful! I only provide this software. You are using it at your own risk.
Using the web installer is easier, but will always install the latest version. So it's not possible to verify if OTA upgrades work right away.
Use the web installer to install GrapheneOS:
Downloaded caiman-install-2024123000.zip release.Locking the bootloader and close the browser.
We'll lock the bootloader later!Alternative method to Web installer.
Download factory image and follow the official instructions to install GrapheneOS.
When downloading the "Install zip", change the last digit in the URL from 0 to 1!
This way you get the security-preview version right away and won't have to switch after installation.
e.g. from https://releases.grapheneos.org/tegu-install-2025122500.zip
to https://releases.grapheneos.org/tegu-install-2025122501.zip
TLDR:
Enable OEM unlocking
Obtain latest fastboot (version >= 35.0.1, as earlier ones have issues with flashing dynamic partitions. GrapheneOS's flash-all.sh also enforces this)
Unlock Bootloader:
Enable usb debugging and execute adb reboot bootloader, or
The easiest approach is to reboot the device and begin holding the volume down button until it boots up into the bootloader interface.
fastboot flashing unlock
flash factory image
bsdtar xvf DEVICE_NAME-factory-VERSION.zip # tar on windows and mac
./flash-all.sh # or .bat on windows
Stop after that and reboot (leave bootloader unlocked)
Once GrapheneOS is installed
Download the OTA from releases with the same version (except 00 at the end is 01, see security-preview) that you just installed.
Obtain latest fastboot
Install avbroot
Extract the partition images from the patched OTA that are different from the original.
avbroot ota extract \
--input /path/to/ota.zip.patched \
--directory extracted \
--fastboot
Set this environment variable to match the extracted folder:
For Linux/macOS:
export ANDROID_PRODUCT_OUT=extracted
For Windows (powershell):
$env:ANDROID_PRODUCT_OUT = "extracted"
or (bat):
set ANDROID_PRODUCT_OUT=extracted
Flash the partitions using the command:
fastboot flashall --skip-reboot
Set up the custom AVB public key in the bootloader.
(If you built your own OTA, use your avb_pkmd.bin.)
fastboot reboot-bootloader
fastboot erase avb_custom_key
curl -s https://raw.githubusercontent.com/rooted-graphene/ota/refs/heads/main/avb_pkmd.bin > avb_pkmd.bin
fastboot flash avb_custom_key avb_pkmd.bin
Sideload the OTA
(to avoid Device is corrupt. It can't be trusted error)
fastboot reboot recovery to get into recovery modeadb sideload <path to ota zip>If you installed using the web installer (or installed manually without security-preview) start the device and switch to the security-preview version during the startup wizard.
Then return to the bootloader (e.g. by using the volume button).
See anouncement and #202 for details.
Lock the bootloader using the following command. This will trigger a data wipe again.
fastboot flashing lock
Confirm by pressing volume down and then power. Then reboot.
Remember: Do not uncheck OEM unlocking! (to avoid hard-bricking)
That is, in Graphene's startup wizard, leave this box unticked 👇️
Note: The OTA contains OEMUnlockOnBoot, so OEM locking should be impossible.
Still, better safe than sorry, keep it unlocked.
Alternatively you could do updates manually via adb sideload:
No command message, press the volume up button once while holding down the power button.Apply update from ADB. Confirm by pressing power buttonadb sideload xyz.zipTo remove root, you can change to the "rootless" flavor.
To do so, set the following URL in custota: https://rooted-graphene.github.io/ota/rootless/
And then upgrade.
(if custota should tell you that you're on the latest version, you can force an upgrade by long pressing Version and
then selecting Allow reinstall).
If you want to gain root again, just switch back to this URL in custota: https://rooted-graphene.github.io/ota/magisk/ And then upgrade.
See release-multiple.yaml for examples.
How to extract:
avbroot ota extract \
--input /path/to/ota.zip \
--directory . \
--boot-only
Pre-init storage partition device ID: <name>avbroot boot magisk-info \
--image magisk_patched-*.img
bash -c 'source rooted-ota.sh && generateKeys' and store them in a dry and safe place.https://github.com/$YOU/$YOUR_REPO/settings/secrets/actions)
base64 -w0 < ota.crt)base64 -w0 < avb.key)base64 -w0 < ota.key)avb.key)ota.key).github/workflows/release-multiple.yaml
See Magisk preinit string.This sets up a cron job that builds the latest version of GrapheneOS, nightly.
This way, you won't have too many maintenance efforts but own your own signing key!
You can also add a 3rd-party-magisk package if you're willing to trust the authors
(see Using other rooting mechanisms).
Alternatively, search the forks if someone maintains the device of your choice.
Be aware that you would also have to trust them in addition to me, chenxiaolong (the author of avbroot and Custota),
the authors of magisk, the authors of GrapheneOS, and the authors of the android open source project.
You can use the rooted-ota.sh script in this repo to create your own OTAs and run your own OTA server.
# Generate keys
bash -c 'source rooted-ota.sh && generateKeys'
# Enter passphrases interactively
DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
# Enter passphrases via env (e.g. on CI)
export PASSPHRASE_AVB=1
export PASSPHRASE_OTA=1
DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
For IDs see grapheneos.org/releases. For Magisk preinit see,e.g. here.
See GitHub actions for automating this:
GITHUB_TOKEN=gh... \
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
bash -c '. rooted-ota.sh && createAndReleaseRootedOta'
As magisk does not seem a perfect match for GrapheneOS, you might be looking for alternatives.
I had a first go at patching kernelsu which booted but did not provide root. Patching kernelsu is much more complex that patching magisk. It might even be impossible to run GrapheneOS with it, without building GrapheneOS from scratch. Also, some parts of kernelsu seem to be closed source, which feels suspicious and inappropriate for a tool with so much influence on your device.
Another alternative might be to use a version of magisk (like the one maintained by pixincreate) that contains patches to make zygisk work.
This still has some limitations, like certain modules checking for magisk's signature won't work.
This variant can be built as an additional pixincreate flavor, next to the regular magisk and rootless ones.
It is disabled by default, so it is never silently forced on existing users. Enable it by setting SKIP_PIXINCREATE=false
(or the skip-pixincreate input in release-single.yaml). It requires MAGISK_PREINIT_DEVICE to be set, just like the regular magisk flavor,
and it reuses MAGISK_VERSION, since the fork uses the same tags as upstream magisk.
If you only want the pixincreate flavor, you can additionally set SKIP_MAGISK=true.
The resulting OTAs are published as a separate flavor, so in Custota you would point to the pixincreate path of your OTA server, e.g.
https://rooted-graphene.github.io/ota/pixincreate. As with the other flavors, you can switch between them via OTA updates.
⚠️ By using this flavor you also have to trust the authors of that fork, in addition to everyone listed above. Another option might be Kitsune magisk.
In general, using magisk and especially zygisk with Graphene seems to have the risk of breaking things with every new release.
It's good to have the rootless version as a fallback!
# DEBUG some parts of the script interactively
DEBUG=1 bash --init-file rooted-ota.sh
# Test loading secrets from env
PASSPHRASE_AVB=1 PASSPHRASE_OTA=1 bash -c '. rooted-ota.sh && key2base64 && KEY_AVB=doesnotexist createAndReleaseRootedOta'
# Avoid having to download OTA all over again: SKIP_CLEANUP=true or:
mkdir -p .tmp && ln -s $PWD/shiba-ota_update-2023121200.zip .tmp/shiba-ota_update-2023121200.zip
# Test only patching
export PASSPHRASE_AVB=x PASSPHRASE_OTA=y
SKIP_CLEANUP=true DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
# Test only releasing
GITHUB_TOKEN=gh... \
DEBUG=true \
GITHUB_REPO=schnatterer/rooted-graphene \
OTA_VERSION=2025021100 \
RELEASE_ID='' \
bash -c '. rooted-ota.sh && releaseOta'
# Test only GH pages deployment
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
bash -c '. rooted-ota.sh && findLatestVersion && checkBuildNecessary && createOtaServerData && uploadOtaServerData'
# e2e test
GITHUB_TOKEN=gh... \
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
SKIP_CLEANUP=true \
DEBUG=1 \
bash -c '. rooted-ota.sh && createAndReleaseRootedOta'
https://github.com/MuratovAS/grapheneos-magisk/blob/main/docker/Dockerfile
https://xdaforums.com/t/guide-to-lock-bootloader-while-using-rooted-otaos-magisk-root.4510295/
Shell
100.0%
GrapheneOS rooted and served via its own OTA server on GitHub pages
235
stars
417
commits
Shell
primary language
Sep 9, 2026
updated
GrapheneOS over the air updates (OTAs) patched with Magisk allowing for AVB and locked bootloader and root access.
Can be upgraded over the air using Custota and its own OTA server.
Allows for switching between magisk and rootless via OTA upgrades.
⚠️ OS and root work in general. However, with upstream magisk zygisk does not (and likely never will) work, leading to magisk being easily discovered by other apps and lots of banking apps not working.
As an alternative we offer pixincreate's magisk that contains patches to make zygisk work. Before using it please note that this way you add another party to your supply chain that basically gains root acces to your device.
See below for more details and the reason why kernelsu cannot be integrated easily with this project.
See rooted-graphene/ota | .github/workflows/release-multiple.yaml.
I plan to support as many devices as the GitHub Action limit allows for as long as this project is useful to me.
If you would like to see more devices, add them via PR to the file mentioned above.
Alternatively, it's easy to set up your own builds, which also makes you the owner of the signing keys.
If this project is useful to you, please consider donating to GrapheneOS.
Please note that rooted-graphene is not an official GrapheneOS project.
As they do most of the heavy lifting, I think they deserve every support they can get.
These are only changes related to rooted-graphene, not GrapheneOS itself.
See grapheneos.org/releases for that.
Rooted-graphene opts-in to use the stable-security-preview.
Basically, this gets us security fixes a lot faster at the cost of patches not being open source at the moment of release.
The fact that rooted-graphene is patched into the original OTA binaries and not built from source makes this possible.
If you prefer staying with stable you can easily set up your own builds and set
OTA_CHANNEL to stable.
More info:
We're allowed to provide an early release with these patches and to list the CVEs but must wait until the embargo ends to publish sources or details on the patches. The positive side is that we can now provide patches to people who truly need them without even the previous 1 month embargo delay. https://grapheneos.org/releases#2025092500
We do consider the security previews to be the normal and recommended choice. https://grapheneos.social/@GrapheneOS/115272851393143127
Upgrade to Custota 5.12, which contained a major regression where settings did not get migrated properly and got reset. Unfortunately, you will have to set the OTA URL again, to get the next update.
Fixed with Custota 5.13, 6dc6c4f on July 18, 2025.
- Updating to this version will automatically restore the old settings without any manual intervention
- If noticed your settings get reset in 5.12 and already reconfigured the app, your new settings will not be touched.
Upgrades to magisk 29.
There seems to be a bug that can occur with magisk updates and avbroot.
chenxiaolong/avbroot#455 (comment)
contains some approaches to troubleshooting. This worked for me (at the expense of resetting Magisk's settings);
su -c 'rm -r /data/adb/magisk* && reboot'
See also rooted-graphene#5.
The OTA builds moved into a separate GitHub organization to get full GitHub action minutes budget.
With this, it is possible to add support for devices discontinued lately again 🥳.
⚠️ You need to change the OTA server url in custota app to either
https://rooted-graphene.github.io/ota/magisk
or
https://rooted-graphene.github.io/ota/rootless
Note that the old URL https://schnatterer.github.io/rooted-graphene/ will no longer receive new OTAs soon.
Some more details:
-magisk flavor of rooted-graphene, the custota magisk module should be automatically disabled
on start. You can safely remove it. Custota is now a system app.-rootless flavor the custota should be new, so no problems.-magisk flavor).adb sideload the -magisk first. Then custota should work as a system app.
Then you should be able to switch to -rootless with custota working.
Here are some troubleshooting tipps.
Version in custota and then selecting Allow reinstall.-magisk to -rootless (and back if everything works as planned)./sdcard/Android/data/com.chiller3.custota//data/ota_packagecare_map.pbadb, see #82.avb_pkmd.bin from this repo.⚠️ Please be aware that there is always some risk involved when flashing your device.
Especially since the first Device is corrupt. It can't be trusted messages started appearing in 2025032500.
In relation to this error,
we heard multiple reports about hard bricks.
The steps listed below should work around this issue, though.
Still, if flashing fails, don't switch the slot.
Read through the comments on this issue or reach out for help.
In case your device should refuse to boot, this project might be helpful.
Be careful! I only provide this software. You are using it at your own risk.
Using the web installer is easier, but will always install the latest version. So it's not possible to verify if OTA upgrades work right away.
Use the web installer to install GrapheneOS:
Downloaded caiman-install-2024123000.zip release.Locking the bootloader and close the browser.
We'll lock the bootloader later!Alternative method to Web installer.
Download factory image and follow the official instructions to install GrapheneOS.
When downloading the "Install zip", change the last digit in the URL from 0 to 1!
This way you get the security-preview version right away and won't have to switch after installation.
e.g. from https://releases.grapheneos.org/tegu-install-2025122500.zip
to https://releases.grapheneos.org/tegu-install-2025122501.zip
TLDR:
Enable OEM unlocking
Obtain latest fastboot (version >= 35.0.1, as earlier ones have issues with flashing dynamic partitions. GrapheneOS's flash-all.sh also enforces this)
Unlock Bootloader:
Enable usb debugging and execute adb reboot bootloader, or
The easiest approach is to reboot the device and begin holding the volume down button until it boots up into the bootloader interface.
fastboot flashing unlock
flash factory image
bsdtar xvf DEVICE_NAME-factory-VERSION.zip # tar on windows and mac
./flash-all.sh # or .bat on windows
Stop after that and reboot (leave bootloader unlocked)
Once GrapheneOS is installed
Download the OTA from releases with the same version (except 00 at the end is 01, see security-preview) that you just installed.
Obtain latest fastboot
Install avbroot
Extract the partition images from the patched OTA that are different from the original.
avbroot ota extract \
--input /path/to/ota.zip.patched \
--directory extracted \
--fastboot
Set this environment variable to match the extracted folder:
For Linux/macOS:
export ANDROID_PRODUCT_OUT=extracted
For Windows (powershell):
$env:ANDROID_PRODUCT_OUT = "extracted"
or (bat):
set ANDROID_PRODUCT_OUT=extracted
Flash the partitions using the command:
fastboot flashall --skip-reboot
Set up the custom AVB public key in the bootloader.
(If you built your own OTA, use your avb_pkmd.bin.)
fastboot reboot-bootloader
fastboot erase avb_custom_key
curl -s https://raw.githubusercontent.com/rooted-graphene/ota/refs/heads/main/avb_pkmd.bin > avb_pkmd.bin
fastboot flash avb_custom_key avb_pkmd.bin
Sideload the OTA
(to avoid Device is corrupt. It can't be trusted error)
fastboot reboot recovery to get into recovery modeadb sideload <path to ota zip>If you installed using the web installer (or installed manually without security-preview) start the device and switch to the security-preview version during the startup wizard.
Then return to the bootloader (e.g. by using the volume button).
See anouncement and #202 for details.
Lock the bootloader using the following command. This will trigger a data wipe again.
fastboot flashing lock
Confirm by pressing volume down and then power. Then reboot.
Remember: Do not uncheck OEM unlocking! (to avoid hard-bricking)
That is, in Graphene's startup wizard, leave this box unticked 👇️
Note: The OTA contains OEMUnlockOnBoot, so OEM locking should be impossible.
Still, better safe than sorry, keep it unlocked.
Alternatively you could do updates manually via adb sideload:
No command message, press the volume up button once while holding down the power button.Apply update from ADB. Confirm by pressing power buttonadb sideload xyz.zipTo remove root, you can change to the "rootless" flavor.
To do so, set the following URL in custota: https://rooted-graphene.github.io/ota/rootless/
And then upgrade.
(if custota should tell you that you're on the latest version, you can force an upgrade by long pressing Version and
then selecting Allow reinstall).
If you want to gain root again, just switch back to this URL in custota: https://rooted-graphene.github.io/ota/magisk/ And then upgrade.
See release-multiple.yaml for examples.
How to extract:
avbroot ota extract \
--input /path/to/ota.zip \
--directory . \
--boot-only
Pre-init storage partition device ID: <name>avbroot boot magisk-info \
--image magisk_patched-*.img
bash -c 'source rooted-ota.sh && generateKeys' and store them in a dry and safe place.https://github.com/$YOU/$YOUR_REPO/settings/secrets/actions)
base64 -w0 < ota.crt)base64 -w0 < avb.key)base64 -w0 < ota.key)avb.key)ota.key).github/workflows/release-multiple.yaml
See Magisk preinit string.This sets up a cron job that builds the latest version of GrapheneOS, nightly.
This way, you won't have too many maintenance efforts but own your own signing key!
You can also add a 3rd-party-magisk package if you're willing to trust the authors
(see Using other rooting mechanisms).
Alternatively, search the forks if someone maintains the device of your choice.
Be aware that you would also have to trust them in addition to me, chenxiaolong (the author of avbroot and Custota),
the authors of magisk, the authors of GrapheneOS, and the authors of the android open source project.
You can use the rooted-ota.sh script in this repo to create your own OTAs and run your own OTA server.
# Generate keys
bash -c 'source rooted-ota.sh && generateKeys'
# Enter passphrases interactively
DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
# Enter passphrases via env (e.g. on CI)
export PASSPHRASE_AVB=1
export PASSPHRASE_OTA=1
DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
For IDs see grapheneos.org/releases. For Magisk preinit see,e.g. here.
See GitHub actions for automating this:
GITHUB_TOKEN=gh... \
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
bash -c '. rooted-ota.sh && createAndReleaseRootedOta'
As magisk does not seem a perfect match for GrapheneOS, you might be looking for alternatives.
I had a first go at patching kernelsu which booted but did not provide root. Patching kernelsu is much more complex that patching magisk. It might even be impossible to run GrapheneOS with it, without building GrapheneOS from scratch. Also, some parts of kernelsu seem to be closed source, which feels suspicious and inappropriate for a tool with so much influence on your device.
Another alternative might be to use a version of magisk (like the one maintained by pixincreate) that contains patches to make zygisk work.
This still has some limitations, like certain modules checking for magisk's signature won't work.
This variant can be built as an additional pixincreate flavor, next to the regular magisk and rootless ones.
It is disabled by default, so it is never silently forced on existing users. Enable it by setting SKIP_PIXINCREATE=false
(or the skip-pixincreate input in release-single.yaml). It requires MAGISK_PREINIT_DEVICE to be set, just like the regular magisk flavor,
and it reuses MAGISK_VERSION, since the fork uses the same tags as upstream magisk.
If you only want the pixincreate flavor, you can additionally set SKIP_MAGISK=true.
The resulting OTAs are published as a separate flavor, so in Custota you would point to the pixincreate path of your OTA server, e.g.
https://rooted-graphene.github.io/ota/pixincreate. As with the other flavors, you can switch between them via OTA updates.
⚠️ By using this flavor you also have to trust the authors of that fork, in addition to everyone listed above. Another option might be Kitsune magisk.
In general, using magisk and especially zygisk with Graphene seems to have the risk of breaking things with every new release.
It's good to have the rootless version as a fallback!
# DEBUG some parts of the script interactively
DEBUG=1 bash --init-file rooted-ota.sh
# Test loading secrets from env
PASSPHRASE_AVB=1 PASSPHRASE_OTA=1 bash -c '. rooted-ota.sh && key2base64 && KEY_AVB=doesnotexist createAndReleaseRootedOta'
# Avoid having to download OTA all over again: SKIP_CLEANUP=true or:
mkdir -p .tmp && ln -s $PWD/shiba-ota_update-2023121200.zip .tmp/shiba-ota_update-2023121200.zip
# Test only patching
export PASSPHRASE_AVB=x PASSPHRASE_OTA=y
SKIP_CLEANUP=true DEVICE_ID=oriole MAGISK_PREINIT_DEVICE='metadata' bash -c '. rooted-ota.sh && createRootedOta'
# Test only releasing
GITHUB_TOKEN=gh... \
DEBUG=true \
GITHUB_REPO=schnatterer/rooted-graphene \
OTA_VERSION=2025021100 \
RELEASE_ID='' \
bash -c '. rooted-ota.sh && releaseOta'
# Test only GH pages deployment
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
bash -c '. rooted-ota.sh && findLatestVersion && checkBuildNecessary && createOtaServerData && uploadOtaServerData'
# e2e test
GITHUB_TOKEN=gh... \
GITHUB_REPO=schnatterer/rooted-graphene \
DEVICE_ID=oriole \
MAGISK_PREINIT_DEVICE=metadata \
SKIP_CLEANUP=true \
DEBUG=1 \
bash -c '. rooted-ota.sh && createAndReleaseRootedOta'
https://github.com/MuratovAS/grapheneos-magisk/blob/main/docker/Dockerfile
https://xdaforums.com/t/guide-to-lock-bootloader-while-using-rooted-otaos-magisk-root.4510295/
Shell
100.0%