rWeb is a complete web browsing system for the Reticulum mesh network, enabling decentralized HTML content delivery over LXMF (Lightweight Extensible Message Format). Browse websites, download files, and discover servers - all without internet infrastructure.
First version, may contain bugs, expect new updates soon!
- Multi-format serving: HTML pages, images (JPG, PNG, GIF, WebP), PDFs, text files, and archives (ZIP, RAR, 7z)
- Automatic discovery: Announces presence on the mesh network with
[HTML]identifier - File attachment support: Binary file transfers via LXMF fields
- Click-through navigation: Internal links work seamlessly between pages
- Template system: Dynamic content with timestamp and file list variables
- Access logging: Track page requests and server statistics
- Cross-platform: Works on Linux, Windows, macOS, and Android (Termux)
- Auto-discovery: Automatically detects HTML servers announcing on the network
- Web-based UI: Modern Flask/SocketIO interface accessible via web browser
- Real-time updates: Live server discovery and page notifications
- Bookmarks system: Save favorite servers for quick access
- Browsing history: Track visited pages with timestamps
- File downloads: Automatic downloads for images, PDFs, and archives
- Responsive design: Works on desktop and mobile browsers
- Server management: Add/remove discovered servers
# Python 3.7 or higher
python3 --version
# Reticulum Network Stack
pip install rns
# LXMF (Lightweight Extensible Message Format)
pip install lxmf
# Flask and SocketIO (for browser only)
pip install flask flask-socketio- Operating System: Linux, Windows 10+, macOS, or Android (via Termux)
- Network: At least one configured Reticulum interface (LoRa, TCP, UDP, I2P, etc.)
- Python: Version 3.7 or higher
- Disk Space: Minimal (~10MB for software, varies with content)
On Linux/macOS:
# Install Python packages
pip3 install rns lxmf flask flask-socketio
# Verify installation
python3 -c "import RNS, LXMF; print('Dependencies OK')"On Windows:
# Install Python packages
pip install rns lxmf flask flask-socketio
# Install colorama for terminal colors
pip install coloramaOn Android (Termux):
# Update packages
pkg update && pkg upgrade
# Install Python and dependencies
pkg install python
pip install rns lxmf flask flask-socketioCreate or edit ~/.reticulum/config:
[reticulum]
enable_transport = False
share_instance = Yes
# Example: Auto-interface (discovers local Reticulum instances)
[interfaces]
[[Default Interface]]
type = AutoInterface
enabled = YesFor more interface options, see the Reticulum Manual.
# Basic usage
python3 rWeb_server.py
# Custom storage path
python3 rWeb_server.py --storage ~/my_html_server
# Custom server name
python3 rWeb_server.py --name "My Server"
# Custom announce interval (in seconds)
python3 rWeb_server.py --announce-interval 3600
# View statistics
python3 rWeb_server.py --statsDefault content location: ~/.lxmf_html_server/pages/
The server will:
- Create default example pages on first run
- Announce itself on the network with
[HTML]prefix - Serve files to requesting clients
- Log all access requests
# Basic usage
python3 rWeb_client.py
# Custom storage path
python3 rWeb_client.py --storage ~/my_browser_dataThen open your web browser to: http://localhost:5080
The browser will:
- Listen for HTML server announces
- Display discovered servers in the sidebar
- Enable bookmarking and history tracking
- Handle file downloads automatically
~/.lxmf_html_server/
βββ pages/ # Your HTML files and content
β βββ index.html # Auto-generated index
β βββ about.html # Example page
β βββ help.html # Example page
β βββ [your files] # Add any supported files here
βββ config.json # Server configuration
βββ access.log # Access log
βββ identity # LXMF identity
~/.lxmf_html_browser/
βββ cache/ # Downloaded files
βββ html_cache/ # Rendered HTML pages
βββ bookmarks.json # Saved bookmarks
βββ history.json # Browsing history
βββ discovered_servers.json # Known servers
βββ identity # LXMF identity
Place HTML files in ~/.lxmf_html_server/pages/:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Page</title>
</head>
<body>
<h1>Welcome to My Page</h1>
<p>Current time: {{timestamp}}</p>
<p>Available files: {{page_count}}</p>
<!-- Internal links work automatically -->
<a href="about.html">About</a>
<a href="help.html">Help</a>
</body>
</html>{{timestamp}}- Current server time{{page_count}}- Number of available files{{page_list}}- Auto-generated HTML links to all files
- HTML:
.html,.htm - Text:
.txt,.md - Images:
.jpg,.jpeg,.png,.gif,.bmp,.webp - Documents:
.pdf - Archives:
.zip,.rar,.7z
# Show help
python3 rWeb_server.py --help
# Set custom announce interval (1 hour)
python3 rWeb_server.py --announce-interval 3600
# Disable auto-announce
python3 rWeb_server.py --no-auto-announce
# View server statistics
python3 rWeb_server.py --statsServer Discovery:
- Servers appear automatically in the "Servers" tab
- Shows server name, LXMF address, and last seen time
- Click server name or any page to request content
Bookmarks:
- Click β Bookmark button to save current server
- Access saved servers from "Bookmarks" tab
- Remove bookmarks with ποΈ button
History:
- All visited pages tracked with timestamps
- View full LXMF URLs
- Clear history with one click
Downloads:
- Files automatically download when served
- Saved to browser's cache directory
- Images, PDFs, and archives supported
If a server isn't auto-discovered, add it manually:
- Get the server's LXMF hash from the server terminal
- Enter in browser address bar:
lxmf://hash/index - Click "Go" to connect
- End-to-end encryption: All LXMF messages are encrypted
- Identity-based: Each server/browser has unique cryptographic identity
- No central authority: Fully decentralized operation
- Stamp costs: Optional anti-spam mechanism (disabled by default)
- Ratchets: Forward secrecy supported (optional)
# Check Reticulum status
rnstatus
# Verify interfaces are up
cat ~/.reticulum/config
# Check server logs
python3 rWeb_server.py --stats# Verify Reticulum is running
rnstatus
# Check browser logs for [ANNOUNCE] messages
# Should see: [ANNOUNCE] LXMF delivery destination: ...
# Manually add server if needed
# Use: lxmf://server_hash/index- Check file size limits in browser settings
- Verify file exists in server's pages directory
- Check server logs for access attempts
- Verify Flask is running:
http://localhost:5080 - Check firewall settings
- Try alternative port: modify
socketio.run(app, port=5080)in code
- Off-grid websites: Host content over LoRa mesh networks
- Emergency communications: Serve information during infrastructure failure
- Privacy-focused browsing: No ISP tracking or centralized servers
- Rural connectivity: Share content over long-range radio
- Disaster recovery: Maintain local information networks
- Private networks: Company intranets without internet dependency
- Protocol: LXMF over Reticulum Network Stack
- Transport: Opportunistic routing with automatic path discovery
- Encryption: Curve25519 + AES-256
- Delivery: Direct links or propagation node routing
- File Transfer: LXMF field 0x02 (FILE_ATTACHMENTS)
- HTML Content: LXMF field 0x0A (custom HTML field)
Server announces include:
- Destination aspect:
lxmf.delivery - Display name:
[HTML] server_name - Stamp cost: Optional anti-spam parameter
Browser listens for announces with [HTML] prefix and automatically discovers servers.
Contributions welcome! Areas for improvement:
- CSS/JavaScript support in HTML pages
- Search functionality across servers
- Download progress indicators
- Multi-language support
- Custom themes for browser UI
- Page caching and offline mode
- WebDAV-style file management
MIT License - See LICENSE file for details
Built on:
- Reticulum Manual: https://markqvist.github.io/Reticulum/manual/
- LXMF Documentation: https://github.com/markqvist/lxmf
- Issues: Open an issue on GitHub
rWeb v0.1 - Bringing the web to mesh networks ππ‘