Skip to main content

Unified Styrene library and headless daemon for RNS/LXMF mesh networking

Project description

styrened

Legacy Python daemon notice: styrened was Styrene's first foray into Reticulum and LXMF. Some of it was exploratory, vibe-coded prototype work that should have been retired the moment it became clear the approach was not a sound foundation. It was not retired quickly enough. In particular, legacy Meshtastic/MQTT bridge behavior was left in a dangerous state and caused harmful spam on public Reticulum transports. That was unacceptable. It was irresponsible to the Reticulum community and embarrassing for this project.

The Python daemon is now maintenance-only. Public-network behavior is being cut back, rate-limited, and deprecated. The Python Meshtastic/MQTT bridge is disabled by a local startup/config poison pill; remove any meshtastic or mqtt bridge sections from old configs. New transport and bridge work belongs in styrene-rs, not here. See docs/python-daemon-maintenance-policy.md for the maintenance and archival policy.

Daemon, library, and TUI for Reticulum mesh networks.

Overview

styrened is the core of the Styrene mesh networking stack. It provides a headless daemon for edge devices, a terminal UI for interactive fleet management, and a Python library for building mesh applications on RNS/LXMF.

Key Features:

  • Mesh daemon — headless operation on edge devices (Raspberry Pi, NixOS, containers)
  • Terminal UI — full-featured TUI for fleet management, chat, device provisioning
  • RPC over LXMF — remote device management (status, exec, reboot, config)
  • Device discovery — automatic mesh topology tracking
  • Auto-reply — automated message responses with cooldown
  • Direct links — point-to-point RNS links for status queries and speedtests
  • Mesh VPN — WireGuard tunnels bootstrapped over LXMF (IPv6 ULA addressing)
  • HTTP API (optional) — REST/WebSocket endpoints for external integration
  • Nix flake — declarative NixOS deployment with OCI container builds

Installation

# Full stack: daemon + TUI (via meta-package)
pip install styrene

# Daemon only (minimal dependencies)
pip install styrened

# Daemon + TUI
pip install styrened[tui]

# All extras
pip install styrened[tui,web,metrics,yubikey]

Nix Flake

nix run github:styrene-lab/styrened

Container

docker pull ghcr.io/styrene-lab/styrened:latest

Usage

# Run daemon
styrened daemon

# Run TUI
styrene

# CLI tools
styrened devices              # List discovered mesh devices
styrened devices -w 10        # Wait 10s for announces
styrened status               # Local daemon health
styrened status <dest>        # Query remote node
styrened send <dest> "hello"  # Send message
styrened exec <dest> uptime   # Remote command execution
styrened doctor               # Installation diagnostics
styrened doctor --setup       # Interactive setup wizard
styrened identity             # Show local identity

Architecture

┌──────────────────────────────────────┐
│  styrened                            │
│  ├── tui/          Terminal UI       │  pip install styrened[tui]
│  ├── services/     Business logic    │
│  ├── protocols/    LXMF routing      │
│  ├── rpc/          Remote mgmt       │
│  ├── models/       Data models       │
│  └── web/          HTTP API          │  pip install styrened[web]
├──────────────────────────────────────┤
│  RNS + LXMF (Reticulum Stack)       │
└──────────────────────────────────────┘

Async-first — all network operations use asyncio. The daemon runs an event loop with periodic tasks for announces, discovery, and mesh maintenance.

Protocol discrimination — LXMF messages are routed to handlers based on fields["protocol"], supporting chat (NomadNet/MeshChat), Styrene wire protocol, and VPN handshake messages.

Configuration

Config file: ~/.styrene/config.yaml

identity:
  display_name: "My Node"

reticulum:
  mode: standalone
  interfaces:
    peers:
      - host: rns.styrene.io
        port: 4242

rpc:
  enabled: true

chat:
  auto_reply_mode: template
  auto_reply_message: "Automated node"

mesh_vpn:
  enabled: false
  gateway: false

Installation Extras

Extra Adds
[tui] Terminal UI (textual, psutil)
[web] HTTP API (fastapi, uvicorn)
[metrics] Prometheus metrics
[yubikey] YubiKey authentication

Development

git clone https://github.com/styrene-lab/styrened
cd styrened
pip install -e ".[tui,dev]"

just test-unit    # ~5s, 2200+ tests
just test         # Full suite
make lint         # ruff
make typecheck    # mypy
make validate     # lint + typecheck + test

Related Projects

  • styrene-rs — Rust RNS/LXMF implementation (interoperable wire protocol)
  • styrene-pypi — PyPI meta-package (pip install styrene)
  • Reticulum — The underlying mesh networking stack

License

MIT

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

styrened-0.18.0.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

styrened-0.18.0-py3-none-any.whl (628.6 kB view details)

Uploaded Python 3

File details

Details for the file styrened-0.18.0.tar.gz.

File metadata

  • Download URL: styrened-0.18.0.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for styrened-0.18.0.tar.gz
Algorithm Hash digest
SHA256 94b70b0bdd48b4676f992a73a78ec00d18e2c12e0b560e6fd791f07c2e9a6fd7
MD5 3392d64ff75f392a2f3fe192e9697f4a
BLAKE2b-256 988298478022eff28b000a03e56d6408a411687e969658157fa608c2282a86d8

See more details on using hashes here.

File details

Details for the file styrened-0.18.0-py3-none-any.whl.

File metadata

  • Download URL: styrened-0.18.0-py3-none-any.whl
  • Upload date:
  • Size: 628.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for styrened-0.18.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59484e7a6ed7b3b48bbdedb0a339d3df73fdbf2ea99e5a4cb71c639e87e8b997
MD5 8d4785a269e67d0c76670e2630279220
BLAKE2b-256 9f67cc23a24a10c72d0cd53abb440e0992df38244abbc6019a23b40b2d09a0eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page