CLI tool
mycelium-com/wallet-android avatar
mycelium-com/wallet-android

Mycelium wallet-android: an open source Bitcoin wallet you can rebuild and verify

Mycelium Bitcoin Wallet for Android

716 stars326 forksKotlinNOASSERTION

At a glance

What is it?
The Mycelium Bitcoin Wallet for Android is an open source wallet whose most unusual property is that you can check it: the project publishes the release signing certificate, a container build recipe, and a procedure for rebuilding the Play Store APK and diffing it against the one on your phone. The build itself is a Gradle multi-module project with prodnet and testnet flavours, and the licence is a custom one rather than a standard open source grant.
Who is it for?
Adopt Mycelium wallet-android if you want to run a Bitcoin wallet on Android from source, or if you want to check that the build you install matches the published source, since the project gives you the signing certificate, the podman recipe and the diff procedure needed to do exactly that.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 161 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Why a wallet would publish its own signing certificate

The Mycelium Bitcoin Wallet is an Android app for sending and receiving Bitcoin, and it is open source with the source in this repository. But the interesting part is not the feature list, it is the verification section.

All versions released by Mycelium are signed with the same release keys, and the readme tells you that if you do not trust the apk you can check that signature with apksigner:

code
apksigner verify --print-certs --verbose mycelium.apk

It then shows the expected output, including the certificate distinguished name, CN=Mycelium Developers, O=Mycelium, L=Vienna, C=AT, and the SHA-256, SHA-1 and MD5 digests of the certificate, along with the key algorithm RSA and a key size of 2048 bits, and the corresponding public key digests.

Publishing the digests is a small thing that most projects do not do, and it is what makes the rest of the readme possible. Without a known digest you cannot compare anything, and with it you can check a downloaded binary against a value in a file you can read.

The project is written in Kotlin, the homepage is mycelium.com, and the licence is a custom one that GitHub cannot classify, which is a fact to check before you build or redistribute anything from it.

Building from source: two Gradle flavours and two networks

The build is a Gradle project with a wrapper for both platforms, and the source is a multi-module layout, since the repository root carries mbw/, mbwlib/, walletcore/, walletmodel/, wapi/, bitlib/, backuputil/, trezor/, btchip/, view/, common/, commonView/, tools and others, plus a wallet-android-modularization-tools directory.

The checkout is straightforward, and the submodule step is not optional because the native libraries are submodules:

code
    git clone https://github.com/mycelium-com/wallet-android.git
    cd wallet-android
    git submodule update --init --recursive

The documented toolchain is JDK 1.8, and the layout is designed for a recent version of Android Studio, currently 4.1.2. On Linux and Mac the build is:

code
    ./gradlew clean test mbw::assembleProdnetRelease mbw::assembleBtctestnetRelease

And on Windows it is the batch wrapper instead:

code
    gradlew.bat clean test mbw::assembleProdnetRelease mbw::assembleBtctestnetRelease

The two targets are the important part. prodnet and btctestnet are separate application variants, and the generated apks land in mbw/build/outputs/apk/ with versions for both.

The dual network build is a deliberate safety property for a wallet. A testnet build cannot sign a real transaction by accident, and being able to run the same code against both is how a team tests the wallet without touching real funds.

The container recipe and the disorderfs step

The Dockerfile in the repository builds a builder image for the Android toolchain, based on ubuntu:22.04, with the i386 architecture added, and it pins a set of versions as build arguments: an Android SDK version of 11076708, build tools 34.0.0, an NDK version of 21.1.6352462, an Android platform version of 34 and CMake 3.22.1. It installs openjdk-21-jdk along with wget, git, unzip and disorderfs.

Note the mismatch with the readme, which says JDK 1.8. The container uses a much newer JDK, and the two are not obviously the same build environment, which is worth resolving before you trust a comparison.

The build image is created with podman, with the no-cache flag so a stale layer cannot produce a stale result:

code
      $ podman build --no-cache --tag mycelium_builder .

The actual build runs inside it, and the interesting part is disorderfs, used to eliminate non-determinism caused by file ordering:

code
      $ podman run --rm --interactive --tty \
          --device /dev/fuse \
          --cap-add SYS_ADMIN \
          --volume .:/app \
          mycelium_builder \
          bash -c "apt update;
          apt install -y disorderfs;
          mkdir /project/
          disorderfs --sort-dirents=yes --reverse-dirents=no /app/ /project/;
          cd /project/
          ./gradlew -x lint -x test clean :mbw:assembleProdnetRelease;"

The sort-dirents and reverse-dirents options are what make the directory enumeration order stable, which is a prerequisite for a byte-identical build. The --device /dev/fuse and --cap-add SYS_ADMIN are needed because disorderfs is a FUSE filesystem.

Diffing your rebuild against the app on your phone

The verification story continues past the build. The readme tells you how to pull the Play Store APK off a device, using adb to find the package path and then to pull the file:

code
        $ adb shell pm path com.mycelium.wallet
        package:/data/app/com.mycelium.wallet-1/base.apk

and then:

code
        $ adb pull /data/app/com.mycelium.wallet-1/base.apk mycelium-signed.apk

Both apks are then unpacked with ApkTool:

code
        java -jar ~/path/to/apktool.jar d mbw-prodnet-release.apk
        java -jar ~/path/to/apktool.jar d mycelium-signed.apk

And the two trees are compared with a diff, filtering out the signature files, because the signature is the one thing a local build cannot reproduce:

code
        diff --brief --recursive  mbw-prodnet-release/ mycelium-signed/ | grep -v "META-INF/CERT.RSA\|META-INF/CERT.SF\|META-INF/MANIFEST.MF"

The readme is explicit that the expected differences are the elements that depend on the signature, which only the project's maintainer can reproduce: original/META-INF/CERT.RSA, original/META-INF/CERT.SF and original/META-INF/MANIFEST.MF.

That is a genuinely useful thing to be able to do. It is not a statement that the maintainer is trustworthy, it is a mechanism by which a third party can check the published build against the published source without trusting either.

The key management model: HD wallets, a masterseed, and no device that holds your keys for you

The feature list is where the wallet's design philosophy shows. It is HD enabled, so you can manage multiple accounts and never reuse addresses, and it is compatible with Bip32 and Bip44. It is masterseed based, meaning one backup should be enough, following Bip39.

The privacy claim is stated as 100% control over your private keys, they never leave your device unless you export them. There is no block chain download, so it installs and runs in seconds, and the connection to the Bitcoin network goes through the project's own super nodes, with the option of reaching them over a tor-hidden service at an .onion address for enhanced privacy and availability.

Cold storage integration is handled through watch-only addresses, single or xPub, and single or xPriv private key import, and you can directly spend from paper wallets with a single key, an xPriv or a master seed. Trezor is enabled, so you can spend directly from trezor-secured accounts, and Mycelium Entropy is compatible, which is a Shamir-Secret-Shared 2-out-of-3 key spending scheme. The wallet is also compatible with other Bitcoin services through the bitcoin: URI scheme, and it can be secured with a PIN.

The trade-off is that the responsibility sits with the user. There is no custodial fallback and no account recovery service, which is the point of the design and also the cost of it.

The beta channel, and what the project asks of beta testers

The first section of the readme is about the beta channel, and it sets expectations clearly.

To receive updates quicker than others you need to enable beta versions of the software in Google Play, through the testing link given in the readme. Then the instruction is that as beta testers you should make sure you have a recent backup of the masterseed and all private keys inside Mycelium, because beta testers will experience many bugs.

The readme then adds a reassuring and an honest sentence in the same breath: so far, restoring the wallet from masterseed has never been necessary, but they offer no guarantees.

That pairing is the right way to state the risk. Nobody has needed to restore from the seed, and nobody is promising you will not. For a wallet, a masterseed backup is the difference between a bug and a loss, so the advice to take a fresh backup before joining a beta is the single most important instruction in the file.

On maintenance, the last push to the repository was on 2026-05-15 and the repository is not archived, so the source is available and current even though there are no GitHub releases.

Editorial conclusion

Adopt Mycelium wallet-android if you want to run a Bitcoin wallet on Android from source, or if you want to check that the build you install matches the published source, since the project gives you the signing certificate, the podman recipe and the diff procedure needed to do exactly that. Do not adopt it expecting the build instructions to work unchanged on a current workstation, because the documented toolchain is JDK 1.8 with Android Studio 4.1.2 while the container image installs openjdk-21-jdk and API level 34, so you will have to reconcile those. Before you build, read the LICENSE file, since the licence is a custom one that GitHub cannot classify, and set up the beta channel only after backing up the masterseed and private keys, because the project states plainly that beta testers will experience many bugs.

Frequently asked questions

How do I build the Mycelium Bitcoin Wallet for Android from source?

Clone the repository, run git submodule update --init --recursive, then build with gradle using the documented toolchain of JDK 1.8 and Android Studio 4.1.2. On Linux and Mac the command is ./gradlew clean test mbw::assembleProdnetRelease mbw::assembleBtctestnetRelease, and the apks land in mbw/build/outputs/apk/ for both prodnet and testnet.

How can I verify that the Mycelium APK I downloaded matches the published source?

Rebuild the wallet yourself with podman using the repository Dockerfile, pull the Play Store APK off a device with adb, unpack both with ApkTool, and diff the two directories while filtering out the META-INF signature files. The readme states that the expected differences are only the signature-dependent elements, original/META-INF/CERT.RSA, CERT.SF and MANIFEST.MF.

How do I check the signature of a Mycelium APK?

Run apksigner verify --print-certs --verbose mycelium.apk, using the apksigner tool from the Android command line tools. The readme publishes the expected output, including the certificate DN CN=Mycelium Developers, O=Mycelium, L=Vienna, C=AT and the SHA-256 digest b8e59d4a60b65290efb2716319e50b94e298d7a72c76c2119eb7d8d3afac302e.

Should I install the Mycelium beta build?

The project states that beta testers will experience many bugs, and asks that you make sure you have a recent backup of the masterseed and all private keys before joining. It also notes that restoring from the masterseed has never been necessary so far, while offering no guarantees.

How does the Mycelium wallet handle private keys and offline storage?

The wallet is HD enabled and Bip32 and Bip44 compatible, so it manages multiple accounts without reusing addresses, and it is masterseed based following Bip39. Private keys never leave the device unless exported, and cold storage integration is available through watch-only addresses with single or xPub keys, plus direct spending from paper wallets and from Trezor-secured accounts.

Official sources

  1. Issues
  2. mycelium-com/wallet-android on GitHub
  3. Project website
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/mycelium-com-wallet-android.svg)](https://hysenlabs.com/projects/mycelium-com-wallet-android)

Was this useful?