README

Reticulum Community Hub (RCH)

Community-owned coordination over Reticulum.

Reticulum Community Hub gives a group a shared place to communicate, maintain a common operational picture, coordinate work, and exchange files over Reticulum and LXMF. It is designed for intermittent links, limited bandwidth, and networks that must remain useful without depending on a central Internet service.

RCH is the hub and operator interface in the R3AKT product family:

R3AKT
Reticulum Resilient Response Tactical Kit
Democratizing Situational Awareness

What RCH provides

RCH adds shared services and persistent state to a Reticulum network:

  • targeted, broadcast, and topic-based messaging over LXMF;
  • telemetry collection and a shared map with operator-managed markers;
  • missions, teams, members, assets, skills, and assignments;
  • collaborative checklists for procedures and field tasks;
  • Emergency Action Messages and team status summaries;
  • file and image storage with topic associations;
  • a REST and WebSocket API for clients and integrations;
  • an optional TAK connector for Cursor-on-Target chat and position exchange.

SQLite is the durable message-history and delivery-recovery owner. The runtime message cache keeps at most 500 records and an estimated 32 MiB, with a 30-minute inactivity limit. /Chat/Messages reads durable history, so cache eviction does not remove old messages or abandon pending delivery. See bounded persistence for the transaction, migration, and validation details.

RCH does not replace Reticulum. Reticulum provides the network. RCH provides the shared coordination services that a community or field team needs on top of it.

Where it fits

REM, R3AKT Client, and other LXMF applications
                     |
              Reticulum + LXMF
                     |
            LXMF-rs reticulumd
                     |
              RCH Rust server
               /           \
       Web/Desktop UI     REST/WebSocket API
                              |
                     Optional TAK service
                              |
                         TAK network

A hub can serve a local group, operate across several Reticulum interfaces, or participate in a larger federation without surrendering local control.

Project status

RCH is being rewritten in Rust for the 3.0 product line. The current workspace contains the Rust server, shared domain crates, the Reticulum/LXMF transport adapter, the web and desktop application, and a separate TAK connector service.

The Rust edition is currently preview software. Use it for testing, integration work, and community evaluation. Review the release notes before using it for unattended or safety-critical deployments.

The current testing candidate is v3.0.0-preview.36, a Linux AMD64 server prerelease for DigitalOcean evaluation. It pairs LXMF-rs SDK 0.16.1-rc.1-linux with v0.16.1-rc.1-linux at immutable revision 213af2d8048ded5ff38f67ca8c0b4cc143d19ada. The existing release workflow builds the complete Linux AMD64 server archive and a Debian installer using Debian 12 (Bookworm) and Rust 1.99.1; other server platforms and desktop packages are outside this candidate’s scope. Preview.25 remains the earlier full-platform package record. Release notes for every preview are attached to its GitHub release; older notes are kept under docs/. Install the server and daemon from the same package or pinned revision. The AMD64 Debian package targets Debian 12 or later and compatible Ubuntu releases whose libraries satisfy its declared dependencies. It includes the UI and paired daemon, and requires no Rust, Node.js or Python toolchain to install.

The server package workflow selects Tokio 1.53.3 before its locked daemon build. release-manifest.json records the configured requirement as lxmf.required_daemon_tokio_version, alongside the LXMF source commit and daemon checksum. The workflow build log verifies dependency selection; package assembly does not infer a Tokio version from an arbitrary binary.

The Python 2.9.x edition is preserved on the rch-python branch for critical maintenance and reference behavior.

The implementation, migration, and validation notes that previously occupied this README are now referenced from the Rust migration status document.

Getting started

Install a packaged build

The simplest route is to use a package from GitHub Releases. On a supported Debian or Ubuntu AMD64 host, download the .deb and its .sha256 file, verify the checksum, then install it with sudo apt install ./rch-server_3.0.0.preview.36-1_amd64.deb. Configure /etc/rch before explicitly enabling services; installation does not start them. See the packaging instructions for configuration, upgrade preservation and startup. Server archives and desktop packages have their own release notes and platform requirements.

Build the Rust server from source

Requirements:

  • Rust 1.88 or newer for the server workspace and Tauri desktop shell;
  • a local Reticulum configuration;
  • LXMF-rs reticulumd for live LXMF transport;
  • Node.js and npm only when building the web or desktop interface.

Clone and build the server:

git clone https://github.com/FreeTAKTeam/Reticulum-Community-Hub.git
cd Reticulum-Community-Hub
cargo build --release -p r3akt-rch-server

Start the HTTP server for local development:

cargo run -p r3akt-rch-server -- \
  --bind 127.0.0.1:8080 \
  --db-path ./rch-runtime.db \
  --config-path ./config.ini \
  --reticulum-config-path "$HOME/.reticulum/config" \
  --api-key change-this-preview-key

This starts the RCH API and local state service. A live mesh deployment also requires the LXMF-rs ZeroMQ endpoints and a local Reticulum destination. See Rust migration status for the current runtime path and development commands.

Replace the example key with a unique credential. Protected routes, including /Status, /diagnostics/runtime, internal adapters and WebSocket streams, require authentication even on loopback. To enroll through the local first-run UI instead, omit --api-key and add --ui-dist-path ./ui/dist after building the shared UI. Documentation and local setup remain available before enrollment.

RCH requires the paired daemon durable broker (--zmq-durable-broker). Its persisted inbox and outbound intents replace legacy event polling and retry ownership. See durable broker cutover before upgrading an existing deployment.

For an already running daemon, use its command endpoint and a response endpoint owned by this RCH instance:

cargo run -p r3akt-rch-server -- \
  --bind 127.0.0.1:8080 --db-path ./rch-runtime.db \
  --config-path ./config.ini --api-key change-this-preview-key \
  --lxmf-zmq-command tcp://127.0.0.1:9100 \
  --lxmf-zmq-response tcp://127.0.0.1:9101 \
  --ui-dist-path ./ui/dist

RCH registers and derives its service destination. --reticulumd-source is optional and only asserts that registered RCH destination.

To let RCH manage the matching daemon, add --reticulumd-exe ../LXMF-rs/target/release/reticulumd, and provide --reticulumd-db-path ./reticulum.db and --reticulum-config-path "$HOME/.reticulum/config". Build that daemon with zmq-pipeline-rpc enabled. Verify /Status and /diagnostics/runtime; a daemon-backed launch must show the configured source and running daemon.

Remote browser connections require HTTPS/WSS. For a TLS proxy or separately hosted UI, set exact comma-separated RCH_ALLOWED_ORIGINS values such as https://rch.example.org. Local loopback HTTP/WS remains supported.

After startup, useful local endpoints include:

  • http://127.0.0.1:8080/Status
  • http://127.0.0.1:8080/Help
  • http://127.0.0.1:8080/openapi.json
  • http://127.0.0.1:8080/diagnostics/runtime

Examples

The maintained examples guide walks through server startup, authentication, health and runtime diagnostics, topics, direct/topic/broadcast chat, files, missions and checklists, WebSockets, Reticulum ZeroMQ attachment, and the standalone TAK sidecar. The live server also exposes a compact plaintext quick reference at GET /Examples.

For a first authenticated request:

curl -H 'X-API-Key: change-this-preview-key' \
  http://127.0.0.1:8080/Status

For operational deployment and failure diagnosis, continue with the operations and troubleshooting guide. For large user inventories, see identity directory pagination.

Main components

Component Purpose
r3akt-rch-server HTTP, WebSocket, persistence, UI hosting, and RCH runtime
r3akt-rch-core Missions, teams, checklists, topics, delivery state, and authorization
r3akt-transport-rns Reticulum and LXMF integration through LXMF-rs
r3akt-profile-rch RCH command, result, and event fields on LXMF
r3akt-protocol Shared MessagePack envelopes and acknowledgement types
r3akt-identity Identity, trust, and enrollment decisions
r3akt-tak-connector Independent TAK and Cursor-on-Target bridge service
ui/ Shared Vue operator interface
apps/rch-desktop/ Tauri desktop packaging

Development and verification

Hub display name

The Rust server owns the RCH service name in SQLite rch_settings.hub_name. At startup and POST /Command/ReloadConfig, it reconciles that saved name into both [hub] name and [hub] display_name in config.ini. Existing installations without a saved name migrate from [hub] name, then [hub] display_name, then RCH, regardless of INI line order. Conflicting package defaults cannot replace a saved name; keep the database and service identity file across upgrades. Changed legacy configuration is backed up before reconciliation.

To rename, save configuration with PUT /Config, changing either name field or changing both to the same value. One edited field wins over its unchanged mirror; competing edits are rejected. Omitted or unchanged fields retain the saved name. Names must be nonempty, at most 80 characters, and contain no control characters. Config rollback restores the backup’s name, then display_name, or retains the saved name when neither is present. Direct file edits after migration do not override the saved name; use PUT /Config for renames.

Setup, config saves, reload and rollback publish fresh LXMF service metadata using the existing identity keys and destination hash. The daemon’s own display_name belongs to its separate identity and does not override the RCH name. Setup status and app-info report the same desired name; app-info’s unnamed fallback is RCH. If publication fails after a save, the desired name stays saved and the route returns a publication error. First-run setup instead reports successful credential enrollment with identity_announce_update_pending and last_identity_announce_update_error, so enrollment is not repeated. /diagnostics/runtime exposes both fields; publication remains pending without an LXMF runtime. Retry with ReloadConfig or restart after restoring connectivity. Clients can display the old cached name until they receive the fresh announce.

Before submitting a pull request, run the Rust quality checks:

cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace

The repository also contains release-readiness scripts and live Reticulum validation tools. These are documented in Rust migration status.

Contributing

Issues, tests, documentation corrections, and pull requests are welcome. Keep changes focused, explain the user-visible effect, and add tests for modified runtime behavior.

For substantial protocol or architecture changes, open an issue first so the wire contract and compatibility impact can be discussed before implementation.

License

RCH is licensed under the Eclipse Public License 2.0.

The Rust implementation also provides the optional R3S/1 origin sensor telemetry contract, including native map projections and the TAK sensor adapter. Its provisional SID and remaining delivery/hardware release gates are documented there.

评论

暂无评论