Android 12 or newer
Download the APKiPhone, iOS 16 or newer
Install on iPhoneCheck it before you install it
You are about to sideload a wallet that will hold real money. Do not take anyone's word for what is in the file, including ours. Check both hashes yourself.
The file
Run this against the download and compare:
shasum -a 256 nimmesh.apk
f6835ac0206bc035f1de0a5bbecaf5241324f035ac7ab80e5454de2b84fafd6e
The signing key
More useful than the file hash, because it does not change between versions. Every NIMmesh build is signed by the same key, and Android refuses to install an update signed by a different one.
apksigner verify --print-certs nimmesh.apk
7b5b6a5179441caacdcadf3eea341569ebf4b7d303122fbc0fd564a1cd853fc2
The source
NIMmesh is open source, Apache 2.0. The app, the mesh and the tests behind both hashes above are at github.com/Andjroo111/nimmesh.
Installing
- Tap the download button above in any browser on the phone.
- Open the downloaded file. Android will say it cannot install apps from this source. That is about sideloading in general, not this file. Tap through to settings and allow your browser, once.
- Open NIMmesh and allow Bluetooth so the phone can find other phones and relay for them.
- Write your 24 words down on paper. There is no forgot-password and no account to recover from. Uninstalling the app deletes the key with it.
This is real mainnet money. There is no test mode. Put in an amount you would not mind losing.
What it asks for, and why
Ten permissions, every one load bearing. If you see the app request anything that is not on this list, something is wrong. Email hello@nimiq.tech.
| Permission | What it is for |
|---|---|
BLUETOOTH_SCAN | Find other phones running NIMmesh. Flagged neverForLocation, which is how the app avoids asking for your location at all. |
BLUETOOTH_ADVERTISE | Let other phones find you, so you can relay for them. |
BLUETOOTH_CONNECT | Open the link that carries the payment bytes. |
FOREGROUND_SERVICE..._CONNECTED_DEVICE | Keep the radio alive while the screen is off. Android kills background Bluetooth otherwise, and a sleeping phone stops relaying. |
POST_NOTIFICATIONS | The notification Android requires a foreground service to show. It is how you can tell the mesh is still running. |
INTERNETACCESS_NETWORK_STATE | Read your balance and broadcast, when you have a connection. The offline path never touches these. |
CAMERA | Scan a payment QR code. Nothing is uploaded. |
USE_BIOMETRIC | Unlock the wallet with a fingerprint instead of typing. |
There is no location permission, no contacts, no storage, and no analytics SDK. A Bluetooth scan below Android 12 is impossible without handing over location, which is why the app refuses to run on anything older.
What works and what does not
The wallet is proven on Android: it creates and restores from 24 words, shows a real mainnet balance, and sends when online. It derives the same keys as the iPhone build, checked by a test that fails if the two disagree.
The mesh is the unproven half. Both Bluetooth roles come up on a real phone, but two Android phones have never passed a payment between them. The test guide has the run that settles it.
Why iPhone is limited
The iOS build is Ad Hoc, so Apple only lets it install on devices registered by hand, capped at 100. TestFlight is not a way around it: the first submission was rejected, and an honest resubmission runs into Apple's rule against crypto wallets from individual developers.
Email me to get a device added.