Skip to content

Latest commit

Β 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Meshtbank1

πŸ“‘πŸ’Έ Meshtbank

A tiny off-grid payment node for Meshtastic, running a lightweight ledger for balances and transfers on low-power hardware.

Meshtbank is an experimental payment system built on top of Meshtastic.

It maintains a central ledger containing users, balances, and transaction histories while using a LoRa mesh network instead of Internet connectivity.

Users interact with the system by sending direct Meshtastic messages such as:

balance
pay !27e52039 50
history

The central node runs on a DFRobot FireBeetle 2 ESP32-C6, connected to a Seeed Studio XIAO nRF52840 + SX1262 Meshtastic radio.

A 2-inch TFT display provides a local activity log, while account data is stored persistently in the ESP32's LittleFS filesystem.

⚠️ Meshtbank is an experimental maker project and proof of concept.

It is not a banking product, cryptocurrency, secure payment processor, or financial service. Do not use it to store or transfer real monetary value.


✨ Features

  • πŸ“‘ Works over a Meshtastic LoRa mesh
  • 🌐 No Internet connection required
  • πŸ”‹ Low-power hardware
  • β˜€οΈ Can potentially operate from battery + solar power
  • πŸ’Έ Peer-to-peer balance transfers
  • πŸ‘€ Accounts identified by Meshtastic node ID
  • πŸ“Š Persistent balances
  • πŸ“œ Per-user transaction history
  • πŸ“ System event log
  • πŸ” Password-protected administrator commands
  • πŸ’¬ User interaction through Meshtastic direct messages
  • πŸ“’ Startup broadcast announcing the node
  • πŸ–₯️ 2-inch TFT activity display
  • πŸ’Ύ LittleFS persistent storage
  • πŸ›‘οΈ Input sanitization and transaction validation
  • πŸ“œ MIT licensed

🧠 Concept

Meshtastic is normally used for low-power, long-range text communication without cellular networks or Internet access.

Meshtbank asks a different question:

If the communication infrastructure disappears, could the same mesh network support simple local applications such as a community ledger?

Traditional digital payment infrastructure depends on systems such as:

Internet
    ↓
Bank servers
    ↓
Clearing networks
    ↓
Payment processors
    ↓
ATMs / POS terminals

Meshtbank replaces that infrastructure with something deliberately much smaller:

Meshtastic nodes
       ↓
LoRa mesh
       ↓
Meshtbank node
       ↓
Local ledger

It is intentionally a centralized ledger running over a decentralized communication network.


βš™οΈ Architecture

               Meshtastic LoRa Mesh
                        β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚             β”‚             β”‚
          β–Ό             β–Ό             β–Ό
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ User A  β”‚   β”‚ User B  β”‚   β”‚ User C  β”‚
     β”‚ !nodeID β”‚   β”‚ !nodeID β”‚   β”‚ !nodeID β”‚
     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜
          β”‚             β”‚             β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                   Direct Messages
                        β”‚
                        β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ XIAO nRF52840        β”‚
            β”‚ + SX1262 LoRa        β”‚
            β”‚                      β”‚
            β”‚ Meshtastic firmware  β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚
                       β”‚ Serial / Proto
                       β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ FireBeetle 2 ESP32-C6β”‚
            β”‚                      β”‚
            β”‚ Meshtbank firmware   β”‚
            β”‚                      β”‚
            β”‚ β€’ Accounts           β”‚
            β”‚ β€’ Balances           β”‚
            β”‚ β€’ Transfers          β”‚
            β”‚ β€’ History            β”‚
            β”‚ β€’ Admin commands     β”‚
            β”‚ β€’ LittleFS ledger    β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚
                       β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚ 2" TFT display β”‚
              β”‚ Activity log   β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The XIAO + SX1262 handles Meshtastic communication.

The FireBeetle ESP32-C6 runs the banking logic.


πŸ“‘ Meshtastic communication

The two boards communicate through the Meshtastic Arduino serial interface.

The current firmware defines:

#define SERIAL_RX_PIN 17
#define SERIAL_TX_PIN 16
#define BAUD_RATE 115200

The XIAO Meshtastic node is configured with:

Serial module: Enabled
Mode: Proto
TX: Pin 7
RX: Pin 6

This creates the bridge:

Meshtastic radio
      β”‚
      β–Ό
XIAO nRF52840
      β”‚
      β”‚ Serial Proto
      β–Ό
ESP32-C6
      β”‚
      β–Ό
Meshtbank

🧰 Hardware

Component Purpose
Seeed Studio XIAO nRF52840 Meshtastic node
Wio-SX1262 LoRa shield Long-range radio
DFRobot FireBeetle 2 ESP32-C6 Ledger and application logic
DFRobot 2-inch 320Γ—240 TFT Local status and activity display
3.7 V battery Portable power
Jumper wires Serial and power connections
Optional solar panel Off-grid charging

XIAO Meshtastic kit

Seeed Studio XIAO nRF52840 + Wio-SX1262 Kit

FireBeetle 2 ESP32-C6

DFRobot FireBeetle 2 ESP32-C6


πŸ”Œ Wiring

Mount the SX1262 shield on the XIAO nRF52840.

Then connect the XIAO and FireBeetle.

FireBeetle ESP32-C6 XIAO
3.3 V 3.3 V
GND GND
GPIO 17 / RX Pin 7
GPIO 16 / TX Pin 6

The TFT display connects to the FireBeetle using the DFRobot GDI interface.

The original build therefore requires very little external wiring.


πŸ–₯️ TFT activity display

The firmware uses:

DFRobot_ST7789_240x320_HW_SPI

through the DFRobot_GDL graphics library.

The display shows recent incoming commands and system activity.

A scrolling buffer stores up to:

const int MAX_LOGS = 6;

recent entries.

Messages are visually distinguished using different colors for commands and system events.

The display is optional: disconnecting it reduces power consumption.


πŸ’Ύ Ledger storage

Meshtbank stores its ledger using the ESP32's LittleFS filesystem.

Each account has a balance file:

/!27e52039.txt

and a separate history file:

/!27e52039_hist.txt

A system-wide event log is stored as:

/sys.log

Conceptually:

LittleFS
β”‚
β”œβ”€β”€ !27e52039.txt
β”œβ”€β”€ !27e52039_hist.txt
β”‚
β”œβ”€β”€ !12ab34cd.txt
β”œβ”€β”€ !12ab34cd_hist.txt
β”‚
└── sys.log

The user ID corresponds to the Meshtastic node ID.


πŸ‘€ Accounts

Accounts are created by an administrator.

Example:

setup 7777 !27e52039 100

This creates or overwrites:

User:
!27e52039

Balance:
100

The firmware then records an initial history entry.

πŸ” 7777 is the default password shown in the current source. Change it before uploading the firmware.


πŸ’¬ User commands

Commands must be sent to the Meshtbank node using a private Meshtastic direct message.

Broadcast commands are intentionally ignored.


help

Show the available user commands:

help

Response:

CMDS: balance, history <#>, pay <ID> <$>

balance

Check your current account balance:

balance

Example response:

[$] Balance: $100.00

Accounts are tied to the Meshtastic node ID of the sender.


pay

Transfer funds:

pay <TargetID> <Amount>

Example:

pay !27e52039 50

Before processing a payment, Meshtbank verifies:

  • sender account exists
  • destination account exists
  • sender and receiver are different
  • amount is greater than zero
  • sender has enough balance

The system then updates the destination account, checks that the write succeeded, updates the sender account, and creates history records for both users.

The receiver also gets a Meshtastic notification.

Example:

[$] Received $50.00 from !12ab34cd

history

Display transaction history:

history

Example:

HIST:
1. Admin Setup: Initial $100.00
2. TX1234: Sent $20.00 to !27e52039
3. TX1801: Recv $10.00 from !55dd8800

history <N>

Retrieve a specific transaction record:

history 2

Example response:

Rec #2: TX1234: Sent $20.00 to !27e52039

This is useful because Meshtastic messages have limited practical payload sizes.


πŸ” Administrator commands

Administrative operations require the configured password.

The password is defined in:

const String ADMIN_PASS = "7777";

Change this before deploying the node.


Create or overwrite an account

setup <Pass> <User_ID> <Amount>

Example:

setup 7777 !27e52039 100

Delete an account

delete <Pass> <User_ID>

Example:

delete 7777 !27e52039

The associated balance and transaction-history files are removed.


List accounts

listusers <Pass>

Example:

listusers 7777

Check another account

checkbal <Pass> <User_ID>

Example:

checkbal 7777 !27e52039

Check another user's history

checkhist <Pass> <User_ID>

Factory reset

reset <Pass>

This deletes all ledger files.

⚠️ This operation is destructive.


πŸ“’ Broadcast behavior

Normal banking commands are only accepted through direct messages.

If someone sends a command as a public channel message, Meshtbank ignores it and announces that commands must use private DMs.

After connecting successfully to the Meshtastic node, the system also broadcasts a startup message containing the current number of registered users.


πŸ›‘οΈ Input validation

Incoming messages are sanitized before processing.

The firmware limits commands to:

#define MAX_MSG_LEN 100

and removes non-printable characters.

Payments also reject:

self-payments
negative amounts
zero amounts
missing users
insufficient funds

These checks improve robustness but should not be interpreted as financial-grade security.


πŸš€ Installation

1. Clone the repository

git clone https://github.com/ronibandini/Meshtbank.git
cd Meshtbank

Repository structure:

Meshtbank/
β”œβ”€β”€ libraries/
β”‚   β”œβ”€β”€ DFRobot_GDL-master.zip
β”‚   β”œβ”€β”€ Meshtastic-arduino-master.zip
β”‚   └── readme.txt
β”œβ”€β”€ LICENSE
β”œβ”€β”€ Meshtbank.stl
β”œβ”€β”€ README.md
└── meshtbank1.ino

πŸ“» Configure the Meshtastic node

2. Flash the XIAO

Install Meshtastic firmware using:

Meshtastic Web Flasher

If necessary, put the XIAO into bootloader mode before flashing.

After flashing, connect it to:

Meshtastic Web Client


3. Configure Meshtastic

Configure:

Region: your local region
Primary channel: Meshtbank

Then configure the Serial module:

Mode: Proto
TX: 7
RX: 6

During initial testing, if using default channel settings, consider:

Hop limit: 1
MQTT: Disabled

This reduces unnecessary propagation while testing.

πŸ“‘ Always configure Meshtastic according to the radio regulations applicable to your region.


πŸ”₯ Configure the FireBeetle

4. Install libraries

The required Arduino libraries are included under:

libraries/

Install:

DFRobot_GDL-master.zip
Meshtastic-arduino-master.zip

through the Arduino IDE.


5. Change the administrator password

Open:

meshtbank1.ino

Find:

const String ADMIN_PASS = "7777";

and replace it:

const String ADMIN_PASS = "YOUR_PASSWORD";

6. Upload

Compile and upload the sketch to the FireBeetle 2 ESP32-C6.

The serial console runs at:

115200 baud

On startup the system:

  1. initializes the TFT
  2. mounts LittleFS
  3. writes a system boot event
  4. initializes Meshtastic serial communication
  5. requests the Meshtastic node report
  6. registers the text-message callback

The display should show:

Meshtbank v1.0

followed by:

Initializing...

β˜€οΈ Off-grid operation

Meshtbank is designed around low-power hardware.

The original build uses a:

3.7 V battery

and the FireBeetle can also be combined with a small solar panel.

For reduced consumption, the TFT can be disconnected.

This makes configurations possible where the payment node operates independently from:

Internet
cellular infrastructure
mains electricity

provided the Meshtastic mesh itself remains operational.


πŸ–¨οΈ 3D stand

The repository includes:

Meshtbank.stl

A downloadable version is also available on Cults3D:

Meshtbank experimental Meshtastic Banking Node β€” Cults3D

The original stand is intentionally simple and designed primarily to hold the prototype components.


πŸŽ₯ Demo

▢️ Meshtbank demo on YouTube


πŸ”¬ Ideas for extending the project

  1. πŸ” Signed transactions β€” add cryptographic signatures or another stronger identity mechanism instead of relying primarily on Meshtastic node IDs.

  2. πŸ•’ Reliable timestamps β€” add real transaction timestamps using RTC, GPS time, or another time source instead of deriving transaction IDs from ESP32 uptime.

  3. 🌐 Distributed ledger experiments β€” explore replication between several Meshtbank nodes instead of depending on one central ledger.


πŸ“° External references

Meshtbank has received independent editorial coverage as well as documentation on several maker platforms.


πŸ—žοΈ Independent editorial coverage

Hackaday

Off-Grid, Small-Scale Payment System

Hackaday writer Bryan Cockfield featured Meshtbank on December 5, 2025.

The article describes the project as a small-scale off-grid digital payment system built around Meshtastic and discusses potential applications such as:

  • community credits
  • festival credits
  • local exchange systems
  • infrastructure-independent experiments

The article also highlights two important limitations of the prototype: the Meshtastic transport is not designed to provide banking-grade security, and the centralized ledger requires users to trust the administrator.


Hackster News

A Meshtastic Banking System for the Apocalypse

Hackster News writer Cameron Coward independently featured Meshtbank as an experimental payment system designed to operate without Internet access or reliable grid power.

The article covers:

  • Meshtastic as the communication backbone
  • the central ledger
  • account balances
  • transfers
  • the XIAO nRF52840 + SX1262
  • FireBeetle ESP32-C6
  • TFT display
  • battery-powered operation

πŸ› οΈ Project documentation

Hackaday.io

Meshtbank β€” Hackaday.io

The complete project page includes:

  • concept
  • hardware
  • wiring
  • Meshtastic configuration
  • Arduino setup
  • command reference
  • off-grid operation
  • source-code link
  • 3D-model link

DFRobot Maker Community

Meshtastic payment ledger with FireBeetle 2: Meshtbank

DFRobot Maker Community hosts the hardware tutorial for the project.

It documents:

  • FireBeetle 2 ESP32-C6
  • XIAO Meshtastic node
  • 2-inch TFT
  • battery operation
  • Meshtastic configuration
  • user commands
  • administrator commands

The article explicitly links to this GitHub repository.


Medium

Meshtbank, un sistema de pagos sobre Meshtastic

Spanish-language article by Roni Bandini explaining the motivation, architecture, hardware, setup, and operation of Meshtbank.

The article also links directly to:

  • this repository
  • Hackaday.io tutorial
  • Cults3D model
  • Hackaday coverage
  • Hackster coverage

πŸ–¨οΈ 3D model

Cults3D

Meshtbank experimental Meshtastic Banking Node

Downloadable STL for the original prototype stand.

The STL is also included directly in this repository as:

Meshtbank.stl

πŸ“š Useful references


πŸ”— You may also be interested in...

Other projects by Roni Bandini exploring off-grid systems, wireless communication, and unconventional embedded applications.

πŸ—³οΈπŸ“‘ Meshtvote

Decentralized decision-making over Meshtastic for scenarios without conventional communications infrastructure.

Meshtvote is the closest companion project to Meshtbank: instead of moving balances over Meshtastic, it uses the same network concept to coordinate voting and collective decisions.

github.com/ronibandini/Meshtvote


πŸ“‘πŸŽ― Router Attack

An ESP8266 game that transforms nearby Wi-Fi networks into physical game targets.

Another experiment that repurposes wireless-network metadata as the foundation of an unconventional embedded application.

github.com/ronibandini/routerattack


πŸ“‘πŸš¨ mmWave Alarm

Human-presence detection using mmWave radar, ESP32, and remote notifications.

Another compact embedded project exploring radio-frequency technologies outside their usual applications.

github.com/ronibandini/mmWaveAlarm


πŸ” Security and trust model

Meshtbank should be treated as an experimental protocol demonstrator, not as a secure financial platform.

The current design has several intentional simplifications.

Central authority

One Meshtbank node owns the complete ledger.

The administrator can:

create accounts
overwrite balances
delete accounts
inspect balances
inspect histories
wipe the ledger

Users therefore need to trust the operator of that node.

Administrator password

The administrator password is embedded directly in the firmware:

const String ADMIN_PASS = "7777";

It is sent as part of administrator commands and is not a substitute for modern authentication.

Node identity

Accounts are associated with Meshtastic node IDs.

The project does not implement independent cryptographic user identities or transaction signatures.


πŸ“œ License

Meshtbank is released under the MIT License.

See LICENSE for details.


πŸ‘€ Author

Roni Bandini

Maker, AI developer, electronic artist and writer.

Contributions, forks, alternative ledger models, Meshtastic experiments, and improved enclosures are welcome.

Releases

Packages

Contributors

Languages