Skip to content

Packages Meshtasticd

github-actions[bot] edited this page Oct 8, 2026 · 3 revisions

meshtasticd

Meshtastic node daemon for Linux, driving a LoRa radio on this machine's SPI/GPIO or a USB CH341 module

  • Version recorded: 2.7.26
  • Categories: mesh
  • Upstream: https://meshtastic.org/
  • Not a recommended default — installed only when asked for.

What it does

The Meshtastic node, as a Linux program. Where the firmware on a T-Deck or a RAK board is the node, meshtasticd is the same node running on the computer itself: it drives a LoRa radio wired to the computer's SPI and GPIO pins (a Raspberry Pi HAT such as the RAK6421, Nebra or MeshAdv) or plugged in as a USB CH341 SPI module (Meshstick, MeshToad, uMesh), joins the mesh, and serves the Meshtastic API on a TCP port so that the meshtastic command, the web client and the phone apps can talk to it. It carries 62 ready-made hardware description files for such boards under /etc/meshtasticd/available.d, and a simulation mode that needs no radio.

Why you would want it

It is how a Linux box becomes a permanent Meshtastic node: a Pi on a shelf, a gateway that bridges the mesh to MQTT, an always-on node that does not depend on a phone. It is the alternative to a standalone T-Beam or RAK on a windowsill when you already have a computer there. It is NOT how a laptop talks to a node it already owns: a T-Deck, T-Echo or RAK on USB is operated with python3-meshtastic (meshtastic --port /dev/ttyACM0), which this profile already carries, and a machine with neither a HAT nor a CH341 module runs only the simulator.

Before it will work

A radio the daemon can drive, or none, for the simulator. Enable exactly one hardware description by linking it into /etc/meshtasticd/config.d (sudo ln -s /etc/meshtasticd/available.d/<file>.yaml /etc/meshtasticd/config.d/), restart the service, and set the radio's region before it will transmit: meshtastic --host localhost --set lora.region US (or your region). A fresh install has an empty config.d and an unset region, which is the state in which it cannot transmit. SPI and I2C must be enabled in the kernel for a HAT (on Raspberry Pi OS, raspi-config); the CH341 modules need nothing, the packaged udev rule makes them accessible. The operator is not added to any group.

How it installs

  • apt: meshtasticd
    • One package, from the repository for this target (listed under its apt_repos), after its gate. The package starts and enables a boot service, ships a udev rule with a world-writable line, creates a system user and three groups, and takes ownership of /etc/meshtasticd; each is under system_modifications and is printed in the plan.

What it changes on your machine

  • apt_pin — Adds the Meshtastic project's repository for this target (the openSUSE Build Service on Debian 13, Parrot and Kali; the Launchpad PPA on Ubuntu 24.04, Linux Mint 22.3 and Ubuntu 26.04) and pins its signing key.
    • Writes /etc/apt/sources.list.d/.sources and the signing key, in binary form, to /etc/apt/keyrings/.gpg, with Signed-By naming that keyring, so the key is trusted for this repository only and not archive-wide. is meshtastic-obs-debian13, meshtastic-obs-parrot, meshtastic-obs-kali, meshtastic-ppa-noble or meshtastic-ppa-resolute, one per target. The OBS source is a flat repository (Suites: ./, no Components:).
    • undo: sudo rm /etc/apt/sources.list.d/meshtastic-obs-debian13.sources /etc/apt/keyrings/meshtastic-obs-debian13.gpg && sudo apt update (the name for your target in place of meshtastic-obs-debian13); hammunition uninstall meshtasticd removes both files itself
  • package_service — The meshtasticd package enables and starts meshtasticd.service, a system service that runs at every boot as the meshtasticd user and is restarted whenever it exits. With no radio configured it exits within seconds.
    • /lib/systemd/system/meshtasticd.service: User=meshtasticd, Group=meshtasticd, AmbientCapabilities=CAP_NET_BIND_SERVICE, Restart=always, RestartSec=3, WantedBy=multi-user.target, ExecStart= /usr/bin/meshtasticd-start.sh %i (no instance id: the bare daemon). The package's postinst runs deb-systemd-helper enable and then starts or restarts it when systemd is running, so installing the package enables a boot-time service. Read from the package's postinst with dpkg-deb -e. The same ExecStart run by hand as that user, with the shipped config and no radio, printed "autoconf: Could not locate any devices" and exited 0 in about a second (Debian 13 container, 2026-10-05); under systemd the unit's Restart=always, RestartSec=3 and StartLimitBurst=5 within 200 s would restart it five times and then stop it, which was not run here (no systemd in the container). With a radio or --sim it keeps running and listens on TCP 4403 on every interface (service_endpoints).
    • undo: sudo systemctl disable --now meshtasticd.service. hammunition uninstall meshtasticd removes the package and the unit file; the enablement symlink under /etc/systemd/system/multi-user.target.wants stays until the package is purged (sudo apt-get purge meshtasticd, measured: still there after apt-get remove)
  • package_udev_rule — The meshtasticd package ships /usr/lib/udev/rules.d/60-meshtasticd.rules, which makes every USB CH341 SPI module (1a86:5512) readable and writable by every account on the machine (mode 0666), and hands SPI and GPIO devices to the spi and gpio groups (mode 0660).
    • The four rules, verbatim in effect from the .deb: spidev devices to group spi, mode 0660; USB 1a86:5512 MODE 0666; gpiomem and gpio devices to group gpio, mode 0660. 1a86:5512 is the WCH CH341 in SPI/I2C mode, the chip on the USB LoRa modules upstream lists (Meshstick, MeshToad, uMesh); other devices that use the same pair are covered too, and no account has to be in any group to use them. It is not written by this engine and not listed in the hardware catalog: it is the package's own file, and it is the reason the plan says so before the confirmation.
    • undo: sudo cp /usr/lib/udev/rules.d/60-meshtasticd.rules /etc/udev/rules.d/60-meshtasticd.rules, edit the 1a86:5512 line to GROUP="plugdev", MODE="0660" (a copy under /etc overrides the packaged file and survives upgrades), then sudo udevadm control --reload
  • package_account — The package's postinst creates the system groups spi and gpio (when the machine has none) and the system user and group meshtasticd, and adds that user to spi, gpio, plugdev, dialout, i2c, video, audio and input where they exist.
    • Read from the postinst: addgroup --system spi and gpio; adduser --system --home /var/lib/meshtasticd --no-create-home meshtasticd; adduser meshtasticd for each of the above that exists. It also runs chown -R meshtasticd:meshtasticd on /var/lib/meshtasticd, /etc/meshtasticd and /usr/share/meshtasticd, so the daemon owns its own configuration. The operator is not added to any group by this unit.
    • undo: hammunition uninstall meshtasticd (apt-get remove) leaves the user, the groups, /etc/meshtasticd and /var/lib/meshtasticd, which hold the node's identity and settings (measured). sudo apt-get purge meshtasticd removes /var/lib/meshtasticd (the postrm); remove the user and groups by hand with sudo deluser meshtasticd and sudo delgroup meshtasticd (and spi, gpio if nothing else uses them) if you want them gone

Third-party apt repositories

Added only when the target's own archive has no candidate, and only after you affirm the key fingerprint (D-040); --yes does not answer it.

Known problems

The package starts and enables a boot service when it installs, as the meshtasticd user, and the plan says so. With no radio configured the shipped Module: auto finds none and the daemon exits within seconds, and systemd restarts it every three seconds until its start limit stops it (the exit was measured; the restart loop is read from the unit, not run). If you only want it on demand, sudo systemctl disable --now meshtasticd.service. The packaged udev rule makes USB 1a86:5512 devices world-writable (mode 0666): any account on the machine can drive such a module while it is plugged in. 1a86:5512 is a generic WCH CH341 pair, the same kind of vendor-chip identifier docs/reference/lora-inventory.md discusses, so the rule is wider than "a Meshtastic radio". The TCP API (4403) has no authentication of its own and listens on every interface (measured), so anyone who can reach the machine on that port can read and change the node: firewall it, or keep the machine off networks you do not trust, before you leave the daemon running. The shipped /etc/meshtasticd/config.yaml is a conffile that the postinst chowns to the daemon's user; leave your changes in /etc/meshtasticd/config.d. The OBS build for Kali and Debian testing needs libc6 2.43 or newer and libyaml-cpp0.9, so it follows Kali's rolling archive and can break the day Kali moves; the Debian 13 build needs libyaml-cpp0.8. Version matching: the node and python3-meshtastic want to be near each other (Debian 13 and Parrot carry 2.6.0 of the client against 2.7.26 of the daemon). No radio has been driven on any target: what ran was the simulator and meshtastic --host over TCP, in containers.

Keeping it current

  • probe: apt policy
  • strategy: apt_upgrade
  • The beta channel moves with Meshtastic's firmware releases, a few times a year, and the same version is built for the OBS and the PPA. The OBS signing key expires 2027-08-26: after that date the Debian, Parrot and Kali repositories stop verifying until a new fingerprint is pinned here.

Where to get help with the software itself

Documentation at https://meshtastic.org/docs/software/linux/ (installation, native meshtasticd and configuration); firmware and meshtasticd source at https://github.com/meshtastic/firmware; packaging in the OBS project network:Meshtastic. Issues at https://github.com/meshtastic/firmware/issues. GPL-3.0: the repository's LICENSE is the GNU GPL version 3 text, 35,148 bytes (whether source files say "only" or "or later" was not read). Liveness per D-032: default branch develop, head 9e4d3018ef47 committed 2026-10-05; latest release tag v2.7.26.54e0d8d, published 2026-06-24, the commit the beta packages (2.7.26.61~...~54e0d8d) are built from.

Source: catalog/packages/meshtasticd.yaml

Clone this wiki locally