Community release

Pay with NIM when there is no internet

NIMmesh, a Bluetooth mesh wallet for Nimiq, goes to alpha today. Sign a payment on a phone with no connection. It hops phone to phone until one of them is online and puts it on the chain.

How the mesh works

Every phone running NIMmesh is a node. The internet is needed at the final hop only.

A node signs, carries and relays. A relay never reads what it carries. It holds a payment until another node appears, so the mesh can be sparse.

iOS Control Center with Wi-Fi not connected, Cellular Data off and Bluetooth on
No Wi-Fi, no cell data. Bluetooth on.
NIMmesh home screen, footer reads mesh offline, 0 nearby
Alone: mesh offline, 0 nearby.
NIMmesh home screen, footer reads mesh meshed, 1 nearby
A peer appears: mesh meshed, 1 nearby.
A second phone running NIMmesh with Wi-Fi on, footer also reads mesh meshed, 1 nearby
The other phone sees it too. This one has Wi-Fi: the gateway.

Exactly 139 bytes

Every field is fixed width. The biggest payment ever and the smallest are the same size.

Not on average. Every single one.

That matters more than being small. A radio either fits it or it does not, once, forever.

cryptography, 96 B the payment, 40 B format, 3 B

Tap a field. 96 of the 139 bytes are the public key and the signature. The payment itself is 40. The three slivers are single-byte fields: format, proof type, network id.

One packet on every radio

Attach a note to the payment and it stops fitting in a text message.

#
Transport
Filled
Room left
01
Binary SMS140 B, GSM 03.38 at 8-bit
99%
1 byte
02
Meshtastic packet221 B usable, the conservative reading
63%
82 bytes
03
Raw LoRa frame255 B, SX126x explicit header
55%
116 bytes
04
Bluetooth LE block256 B, the smallest we pad to
54%
117 bytes

SMS is the tight one: a bare payment fits with one byte to spare. Attach a note (a memo, in Nimiq terms) and it grows to roughly 205 bytes, which no single SMS can carry.

NIM versus Bitcoin on the air

Both existing Bitcoin bridges split the transaction and rebuild it at the far end. NIMmesh never does.

A NIM payment139 bytes, every time
travels in one piece → on chain
A Bitcoin paymentsplit into pieces
12345+… → rebuilt, then chain
ProjectHow it goes on the airWhat that forces
btcmesh Chunked hexadecimal strings over LoRa direct messages. A reassembler on the receiving end, and a configurable reassembly timeout for when a chunk never lands.
MeshtasticBitcoinCore_Bridge You divide the raw hex yourself into portions of 200 characters or less. A + before every portion and a == to terminate. Its README notes that Bitcoin hex may run past 1,000 characters against a 228-byte buffer.

Both bridges send hex, which doubles the bytes, then chunk it. A NIM payment goes on the air as 139 raw bytes and its size is fixed: no reassembly, no partial state, no timeout to tune.

What is already on chain

Four mainnet payments totalling 19 NIM, each one on the block explorer.

BlockWhenValueWhat it proved
55488525 7 Jul 2026, 00:38 UTC 1 NIM Airplane mode phone, over Bluetooth, to a Mac gateway. The first real money.
56054933 13 Jul 2026, 11:39 UTC 1 NIM Phone to phone, no computer in the path.
56055090 13 Jul 2026, 11:42 UTC 15 NIM Same path, two and a half minutes later, fifteen times the amount.
56055105 13 Jul 2026, 11:42 UTC 2 NIM Once more, fifteen seconds after that.

Bluetooth, end to end, with real funds. Nothing about LoRa or SMS, which have never carried a payment.

What is not proven

The measurement is done. The radio work is not.

The five unproven claimsA LoRa payment, an SMS payment, the 1.35 s airtime figure, Android over the air, and the mainnet swap.
ClaimStatusWhat is true today
A payment over LoRa Unproven No radio has ever carried one. The Meshtastic frame codec is written and checked byte by byte against the published protobuf schema by hand, but no LoRa hardware has been bought and nothing has been on the air.
A payment over SMS Unproven The one byte of headroom is arithmetic, not a delivery receipt. No transaction has been sent through a carrier.
1.35 seconds on air Computed Derived from Semtech's time-on-air formula for a 155-byte frame at the LongFast preset. Not measured on a device.
Android relaying Unproven Both Bluetooth roles come up on a real stack and the wallet signs correctly on device. No byte has yet crossed the air between two Android phones.
Cross-chain swaps Testnet NIM to USDC runs end to end and settles, on Nimiq testnet and Polygon Amoy only. The mainnet phone-to-phone swap has never been run. Do not read the swap code as mainnet proven.

Talking to Bitchat

The two meshes already carry each other's messages, phone to phone.

NIMmesh is a Nimiq take on Bitchat, Jack Dorsey's Bluetooth mesh messenger from July 2025. Same mesh, a signed transaction instead of a chat message.

A mesh is only worth anything if other people's software is on it.

Reported, not verified here: the demo ran phone to phone with no computer in the path. Two phones in a room are the only real proof.

Roadmap

Three months of work, then the radios.

The clock starts when the first tranche lands. The app is scored on the Mini Apps Competition rubric, three ways, at nimiq.tech/scored.

MONTH 1
Swaps on mainnet, the mesh across devices
An atomic swap over Bluetooth with real money. Android and iPhone in one mesh, several phones at once. Bitchat on Android. Every run recorded.
MONTH 2
Public beta
Google Play through the closed test, then open to anyone. TestFlight resubmitted with honest notes, the result posted either way.
MONTH 3
The transport seam
Bluetooth becomes one implementation of a transport trait. One LoRa payment attempted on two $35 radios, result posted pass or fail.
The codec is done, the radios are nextThe transport seam is month 3, then LoRa across a community mesh, then binary SMS.
DONE
Meshtastic frame codec
Written and checked byte by byte against the published schema. No hardware needed.
NEXT
The transport seam
Month 3 above, and the rung the other two wait on.
THEN
LoRa across a community mesh
Beyond the two-radio test in month 3. An existing community network supplies every hop in between.
THEN
Binary SMS
Cell signal but no data. The transport that needs no hardware at all.

Not by building a network. Meshtastic communities already run open meshes across many cities. One $35 radio puts a NIMmesh gateway on one.

An earlier post found 143 million crypto owners where no exchange sells NIM. A payment that fits one SMS does not care which exchanges serve your country.

The milestone that matters next: a payment crossing a phone that belongs to somebody I have never met.

Open source, Apache 2.0, at github.com/Andjroo111/nimmesh. The 139-byte tests run in its CI.

The Android app is signed with one permanent key, so a phone can verify every update comes from the same author. The first testers come from the Nimiq community, on their own phones.

How the 139 bytes were measuredThe five tests, the constant that disagrees with itself, and why the number cannot drift.

The size is asserted in CI, in a file called transport_mtu_tests. A change to the wire format turns the build red. Five tests, all passing when this post was written:

TestWhat it asserts
a_real_signed_transfer_is_exactly_the_advertised_139_bytesA fully formed, signed transfer serialises to 139 bytes.
a_transaction_fits_one_meshtastic_packet_with_room_to_spareIt fits, and the margin is at least 64 bytes, so a slow creep toward the ceiling is caught early rather than at the edge.
a_transaction_fits_a_single_binary_smsIt fits inside 140 bytes with no concatenation header.
a_transaction_fits_the_transports_we_already_ship_or_planIt fits the Bluetooth padding block and a raw LoRa frame.
the_sms_headroom_is_exactly_one_byte_and_that_is_documentedThe headroom is one byte, so if it ever loosens or tightens the documentation is wrong and has to be corrected.

The transaction under test is built with the largest values its fields can hold: the maximum amount, the maximum fee, the highest block height. If any integer were serialised short, the test would measure a smaller number and the claim would quietly shrink. It is measured from a real serialised transaction, not compared against a stored constant.

The Meshtastic ceiling is quoted three different ways, and the post takes the smallest.

ReadingPayloadRoom left
Meshtastic's own mesh.proto, DATA_PAYLOAD_LEN, with the 16-byte header outside the envelope23394
Our test, a 237-byte packet with the 16-byte header subtracted anyway22182

The honest range is 82 to 94 bytes. This post uses 82.

Read nextWhere NIM cannot be purchased AlsoNimiq’s treasury, 2018 to 2026

Help fund more development

Built for the Nimiq community.

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

NIM