Community release

Pay with NIM when there is no internet

NIMmesh, a Bluetooth mesh wallet for Nimiq, goes to alpha today: a payment signed offline hops phone to phone until one puts it on chain.

How the mesh works

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
This one has Wi-Fi: the gateway.
Every phone running NIMmesh is a node, and the internet is needed at the final hop onlyWhat a relay does with a payment it cannot deliver yet, and why the mesh can be sparse

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.

In the last screenshot the other phone sees the first one too.

Exactly 139 bytes

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

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

Tap a field. The three slivers are single-byte fields: format, proof type, network id.

A radio either fits it or it does not, once, foreverWhy a fixed size matters more than a small one

Not on average. Every single one. That matters more than being small.

96 of the 139 bytes are the public key and the signature. The payment itself is 40.

One packet on every radio

#
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

A bare payment fits one SMS with a byte to spare, but a note, a memo in Nimiq terms, grows it to roughly 205 bytes.

NIM versus Bitcoin on the air

A NIM payment139 bytes, every time
travels in one piece → on chain
A Bitcoin paymentsplit into pieces
12345+… → rebuilt, then chain

Both Bitcoin bridges send hex and chunk it, while a NIM payment goes on the air as 139 raw bytes.

Both Bitcoin bridges need a reassembler at the far end, and NIMmesh never doesHow btcmesh and the Meshtastic Bitcoin Core bridge go on the air, and what that forces

Both existing Bitcoin bridges split the transaction and rebuild it at the far end. Hex doubles the bytes before the chunking starts.

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.

A NIM payment's 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.

What is not proven

The measurement is done, and the radio work is not: LoRa and SMS have never carried a payment.

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

Reported, not verified here: the two meshes carry each other's messages, phone to phone, with no computer in the path.

NIMmesh is a Nimiq take on Bitchat, Jack Dorsey's Bluetooth mesh messengerWhy a shared mesh matters, and what would prove the demo

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. Two phones in a room are the only real proof.

Roadmap

MONTH 1
Swaps on mainnet, the mesh across devices
A real-money swap over Bluetooth, Android and iPhone in one mesh.
MONTH 2
Public beta
Google Play open to anyone, TestFlight resubmitted.
MONTH 3
The transport seam
One LoRa payment attempted on two $35 radios.
Three months, starting when the first tranche lands, every run recordedEach month in full, how the app is scored, the source and the signing key

Month 1. 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. Google Play through the closed test, then open to anyone. TestFlight resubmitted with honest notes, the result posted either way.

Month 3. Bluetooth becomes one implementation of a transport trait. One LoRa payment attempted on two $35 radios, result posted pass or fail.

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

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.

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.

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