Public alpha

NIMmesh

Download

Android is the real one. A signed APK, two hashes to verify it, and every permission it asks for.

Android 12 or newer

Download the APK

Version 0.89.7 · 16.9 MB
No account, no registration, no device limit

iPhone, iOS 16 or newer

Install on iPhone

Version 0.89.4 · 3.6 MB
Registered devices only, and it has to be Safari

Check 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

  1. Tap the download button above in any browser on the phone.
  2. 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.
  3. Open NIMmesh and allow Bluetooth so the phone can find other phones and relay for them.
  4. 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.

PermissionWhat it is for
BLUETOOTH_SCANFind other phones running NIMmesh. Flagged neverForLocation, which is how the app avoids asking for your location at all.
BLUETOOTH_ADVERTISELet other phones find you, so you can relay for them.
BLUETOOTH_CONNECTOpen 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_NOTIFICATIONSThe notification Android requires a foreground service to show. It is how you can tell the mesh is still running.
INTERNET
ACCESS_NETWORK_STATE
Read your balance and broadcast, when you have a connection. The offline path never touches these.
CAMERAScan a payment QR code. Nothing is uploaded.
USE_BIOMETRICUnlock 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.

Help fund more development

Built for the Nimiq community.

Any help means a lot, and it goes straight back into building.

NIM