A complete guide to Nomad Network — the distributed publishing and communication layer built on Reticulum. Browse µ-pages, run a node, host your own content, and explore what the mesh looks like when it grows up.
Nomad Network is a distributed content and communication platform built entirely on top of Reticulum. It was created by Mark Qvist — the same person who wrote Reticulum itself — and it answers a question that most mesh networking projects never ask: once you have a radio network that works, what do you actually do with it?
The answer Nomad Network gives is: you build a web. Not the World Wide Web — no IP addresses, no DNS, no servers to subpoena — but a genuinely distributed publishing layer where any node on the Reticulum network can host content and any other node can retrieve it. Pages travel over LoRa radio, TCP, serial links, and any other interface Reticulum supports. They're encrypted in transit. They're addressed by cryptographic hash, not by domain name. And they're served directly from the device that owns them.
This is what the mesh looks like when it grows up. Meshtastic gets people talking. Nomad Network gives them something to say — and a permanent, censorship-resistant place to say it.
Nomad Network is a decentralized web browser and server for the Reticulum mesh. Every node is both a server and a client. There are no central hosts, no domain registrars, and no one who can take a page down. If your node is reachable on the mesh, your content is reachable.
Navigate distributed pages hosted on other nodes. Follow links. Read community boards, project documentation, node directories, and whatever else people are publishing on the mesh.
Exchange LXMF messages with other NomadNet users. These are signed, encrypted, and delivered store-and-forward across any Reticulum interface — LoRa included.
Publish pages, run a bulletin board, or simply act as a relay. A NomadNet node makes you a first-class citizen of the mesh — not just a reader, but a publisher.
Nodes with propagation enabled relay LXMF messages for others, extending the effective reach of the network beyond the range of any single radio link.
Reticulum is the networking layer. It handles routing, identity, encryption, and transport — over any physical medium. NomadNet is an application built on top of Reticulum, in the same way that a web browser is an application built on top of TCP/IP. The two are distinct but inseparable: NomadNet without Reticulum is a program with nowhere to go. Reticulum without NomadNet is a protocol with no user-facing application to show for it.
| Layer | What It Does | Analogy |
|---|---|---|
| LoRa / TCP / Serial | Physical transport — moves bits between devices | Ethernet / WiFi cable |
| Reticulum (RNS) | Cryptographic routing, identity, packet delivery | TCP/IP |
| LXMF | Lightweight message format for messages and mail | SMTP / email protocol |
| NomadNet | Node hosting, µ-page browsing, message client | Web browser + web server |
| Micron | Markup language for µ-pages | HTML |
NomadNet works over TCP just as well as over LoRa. The Reticulum testnet runs over the internet and connects to real NomadNet nodes. You can browse the mesh right now from your laptop, before you own a single radio. The experience is identical — the only difference is range and resilience when the internet goes down.
NomadNet isn't the only application built on Reticulum — it's the oldest and most featureful. Here's how it relates to the other major apps:
| App | Purpose | Interface |
|---|---|---|
| NomadNet | Node hosting, µ-page browsing, LXMF messaging | Terminal (ncurses) |
| Sideband | LXMF messaging client, simpler and mobile-friendly | GUI (Android, iOS, desktop) |
| MeshChat | Web-based Reticulum client with voice and NomadNet browser | Web browser |
| Nomad NetBrowser | Local web proxy for browsing NomadNet µ-pages in any browser | Web browser (Node Star tool) |
A µ-page (micro-page) is a document hosted on a NomadNet node and addressed by the node's Reticulum destination hash. When you request a page, NomadNet opens an encrypted link to the destination, sends the page path over that link, and receives the content in response. No HTTP. No TLS handshake. No DNS lookup. The routing, authentication, and encryption are all handled by Reticulum at the transport layer.
Pages are written in Micron — a simple, lightweight markup language designed for the constraints of radio transmission. It's not HTML. It's closer to a structured plain-text format that supports headings, emphasis, color, and clickable links. Nodes transmitting over LoRa have limited bandwidth, so Micron keeps pages small by design.
Here's how raw Micron source translates to formatted output:
Welcome to the Node Star network.
Status: Online
| Syntax | Effect |
|---|---|
> Heading | Level 1 heading |
>> Heading | Level 2 heading |
>>> Heading | Level 3 heading |
---- or ==== | Horizontal divider |
`!`text`!!` | Bold text |
`_`text`__` | Underlined text |
`Fgreen`text`f` | Green foreground color (named or 0–255) |
`B196`text`b` | Background color (256-color index) |
`[Label`=hash/path` | Clickable link to another node/page |
`[Label`=/local/page.mu` | Link to a page on the same node |
Every page on a NomadNet node is addressed as destination_hash/path/to/page.mu. The destination hash is the 32-character hex identifier of the node. The path is relative to the node's page root. If no path is given, index.mu is fetched by default.
NomadNet requires Python 3.7 or higher and an active Reticulum instance. If you don't have Reticulum running yet, see Field Guide Vol. 1 first. NomadNet will connect to whatever Reticulum interfaces you have configured — LoRa, TCP, or both.
$ pip install nomadnet
This installs NomadNet and its dependencies, including rns (Reticulum) if it isn't already installed.
$ nomadnet
On first run, NomadNet generates a local identity and creates its configuration directory at ~/.nomadnetwork/. It will start Reticulum automatically if it's not already running as a daemon.
You should see the NomadNet terminal interface — a split-screen layout with a message panel, a node browser, and a status bar showing your active Reticulum interfaces. If Reticulum connects to the testnet automatically (via AutoInterface on LAN, or if you have TCP configured), you'll start seeing announces from other nodes within a few minutes.
If you're on a machine with internet access, Reticulum's AutoInterface will attempt to connect to other local nodes via UDP multicast. To also reach the global testnet (including nodes in Dublin and Frankfurt), add a TCP interface to your Reticulum config at ~/.reticulum/config:
# ~/.reticulum/config
[interfaces]
[[Dublin Testnet]]
type = TCPClientInterface
enabled = yes
target_host = dublin.connect.reticulum.network
target_port = 4965
[[Frankfurt Testnet]]
type = TCPClientInterface
enabled = yes
target_host = frankfurt.connect.reticulum.network
target_port = 4965
Restart rnsd (or NomadNet) after editing the config. You should see both interfaces show as active in the status bar.
Frankfurt also listens on port 5377 in some configurations — if port 4965 fails to connect, try 5377. Testnet infrastructure does occasionally change. For always-current entrypoints, check unsigned.io or directory.rns.recipes, which maintain a community-verified list of active TCP interfaces.
Before you can browse a µ-page, Reticulum needs a path to the destination — a routing entry that tells it how to reach that node's hash. Paths propagate through the network via announces: when a node comes online, it broadcasts a signed announce that ripples out through every relay and transport node that receives it. Your local Reticulum instance stores these paths in a path table.
In practice: if a node is online and reachable, you'll have a path to it within a few minutes of connecting to the network. If you try to fetch a page before the path exists, Reticulum will send a path request and wait for a response. NomadNet handles this automatically — it just takes a moment longer the first time.
Every NomadNet node is identified by a destination hash — a 32-character hexadecimal string derived from the node's cryptographic identity and application name. It's the address you navigate to, equivalent to a domain name — except it's generated locally, requires no registration, and is impossible to spoof.
# Example destination hash
abb3ebcd03cb2388a838e70c001291f9
# To request a specific page on that node:
abb3ebcd03cb2388a838e70c001291f9/pages/about.mu
# Default page (index.mu) if no path is specified:
abb3ebcd03cb2388a838e70c001291f9
Once NomadNet is running, your node's destination hash is displayed in the interface. You can also retrieve it from the command line:
$ rnid
Identity : <your identity hash>
Destination: <your node destination hash>
Share your destination hash with others to let them reach your node — or publish it in a node directory.
NomadNet's built-in interface is a full-featured ncurses terminal application. It's split into panels: a message thread on the left for LXMF conversations, and a node browser on the right for navigating µ-pages. The two panels can be toggled, resized, and navigated entirely from the keyboard.
| Key | Action |
|---|---|
Tab | Switch between message panel and browser panel |
↑ / ↓ | Navigate links on a page or scroll messages |
Enter | Follow selected link |
Backspace | Go back to the previous page |
G | Open the Go To dialog — enter a destination hash directly |
Q | Quit NomadNet |
Here's what the NomadNet interface looks like. The left panel handles LXMF messages. The right panel is the µ-page browser. Focus switches between them with Tab.
Press Tab to move focus to the right-side browser panel.
Press G. A prompt will appear asking for a destination address.
Type the hash (with or without a page path) and press Enter. NomadNet will resolve the path, open a link, fetch the page, and render it.
abb3ebcd03cb2388a838e70c001291f9
If this is the first time you've connected to a node, Reticulum may take 5–20 seconds to resolve a path. This is normal — it's sending a path request across the network and waiting for the node to respond. Subsequent fetches to the same node are much faster.
The Nomad Network doesn't have a central directory — that would defeat the point. But the community maintains informal lists of known nodes, and several official testnet hubs run by unsigned.io (Mark Qvist's project) serve as well-known starting points. Once you connect to any of these, you can follow links to discover others.
Start at the Dublin Hub — its index page links to a community node directory. From there, follow links to find active nodes. The network is small but growing, and every node you visit may link to others you haven't seen yet.
Running a NomadNet node makes you a publisher on the mesh. Your node gets a permanent destination hash, can serve µ-pages to anyone who connects, and can optionally propagate LXMF messages for others — extending the effective reach of the network.
The simplest setup is just running nomadnet with the default configuration. It will serve whatever pages you place in the pages directory and announce itself to the network. For a permanent node, you'll want to run it on a Raspberry Pi or similar always-on machine.
NomadNet's config lives at ~/.nomadnetwork/config. The defaults are sane — but these are the settings worth knowing:
ini# ~/.nomadnetwork/config
[node]
# Enable serving pages to other nodes
enable_node = yes
# Your node's display name
node_name = My Node
# Announce every N seconds (3600 = once per hour)
announce_at_start = yes
announce_interval = 3600
# Propagate LXMF messages for others
enable_propagation = no
[paths]
# Where your pages live
page_path = ~/.nomadnetwork/pages
~/.nomadnetwork/pages/
├── index.mu # Default page (fetched when no path given)
├── about.mu # Reachable at hash/about.mu
└── links/
└── directory.mu # Reachable at hash/links/directory.mu
For a reliable public node, run NomadNet in headless mode on a Pi Zero 2W or similar hardware. Use nomadnet --daemon to run without the interactive interface, or pair it with a systemd service for automatic startup on boot. A Pi Zero 2W consumes under 1W at idle and costs about $15 — it's the right tool for a permanent mesh presence.
Micron files are plain text with a .mu extension. You can write them in any text editor. There is no compilation step, no build system, no dependencies — save the file and your node serves it immediately.
The design philosophy of Micron is constraint as a feature. Pages are small by necessity, which means they load fast over radio links and stay focused. A good µ-page is concise, clearly structured, and links generously to other nodes and pages. Think gopher, not the modern web.
micron# index.mu — a simple node home page
> Node Star · Mesh Networking Resources
>> About This Node
Welcome to the `!Node Star`!! Reticulum node.
Running LoRa at 915 MHz · Long Beach, CA
---
>> Pages
`[Field Guides`=/pages/guides.mu`
`[Node Directory`=/pages/directory.mu`
`[About`=/pages/about.mu`
---
>> Other Nodes
`[Dublin Hub`=abb3ebcd03cb2388a838e70c001291f9/index.mu`
`[Frankfurt Hub`=ea6a715f814bdc37e56f80c34da6ad51/index.mu`
---
`Fgreen`Status: Online · `f`Updated 2026
index.mu — it's what people see when they navigate to your hash with no path.> hierarchy renders clearly in both the terminal client and Nomad NetBrowser.The terminal interface is powerful, but it's not for everyone. If you'd rather explore the mesh web in a regular browser — with clickable links, formatted text, back/forward navigation, and bookmarks — Nomad NetBrowser is the tool for that.
It's a local web proxy built by Node Star. You run it on your machine, it connects to Reticulum, and it renders NomadNet µ-pages as clean HTML. Point Chrome, Firefox, or any other browser at localhost:5000 and navigate the mesh exactly as you would a website. No terminal required after setup.
A local web proxy for browsing Nomad Network µ-pages in any web browser. Full Micron rendering, back/forward navigation, bookmarks, a built-in node directory, and a raw source viewer. Runs entirely on your machine — no data leaves your computer except through Reticulum itself.
Download for Linux$ sudo dpkg -i nomad-netbrowser_0.1.0_amd64.deb
$ nomad-netbrowser
$ pip install rns nomadnet flask
$ python3 nomadbrowser.py
Navigate to http://localhost:5000. Paste a destination hash into the address bar and press GO. The app opens your default browser automatically on launch.
| Feature | Terminal Client | Nomad NetBrowser |
|---|---|---|
| Browse µ-pages | Yes | Yes |
| Clickable links | Yes | Yes |
| Back / Forward navigation | Limited | Yes |
| Bookmarks | No | Yes |
| 256-color rendering | Yes | Yes |
| LXMF messaging | Yes | No |
| Node hosting | Yes | No |
| Terminal required | Yes | No |
Nomad NetBrowser is open source under the MIT license. Source code and issue tracker at codeberg.org/node-star/nomad-netbrowser. Pull requests welcome — especially Micron rendering improvements and testing against live nodes.
This is the most common first-run problem. Check that your Reticulum config includes the testnet TCP interfaces and that rnsd is running or NomadNet started it. Run rnstatus from the terminal — you should see at least one interface marked as active with traffic flowing. If all interfaces show zero TX/RX, the config file may not be loading from the expected path (~/.reticulum/config).
Path resolution on the first connection to a node can take anywhere from a few seconds to about 20 seconds — this is normal. Reticulum sends a path request and waits for the node to respond with a signed announce. If resolution never completes, the node may be offline, or your connection to the testnet may not be routing correctly. Try connecting to the Dublin Hub first (it's the most reliably online node) and wait up to 30 seconds before concluding there's a problem.
You have a path to the node but no stored identity for it. This means the node hasn't sent an announce that your Reticulum instance has seen yet — it may have just come online, or your local path table is stale. Wait a minute and try again. If the problem persists, the node may be running with transport mode disabled and relying solely on direct announces, which take longer to propagate.
A link established but the page request timed out or the node closed the connection before responding. The node is reachable but the specific page path may not exist, or the node's page server may not be enabled (enable_node = yes must be set in its config). Try navigating to index.mu explicitly, or use the raw source viewer at /raw/<hash> in Nomad NetBrowser to diagnose.
When running Nomad NetBrowser, pass --verbose to see detailed RNS events printed to the terminal: path resolution attempts, link establishment, request/response timing, and error conditions. This is the fastest way to understand exactly where a connection is failing.
| Resource | URL |
|---|---|
| Reticulum Project | reticulum.network |
| Reticulum Manual | reticulum.network/manual |
| NomadNet Source | github.com/markqvist/NomadNet |
| Sideband (LXMF app) | github.com/markqvist/Sideband |
| Nomad NetBrowser | codeberg.org/node-star/nomad-netbrowser |
| Node Star | nodestar.net |
| Name | Destination Hash | Type |
|---|---|---|
| Dublin Hub | abb3ebcd03cb2388a838e70c001291f9 | Official |
| Frankfurt Hub | ea6a715f814bdc37e56f80c34da6ad51 | Official |
| BetweenTheBorders | f8ac9c41b857ddf13a9151cec211079b | Community |
| Node Star | 9a5548134799cfb6e9f60decc8708bc1 | Community |
| Host | Port |
|---|---|
dublin.connect.reticulum.network | 4965 |
frankfurt.connect.reticulum.network | 4965 |