Skip to main content

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

Project description

styrened

Headless Styrene daemon for edge deployments on Reticulum mesh networks.

Overview

styrened is the Styrene daemon and library for Reticulum mesh networks. It provides both headless daemon functionality for edge devices and the core library used by styrene-tui. Optimized for resource-constrained edge devices and designed for easy deployment via Nix flakes on NixOS.

Key Features:

  • Zero UI dependencies - No textual, minimal footprint
  • RPC server - Remote device management over LXMF
  • Auto-reply handler - Respond to mesh messages automatically
  • Device discovery - Track mesh network topology
  • HTTP API (optional) - REST endpoints for status/control
  • Nix flake - Declarative NixOS deployment

Architecture

┌──────────────────┐
│  styrene-tui     │  ← Terminal UI (optional)
├──────────────────┤
│  styrened        │  ← This package: daemon + library
│  (RNS, LXMF,     │
│   protocols,     │
│   services)      │
├──────────────────┤
│  Reticulum Stack │
└──────────────────┘

styrened serves two purposes:

  1. As a library - Provides RNS/LXMF services, protocols, and models used by styrene-tui
  2. As a daemon - Runs headless on edge devices for fleet management

Installation

PyPI

pip install styrene             # Full stack: daemon + TUI (meta-package)
pip install styrened            # Daemon only (no UI dependencies)
pip install styrened[tui]       # Daemon + Terminal UI

Nix Flake

# Run directly
nix run github:styrene-lab/styrened

# Or add to your flake.nix
{
  inputs.styrened.url = "github:styrene-lab/styrened";

  outputs = { self, nixpkgs, styrened }: {
    # ...
  };
}

NixOS Module

# configuration.nix
{
  inputs.styrened.url = "github:styrene-lab/styrened";

  # ...

  services.styrened = {
    enable = true;
    # user = "styrened";  # Optional: custom user
  };
}

Containers / Kubernetes

OCI container images are published to GitHub Container Registry (built via nix2container):

# Production image
docker pull ghcr.io/styrene-lab/styrened:latest
docker pull ghcr.io/styrene-lab/styrened:0.4.0

# Edge builds (main branch)
docker pull ghcr.io/styrene-lab/styrened:edge

# Test images (includes test dependencies)
docker pull ghcr.io/styrene-lab/styrened-test:latest

Supported platforms: linux/amd64

Run container:

docker run -d \
  --name styrened \
  -v ~/.styrene:/config \
  -v styrene-data:/data \
  ghcr.io/styrene-lab/styrened:latest

Available tags:

  • latest - Latest stable release (production image)
  • edge - Latest main branch build (production image)
  • v0.2.1 - Specific release version
  • <commit-sha> - Build from specific commit

See tests/k8s/helm/styrened-test for Kubernetes deployment examples.

Building from Source

For local builds and development:

# Build production OCI image (via Nix)
just build

# Build test OCI image
just build-test

# Show version information
just version

See CONTAINERS.md for complete build pipeline documentation, including:

  • Nix OCI build pipeline (nix2container)
  • Pushing to GitHub Container Registry
  • CI/CD integration
  • Troubleshooting

Usage

Command Line

# Run daemon with default config
styrened

# Or via Python module
python -m styrened

# Run TUI (requires styrened[tui])
styrene

# TUI with options
styrene --dashboard           # Compact dashboard mode
styrene --headless            # Headless mode with daemon
styrene --peer host:port      # Connect to specific peer

Configuration

Config file: ~/.styrene/config.yaml (or /etc/styrene/config.yaml for system-wide)

reticulum:
  mode: client
  transport_enabled: false

rpc:
  enabled: true
  authorized_operators:
    - identity_hash: "abc123..."
      role: operator

discovery:
  announce_interval: 300

chat:
  auto_reply_mode: template
  auto_reply_message: "This is an automated system"

api:
  enabled: false
  host: "0.0.0.0"
  port: 8000

Programmatic Usage

import asyncio
from styrened import StyreneDaemon
from styrened.services.config import get_default_config

config = get_default_config()
daemon = StyreneDaemon(config)

asyncio.run(daemon.start())

Features

RPC Server

Handles incoming LXMF messages for remote device management:

  • status_request - CPU, memory, disk, network stats
  • exec - Execute whitelisted commands
  • reboot - Schedule system reboot
  • update_config - Update configuration remotely

Auto-Reply

Automatically responds to LXMF messages from NomadNet/MeshChat users.

Device Discovery

Listens for RNS announces and tracks discovered devices.

HTTP API (Optional)

REST endpoints for status and control (when api.enabled: true).

Deployment Scenarios

Edge Device (NixOS)

# Minimal edge node configuration
services.styrened = {
  enable = true;
};

Mesh Gateway

# Gateway config
reticulum:
  mode: gateway
  transport_enabled: true

rpc:
  enabled: true

Monitoring Node

# Discovery-focused config
discovery:
  announce_interval: 60

api:
  enabled: true
  port: 8000

Installation Extras

Extra Install Adds
(none) pip install styrened Headless daemon only (minimal deps)
[tui] pip install styrened[tui] Terminal UI (+textual, +psutil)
[web] pip install styrened[web] HTTP API (+fastapi, +uvicorn)
[metrics] pip install styrened[metrics] Prometheus metrics
[yubikey] pip install styrened[yubikey] YubiKey authentication

Development

# Clone repository
git clone https://github.com/styrene-lab/styrened
cd styrened

# Install in development mode
pip install -e ".[dev]"

# Run tests
pytest

# Type checking
mypy src/

# Linting
ruff check src/

Requirements

  • Python 3.11+
  • RNS (Reticulum Network Stack)
  • LXMF
  • msgpack

Related Projects

  • styrene-tui - Terminal UI for interactive operation
  • styrene - Organization docs and research

License

MIT License

Documentation

API Reference

Auto-generated API documentation is available at:

styrene-lab.github.io/styrened

The API reference is built from source using pdoc and updated automatically on each release.

Generate Locally

# Install docs dependencies
pip install -e ".[docs]"

# Generate static docs to docs/api/
just docs

# Serve with live reload for development
just docs-serve

Related Documentation

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.10.52.tar.gz (1.1 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.10.52-py3-none-any.whl (512.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for styrened-0.10.52.tar.gz
Algorithm Hash digest
SHA256 25348cd6a495c512b1d19548e9519b7d7293d21331054b1fa4fe8e4c951a2d47
MD5 ab0348c8eb237385309d967230ba7a79
BLAKE2b-256 2e6386ad2de45b8d2ebf4ba2d3e8df8a0a47aac5a1050c4c79e7f53ea4d0cf13

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for styrened-0.10.52-py3-none-any.whl
Algorithm Hash digest
SHA256 3f227c59762758434bde6e1844665029e3c1507c61af4b88eaa43f7d31146790
MD5 2707cc150ac3fbe8b619694d77e9f204
BLAKE2b-256 c868893ebf9408c497447cd6e82288d59cc55d9590aa7baf65ce9a7b964ca04b

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