导出 MD TXT
本页目录

Raspberry Pi

Headless MeshChatX on Raspberry Pi with the release wheel.

This guide shows a simple headless setup for running MeshChatX on a Raspberry Pi 4 with a web UI you can access from another device on your network.

This install path uses a release wheel, which already includes frontend assets.

Automated Setup Scripts#

curl -fsSL 'https://raw.githubusercontent.com/Quad4-Software/MeshChatX/refs/heads/master/scripts/rpi/install_meshchatx.sh' | bash

If you have the repo cloned locally already:

bash scripts/rpi/install_meshchatx.sh

The installer guides you through:

  • Optional espeak-ng install (tries apt/dnf/pacman)
  • Install method (pipx or venv + pip)
  • Wheel choice (latest stable, latest pre-release, or a custom URL)
  • Optional cosign attestation: if a *.whl.cosign.bundle is published next to the wheel, you can verify it. The script uses cosign on PATH if present, or downloads a checksum-verified official Linux binary to /tmp (the Sigstore bundle format is not reimplemented in shell, so you still use the real cosign to verify, without installing a distro package)
  • Storage and Reticulum directories
  • Bind host and port (with availability check)
  • HTTPS on/off (default on)
  • Service mode (system, user, or none)
  • Service startup validation via the HTTP status endpoint

If startup validation fails, it prints recent logs and stops the service to avoid restart loops.

1) Install Base Dependencies#

sudo apt update
sudo apt upgrade -y
sudo apt install -y python3 python3-pip pipx

2) Enable pipx Path#

pipx ensurepath
source ~/.profile

If pipx is not available in your distro package repo, install it with:

python3 -m pip install --user pipx
python3 -m pipx ensurepath
source ~/.profile

3) Install MeshChatX with pipx (recommended)#

Preferred option (recommended): install from a release wheel (4.8.6 or newer), because the wheel bundles frontend assets.

pipx install /path/to/reticulum_meshchatx-<version>-py3-none-any.whl

Direct example (v4.8.6):

pipx install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.6/reticulum_meshchatx-4.8.6-py3-none-any.whl"

py3-none-any wheels are architecture-independent, so the same wheel artifact works on Raspberry Pi ARM and x86_64 Linux systems.

Upgrade example:

pipx upgrade meshchatx

4) Install MeshChatX without pipx (venv + pip)#

If you prefer not to use pipx:

mkdir -p ~/meshchatx
cd ~/meshchatx
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.6/reticulum_meshchatx-4.8.6-py3-none-any.whl"

Run command in venv mode:

~/meshchatx/.venv/bin/meshchatx --headless --host 0.0.0.0 --port 8000

5) Run MeshChatX (Headless)#

meshchatx --headless --host 0.0.0.0 --port 8000

Then open:

http://<pi-ip>:8000

6) Configure a systemd Service#

systemd keeps MeshChatX running in the background and starts it automatically on boot.

You have two service styles:

  • System service (/etc/systemd/system/...) for always-on host services.
  • User service (~/.config/systemd/user/...) for per-user sessions.

Create /etc/systemd/system/meshchatx.service:

[Unit]
Description=MeshChatX Headless (system service)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=pi
Group=pi
WorkingDirectory=/home/pi/meshchatx
Environment="PATH=/home/pi/.local/bin:/usr/bin:/bin"
ExecStart=/home/pi/.local/bin/meshchatx --headless --host 0.0.0.0 --port 8000 --storage-dir /home/pi/meshchatx/storage --reticulum-config-dir /home/pi/.reticulum
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

The above service file is for pipx installs. For venv installs, use:

[Service]
Type=simple
User=pi
Group=pi
WorkingDirectory=/home/pi/meshchatx
Environment="PATH=/home/pi/meshchatx/.venv/bin:/usr/bin:/bin"
ExecStart=/home/pi/meshchatx/.venv/bin/meshchatx --headless --host 0.0.0.0 --port 8000 --storage-dir /home/pi/meshchatx/storage --reticulum-config-dir /home/pi/.reticulum
Restart=always
RestartSec=3

Update User, Group, and paths if your install location is different.

Enable and start:

mkdir -p /home/pi/meshchatx/storage /home/pi/.reticulum
sudo chown -R pi:pi /home/pi/meshchatx
sudo systemctl daemon-reload
sudo systemctl enable --now meshchatx.service
sudo systemctl status meshchatx.service

Option B: User service (no sudo system unit)#

Create ~/.config/systemd/user/meshchatx.service:

[Unit]
Description=MeshChatX Headless (user service)
After=network-online.target

[Service]
Type=simple
WorkingDirectory=%h/meshchatx
Environment="PATH=%h/.local/bin:/usr/bin:/bin"
ExecStart=%h/.local/bin/meshchatx --headless --host 0.0.0.0 --port 8000 --storage-dir %h/meshchatx/storage --reticulum-config-dir %h/.reticulum
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

Enable/start user service:

systemctl --user daemon-reload
systemctl --user enable --now meshchatx.service
systemctl --user status meshchatx.service

If you want user services to stay active without login:

sudo loginctl enable-linger pi

Service management commands#

sudo systemctl restart meshchatx.service
sudo systemctl stop meshchatx.service
sudo systemctl disable meshchatx.service

Useful logs and troubleshooting:

journalctl -u meshchatx.service -f
journalctl -u meshchatx.service -n 200 --no-pager
systemctl show meshchatx.service -p ExecStart -p User -p Group

Reset Password#

If you forget the web UI password and have SSH access to the Pi, reset it with the --reset-password flag:

meshchatx --reset-password --headless --host 0.0.0.0 --port 8000

Or set the environment variable:

MESHCHAT_RESET_PASSWORD=true meshchatx --headless --host 0.0.0.0 --port 8000

This clears the stored password hash on startup. Open the web UI and you will see the Initial Setup screen where you can set a new password. After resetting, you can stop the app and restart without the flag.

Notes#

  • Reticulum configuration and identity data are stored in the service user's home directory by default (for example ~/.reticulum and MeshChatX storage paths).
  • If you attach RNode hardware by USB, make sure the service user has permission to access serial devices (dialout group on Debian-based systems).