The same real Reticulum/LXMF mesh client — now on Linux.
A live-updating GUI that looks like IceNomad, plus a terminal client for anyone who lives there instead.
Main IceNomad project · Tux — the search engine · Report an issue
Built directly on the real rns/lxmf packages (the reference
implementation of Reticulum and LXMF, maintained by the protocol's own
author) rather than a port of IceNomad's own Swift protocol stack —
see the main project's README for why.
This is early — genuinely working, tested live against the real mesh, but young. Expect rough edges and real bugs, not just missing polish. If something breaks, open an issue — that's exactly what this stage is for.
- Real, persistent identity (same load-or-create pattern as the rest of the IceNomad ecosystem)
- LXMF messaging, both directions — confirmed live against Tux
- Persistent message history and contacts (SQLite)
- A live announce feed, integrated where it's actually useful — real peers you can message and real NomadNet nodes you can browse, both updating live over WebSocket, click one to jump right in
- Connection options matching the iOS/Mac app exactly — the same suggested public relays (IceNomad Public Relay by default, plus RMAP, Sydney RNS, Birdsnet BR, Inertia.Chat), or your own custom host/port, picked during onboarding or changed later in Settings
- Real NomadNet
.mupage browsing, with a full Micron renderer (adapted from Tux's own -- colors, bold/underline, headings, dividers, link navigation, and form fields rendered as real inputs) - A GUI styled to match IceNomad itself — same dark theme, ice- blue accent, pill buttons, onboarding flow, and Messages/Browser/ Settings layout as the iOS/Mac app, running in a real native window
Not yet built: RNode (LoRa) support — deferred, since it needs real Linux serial/Bluetooth hardware to test against properly, not something to fake from a Mac. Also not yet built: actually submitting filled-out forms on browsed pages (fields render as real inputs, but nothing wires them to a submit action yet), and packaging beyond a local editable install.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtGUI (looks like IceNomad, runs in its own window):
python3 -m icenomad_linux.guiTerminal client:
python3 -m icenomad_linux(Prefer -m over the icenomad/icenomad-gui console-script entry
points for now — pip's editable-install finder doesn't reliably wire
those up on every Python/setuptools combination; -m is unaffected
and always works as long as you run it from this directory. A real
pip install ., not -e ., doesn't have this problem.)
First run asks for a display name (in the GUI's own onboarding screen,
or a terminal prompt for the CLI), then connects through the same
public relay (rns.icenomad.net:4242) IceNomad's own iOS/Mac app uses
by default — so you're on the same real mesh Tux and everyone else is
on, immediately.
The GUI is also just a local web server under the hood
(127.0.0.1:8723 by default) — point a normal browser at it instead
of the native window if you ever want to, e.g. for remote access over
SSH port-forwarding.
whoami show your own address
send <hash> <text> send a message to a peer
history <hash> show past messages with a peer
peers list contacts heard on the mesh
browse <hash> [path] fetch and render a NomadNet page (default: /page/index.mu)
open <n> follow link [n] from the last page you browsed
help show this list
quit exit
icenomad_linux/
config.py constants, paths, the Reticulum config writer
identity.py persistent identity + display name
db.py shared SQLite connection/schema
message_store.py persistent message history
peer_store.py persistent contacts
micron.py .mu -> terminal renderer (CLI)
micron_html.py .mu -> HTML renderer (GUI), adapted from Tux's own
browser.py NomadNet page fetching over a Link
app.py identity + router + stores, wired together
repl.py the interactive terminal command loop
gui.py GUI entry point (starts the server + a native window)
web/
server.py FastAPI backend behind the GUI -- REST + WebSocket
static/ the actual GUI: index.html, style.css, app.js
Development happens on macOS (the rns/lxmf packages are fully
cross-platform, so this is fine for the bulk of the work), but
anything genuinely Linux-specific — RNode serial device paths, udev
permissions, systemd — needs validating on real Linux hardware before
it's trusted. radioice already runs a live Reticulum node and has
had RNode hardware attached to it; that's the natural place to check
this against before calling anything Linux-specific actually done.

