Skip to main content

vnode

Virtual Meshtastic node runtime built around:

  • mudp for multicast UDP send/receive
  • meshdb for packet and node persistence
  • Meshtastic-style PKI DM encryption using X25519 + SHA-256 + AES-CCM

Install

Install from PyPI:

pip install vnode

If you are working from this repository instead:

.venv/bin/pip install -e .

Config

Edit node.json.

If node.json does not exist yet, the runtime will create it automatically from example-node.json.

If the template leaves node_id blank, the runtime will generate and persist a random Meshtastic-style node ID when it creates or first loads node.json. If long_name or short_name are blank, the runtime will also generate them from the last 4 hex characters of the node ID, for example Meshtastic 691c and 691c.

The runtime will generate and persist a PKI private key into node.json on first run if the private key is blank.

The derived public key is written automatically to node.public.key next to node.json. That file is generated by the runtime and should not need manual edits.

The position section in node.json controls periodic position broadcasts. Set position.enabled to true, then set position.latitude and position.longitude, and adjust position.position_interval_seconds to control how often the node sends POSITION_APP packets. You can also set position.altitude if you want altitude included in the payload. Leave position.enabled false or leave latitude/longitude as null to disable position broadcasts.

Run

.venv/bin/python -m vnode --vnode-file node.json run

Send a DM

.venv/bin/python -m vnode --vnode-file node.json send-text --to '!1234abcd' --message 'hello'

send-text uses PKI automatically for direct messages when the destination node has a stored public key in meshdb. Otherwise it falls back to channel encryption. --config is still accepted as a compatibility alias for --vnode-file.

Library

The installable package lives under vnode/vnode, and the public library surface is exported from vnode directly:

from vnode import NodeConfig, VirtualNode, generate_keypair

node = VirtualNode("node.json")
packet_id = node.send_text("!1234abcd", "hello")

Supported VirtualNode calls:

  • Lifecycle: start(), stop(), close(), run_forever()
  • Subscription: receive(callback), unreceive(callback)
  • Node identity: getLongName(), getShortName(), getPublicKey(), getMyUser(), getMyNodeInfo()
  • Native vnode sends: send_text(), send_reply(), send_nodeinfo(), send_position()
  • MeshInterface-compatible sends: sendText(), sendAlert(), sendData(), sendPosition()
  • Packet helpers: is_direct_message_for_me(), is_text_message(), get_text_message(), reply_to_packet()

receive(callback) is deduplicated. Repeated multicast copies stay on mudp's wire-level topics, while vnode publishes meshtastic.receive from mesh.rx.unique_packet so application callbacks run once per logical packet.

Examples

Use these as small runnable references for common tasks:

  • examples/autoresponder.py: DM-only reply bot for inbound direct text messages
  • examples/basic_subscriptions.py: minimal node.receive() subscription example
  • examples/listen_packets.py: packet logger for multicast traffic and decoded text
  • examples/mesh_interface_compat.py: examples of MeshInterface-style compatibility calls on VirtualNode
  • examples/serial_or_vnode.py: try a serial Meshtastic node first, then fall back to VirtualNode
  • examples/send_dm.py: minimal one-shot direct-message sender
  • examples/library_embed.py: minimal application-style embedding example using VirtualNode directly
  • examples/watch_reliability.py: watcher for unique ACK, NAK, retry, and retransmit-failure events
.venv/bin/python examples/autoresponder.py
.venv/bin/python examples/basic_subscriptions.py
.venv/bin/python examples/listen_packets.py
.venv/bin/python examples/mesh_interface_compat.py
.venv/bin/python examples/serial_or_vnode.py
.venv/bin/python examples/send_dm.py --to '!1234abcd' --message 'hello'
.venv/bin/python examples/library_embed.py
.venv/bin/python examples/watch_reliability.py --to '!1234abcd' --message 'hello'

See examples/README.md for the full list.

License

GPL-3.0-only. See LICENSE.

Meshtastic® is a registered trademark of Meshtastic LLC. Meshtastic software components are released under various licenses, see GitHub for details. No warranty is provided - use at your own risk.

Metadata

Release files for vnode 0.1.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vnode 0.1.10
File Size Uploaded Provenance
vnode-0.1.10.tar.gz 27.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for vnode 0.1.10
File Interpreter ABI Platform
vnode-0.1.10-py3-none-any.whl Python 3 none any Details

Total release size: 55.3 kB

Release files / vnode-0.1.10.tar.gz

Download URL vnode-0.1.10.tar.gz
Size 27.2 kB
Tags Source
SHA-256 checksum
How to use checksums
65de0a2ad0bdf5bacafedbdd7f8a2593953094c8fce2df128294c53ea32687f7
BLAKE2b-256 checksum
How to use checksums
c395d2c4351f3adfd32511833a3b0d912903f4aef1a5b3e9f776a779139fff65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

Release files / vnode-0.1.10-py3-none-any.whl

Download URL vnode-0.1.10-py3-none-any.whl
Size 28.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1301b89f3c8c377c2ff8e543b5c02fd71c8b496131ed9e8fc02684ba24d4e571
BLAKE2b-256 checksum
How to use checksums
605784572701c2638523087bf9bdc9553c8070d9642bdd4bcf4851cc1efb26d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

Security for vnode 0.1.10

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for vnode-0.1.10.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page