<- Back to documentation

Installing CopperheadOS

Supported devices

CopperheadOS currently supports the following devices:

  • Nexus 5X (bullhead)
  • Nexus 6P (angler)
  • Pixel (sailfish)
  • Pixel XL (marlin)

Official builds for Pixel phones will only be available as a product but these instructions can be used to flash unofficial builds from the sources.


You should have at least 4GB of memory to avoid problems.

You can obtain the adb and fastboot tools from the Android SDK. Either install Android Studio or use the standalone SDK. Do not use distribution packages for adb and fastboot. Distribution packages are out-of-date and not compatible with the latest version of Android. An obsolete fastboot will result in corrupted installations and potentially bricked devices. Do not make the common mistake of assuming that everything will be fine and ignoring these instructions. Double check that the first fastboot in your PATH is indeed from an up-to-date SDK installation:

which fastboot

To set up a minimal SDK installation without Android Studio on Linux:

mkdir ~/sdk
cd ~/sdk

Run an initial update, which will also install platform-tools and patcher;v4:

tools/bin/sdkmanager --update

For running the Compatibility Test Suite you’ll also need the build-tools for aapt:

tools/bin/sdkmanager 'build-tools;25.0.3'

To make your life easier, add the directories to your PATH in your shell profile configuration:

export PATH="$PATH:$HOME/sdk/tools:$HOME/sdk/tools/bin:$HOME/sdk/platform-tools:$HOME/sdk/build-tools/25.0.3"
export ANDROID_HOME="$HOME/sdk"

This is not mandatory, since you can run them from ~/sdk/platform-tools directly.

You should update the sdk before use from this point onwards:

sdkmanager --update

Enabling OEM unlocking

OEM unlocking needs to be enabled from within the operating system.

Enable the developer settings menu by going to Settings -> About device and pressing on the build number menu entry until developer mode is enabled.

Next, go to Settings -> Developer settings and toggle on the ‘Enable OEM unlocking’ setting.

Obtaining factory images

The initial install should be performed by flashing the factory images. This will wipe all the existing data. The factory images tarball can be downloaded from the builds page.

Verify the factory images using the GPG signature:

gpg --recv-keys 65EEFE022108E2B708CBFCF7F9E712E59AF5F22A
gpg --verify sailfish-factory-2017. sailfish-factory-2017.

Flashing factory images

First, boot into the bootloader interface. You can do this by turning off the device and then turning it on by holding both the Volume Down and Power buttons. Alternatively, you can use adb reboot bootloader from Android.

The bootloader now needs to be unlocked to allow flashing new images:

fastboot flashing unlock

The command needs to be confirmed on the device.

Next, extract the factory images and run the script to flash them. Note that the fastboot command run by the flashing script requires a fair bit of free space in a temporary directory, which defaults to /tmp:

tar xvf sailfish-factory-2017.
cd sailfish-n2g47j

Use a different temporary directory if your /tmp doesn’t have 2GiB available:

mkdir tmp
TMPDIR=$PWD/tmp ./

You should now proceed to locking the bootloader before using the device as locking wipes the data again.

Locking the bootloader

Locking the bootloader is important as it enables full verified boot. It also prevents using fastboot to flash, format or erase partitions. Verified boot will detect modifications to any of the OS partitions (boot, recovery, system, vendor) and it will prevent reading any modified / corrupted data. If changes are detected, error correction data is used to attempt to obtain the original data at which point it’s verified again which makes verified boot robust to non-malicious corruption.

Reboot into the bootloader menu and set it to locked:

fastboot flashing lock

The command needs to be confirmed on the device since it needs to perform a factory reset.

Unlocking the bootloader again will perform a factory reset.

OEM unlocking should be disabled again in the developer settings menu within the operating system. This prevents unlocking the bootloader without access to the owner account. CopperheadOS prevents bypassing the OEM unlocking toggle by wiping the data partition from the hidden recovery menu, unlike stock Android. You can still trigger factory resets from within the OS. Note that this means that recovering a device with a forgotten password is not possible without Copperhead doing it, which is the main purpose of this feature (anti-theft). Stock Android can be more forgiving because it’s tied to a Google account.


Update client

Pixel phones (A/B updates)

See the section in the usage guide.

Nexus phones (legacy update system)

CopperheadOS checks for updates on a daily basis by default. It can be configured in Settings -> About device -> System updates.


Updates can also be downloaded from the downloads page and installed via recovery with adb sideloading. The zip files are signed and will be verified by the CopperheadOS recovery image.

First, boot into recovery. You can do this either by using adb reboot recovery from the operating system or selecting the Recovery option in the bootloader menu.

Next, access the recovery menu by holding down the power button and pressing the volume up button a single time.

Finally, select the “Apply update from ADB” option in the recovery menu and sideload the update with adb:

adb sideload

Reporting bugs

Bugs (or feature requests) should be reported to the issue tracker on GitHub.