Install

The Linux one-liner, systemd or Docker, and why /bin/bash -c must stay.

Meshloom is designed for Linux. A machine that stays on is a much better host than a laptop you close: while the server runs, it listens to the mesh and records what it hears.

An installation script does the work and asks questions in English or French. Paste this into a terminal:

/bin/bash -c "$(curl -fsSL https://get.meshloom.app)"

Why /bin/bash -c

This form is not decoration. The script is interactive: it asks for the language, the installation mode, the installation folder for Docker and, when several serial devices are plugged in, which one to map. With /bin/bash -c "$(...)", the download finishes first, then the script runs with the terminal available for its questions.

If you pipe it — curl … | bash — the script’s input is occupied by the download. Its questions no longer have a terminal to use, and the installation goes wrong. Keep the /bin/bash -c.

What the script asks

The questions, in this order.

The mode. A native service managed by systemd, or Docker. The native service starts automatically with the machine and can talk to a USB, network, or Bluetooth radio. Docker runs in a container, which isolates the installation but restricts hardware access: sharing a USB radio with a container requires root-mode Docker on Linux. If that is not available, the script suggests a network radio.

The radio. Transport is configured in the web UI after install, not with environment variables. A native systemd install does not ask for a serial port, TCP host, or BLE PIN. Docker may still ask USB versus network, only to emit a Compose devices: mapping for a USB radio.

Details for each transport are in Radio transports.

Security. The script asks nothing about security. Bots execute code on the machine and are enabled by default; only the Linux package turns them off, in /etc/meshloom/meshloom.env. Set MESHCORE_DISABLE_BOTS=true to turn them off elsewhere, and MESHCORE_BASIC_AUTH_USERNAME / MESHCORE_BASIC_AUTH_PASSWORD to require a shared login. See A trusted network.

A summary appears before anything starts. Some steps require administrator privileges.

Open the interface

Once installation is complete, on the machine itself:

http://127.0.0.1:8000

From another device on the same network, replace 127.0.0.1 with the machine’s IP address and keep port 8000.

Configure the radio transport in the UI next: First launch.

Do not confuse two nearby addresses. http://127.0.0.1:8000/docs is the technical API documentation generated by the server. It is not this documentation.

To check or restart a native service:

sudo systemctl status meshloom

Update

When in-app updates are available, Settings → Updates installs the new Meshloom release. Automatic updates are off until you enable them there. That path upgrades Meshloom only and never runs a full apt upgrade.

Updates are signed. The installer embeds the Meshloom release key and checks its fingerprint; it never downloads the key, and it never adds an unsigned package source. The Linux package checks the repository signature, and the update helper refuses to run if the Meshloom source is not signature-checked. With Docker, the image is pinned by digest in .env next to docker-compose.yml (MESHLOOM_IMAGE=…@sha256:…), and the update helper only moves that pin to a newer release whose digest is signed. It never downgrades.

If Settings → Updates says you must update manually, or asks you to re-run the installer, re-run it: it keeps your data, replaces an older update helper and, for Docker, keeps the previous Compose file as docker-compose.yml.bak-<date>. If you edited your docker-compose.yml (an extra port, for instance), the installer shows your changes and offers to keep them, which is the default: it then updates only its own lines (image, update helper) and leaves yours alone. If it cannot adapt your file, it leaves it untouched and asks whether to regenerate it. Run the installer as the account that created the stack: root if it lives in /root/meshloom. By hand:

sudo apt-get install --only-upgrade meshloom   # Debian / Ubuntu
sudo dnf install meshloom                      # Fedora
sudo docker compose pull && sudo docker compose up -d   # Docker without the helper

The database stays in place: /var/lib/meshloom for the package, ./data for Docker. Schema migrations run at startup.

A Raspberry Pi can also start from the preinstalled image instead of this one-liner.

On Home Assistant

If Home Assistant already runs on the machine that will host Meshloom, install it as an add-on instead. The interface arrives in the sidebar, the database is kept with the rest of Home Assistant’s data, and it starts and stops with it.

Add the repository to your Home Assistant

The button opens the dialog on your own instance with the address filled in; it is a redirector and learns nothing about you. By hand, the address goes under Settings → Add-ons → Add-on store → ⋮ → Repositories, then install Meshloom from the store.

Two things work differently there:

The radio proxy port is set in Home Assistant, not in Meshloom. The interface is reached through the sidebar and publishes nothing, so the proxy is the only thing on the network. Its port is changed in the add-on’s Network panel; the field inside Meshloom shows it and says so, because a value set there would leave the proxy listening where nothing is forwarded.

Notifications need an address of their own. The sidebar has no durable public address, so Web Push cannot work through it alone. Giving the instance a real hostname — the Cloudflared add-on does this without opening a port on your router — and opening Meshloom at that address is what makes notifications possible. The add-on’s public_url option is passed to Meshloom but has no effect yet.

This is not the same as publishing the mesh to Home Assistant over MQTT, which works from any installation and needs no add-on.

Other paths

The script covers the common case. The rest — the Docker image ghcr.io/twinrocket/meshloom, Portainer, HTTPS, manual systemd setup, environment variables, or a cloned repository for development — is in Other installation paths.

Next: First launch.