Skip to content

Releases

v2.1.1

Choose a tag to compare

@github-actions github-actions released this 03 Nov 00:06

Commits since v2.1.0

  • v2.1.1: Tor packaging fix for Mac and Linux (b27b987)

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 04:11

Connect through Tor. LCS Global can now go through the Tor network, straight
to the gateway's private onion address, so neither LCS nor anyone watching your
connection sees this computer's internet address.

Commits since v2.0.9

  • v2.1.0: Windows build fix (8004870)
  • v2.1.0: build fix (df17e38)
  • v2.1.0: Tor, update notice, helpdesk, credits (0b434fc)

v2.0.9

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:18

LCS Global comes to LCS MeshChat. The same subscription connection to the
Liberty network as in Liberty Chat: over Wi-Fi, Ethernet or mobile data, from
anywhere, with a free 7-day trial and no data limits.

Commits since v2.0.8

  • v2.0.9: LCS Global (78fe6a9)
  • Now built to auto discover path on failed send due to missing path

v2.0.2

Choose a tag to compare

@github-actions github-actions released this 20 Oct 00:37

The saved path table is now loaded, so startup barely needs to ask the network
anything.
v2.0.0 recovered from the lost-paths problem by requesting a route for
each recent peer — about twenty small packets spread over seventy seconds, on every
launch. That was more airtime than the problem deserved.

Reticulum writes the path table on every clean shutdown; it just refuses to read it
back unless transport mode is on. So the fix is to read it ourselves, which is what
Liberty Chat does in event_bridge.restore_path_table, and this is a port of that
approach. It runs right after the Reticulum instance is built, mirrors upstream's own
loader in Transport.start field for field — re-resolving each entry's interface by
hash and bumping the cached announce's hop count — and declines to overwrite anything
already live, since a route learned since this process started is fresher than one on
disk. Blackholed identities are dropped, as upstream does, because restoring a route
to one would quietly undo the blackhole.

Startup path requests are now a backstop rather than the mechanism. They still
run, and still skip any peer already reachable — which after a successful restore is
most or all of them. What remains is the handful whose cached announce has expired and
so could not be reconstructed. With a healthy saved table, startup sends nothing.

Why not do this in the first place: the earlier reasoning was that a restored route
can be present but dead, and a dead-but-present route is worse than none, because
has_path() returns true and the first send goes down a route that no longer exists.
That is true, but it was the wrong weighting — v1.9.9 already requests a path and
retries when a send fails, so the cost of a stale entry is one failed message rather
than a stranded conversation. One retry beats twenty path requests per launch.

tools/tests/test_path_table_restore.py adds 23 checks, run against a stand-in
Reticulum rather than only inspected. The important one asserts the seven-element
entry's field order against RNS's IDX_PT_* constants: getting that wrong would not
fail loudly, it would install corrupt routes.

Commits since v1.9.9

  • v2.0.2: load the saved path table instead of asking the network (e93d816)
  • v2.0.1: recover a stale interface while others still work (cdc4aae)
  • AutoInterface self-recovery: reload on a new or stale interface (9407d99)
  • v2.0.0: restore paths across restarts, save them as they are learned (1bf8e50)

v1.9.9

Choose a tag to compare

@github-actions github-actions released this 08 Oct 04:11

Path request on send failure. Reticulum only learns a route when something asks
for one or the peer announces, so a message that failed while its path was stale sat
failed until that peer next announced. Now, when a send fails, LCS MeshChat asks the
network where that destination is and resends if a path comes back. The request goes
out even when a path is already known, because a stale entry is exactly the case
this is for and the response refreshes it.

It is throttled, because a resend creates fresh messages that can fail and call
straight back in: at most one request per peer per minute, three per peer, and the
budget resets after 30 minutes of quiet. A successful delivery or an incoming
announce from that peer clears the count immediately. Messages are never stranded by
the cap — the existing resend-on-announce still applies. Settings → Messages has a
toggle, and the throttling and ordering have their own test suite
(tools/tests/test_path_request_throttle.py, 36 checks).

Propagation stays the fallback it is meant to be. The path request is tried
first, because direct delivery beats leaving a message on a third party's node. If a
route comes back the message is retried on it — the same message, re-sent rather than
copied, so nothing is duplicated and try_propagation_on_fail survives: should the
retry fail too, propagation still happens. If no route comes back, or the throttle
has already spent its attempts, the message goes to propagation immediately. With
path requests turned off, behaviour is exactly as it was before.

One unreachable peer fails every message queued for it, one callback each. Those are
collected per destination and resolved together by a single path request, so the
network is asked once and no message is either sent twice or quietly dropped.

Reaching the propagation node is LXMF's job, and it already does it. If a
propagated message fails because the propagation node itself is unreachable, LXMF
requests a path to that node and retries — five attempts, seven seconds apart
(LXMRouter.process_outbound). So a message that has already gone to propagation is
left alone here: asking for a path to the recipient at that point would be aimed at
the wrong destination, and retrying would only repeat the propagation attempt.

Path Request button in each conversation, beside the peer's identity at the top.
Asks the network for a route to that peer on demand and reports what came back —
hop count and interface, or that nothing answered. Useful before sending something
large, or when the header shows a hop count but messages are failing anyway.

GET /api/v1/destination/<hash>/path gained force=true, which issues the request
even when a path is already known, and now reports path_was_known and
path_was_requested so a caller can tell what actually happened.

Commits since v1.9.8

  • v1.9.9: path request on send failure, Path Request button per chat (d5664ef)

v1.9.8

Choose a tag to compare

@github-actions github-actions released this 06 Oct 10:37

RNode Radio Board Picker The RNode interface form now has a Radio Board picker that holds transmit power
at or below that board's ceiling: SX127x 17, SX1262 22, Heltec v4 28, SX1280
13, SX1280 with PA 20.

New message sound. A short chime plays when a message arrives, generated in
the browser so there is no audio file to ship or to be blocked from autoplaying.
It is distinct from the call ringtone and fires once. Settings → Notifications has
an on/off toggle and a test button.

Reset Identity, at the end of Settings. Generates a new Reticulum identity,
and with it a new LXMF address, after two confirmations. Nothing is deleted: the
previous key is saved beside the new one as identity.replaced-<timestamp>, and
because per-identity data lives under identities/<identity_hash>/, the old
database stays where it is. Takes effect on restart.

Command Center PRO Client added to Add LCS Interfaces, — a TCP client to liberty.local:4246 when connecting in Access Point mode, off by default.

Reticulum updated to 1.5.5.

Commits since v1.9.7

  • v1.9.8: board-aware TX power, reworked presets, message sound, identity reset (880b016)
  • workflows: link the published package to this repo, fix stale labels (c21914a)

1.9.7

Choose a tag to compare

@github-actions github-actions released this 05 Oct 16:42
  • Moved to its own repository. LCS MeshChat now lives at
    daylight-hub/lcs-meshchat rather than as a fork. The Check for Updates
    button on the About page points there, and releases are published there.
  • Docker image renamed to ghcr.io/daylight-hub/lcs-meshchat. Update the
    image: line in your compose file and pull again; nothing else changes. Your
    config volume, Reticulum identity and message history are untouched.
  • lcs-meshchat.local added to the console's address sweep, alongside the
    names it already tried.

Upgrading from v1.9.6 needs no migration. The storage directory
(~/.reticulum-meshchat on desktop, /config in the container) is deliberately
unchanged, so identities and message history carry over as-is.

Commits since v1.9.6

  • v1.9.7: move to the lcs-meshchat repository (05eeb16)
  • chore: refresh repository metadata (963b033)
  • Update VOICE.md (3c99903)
  • Update README.md (742f791)
  • Delete docs/code-signing.md (569ad97)
  • Update README.md (236ec36)

v1.9.6

Choose a tag to compare

@github-actions github-actions released this 05 Oct 16:42
  • The frequency preset dropdown now appears. It was never reaching the page: the
    script looked for .panel / .tabbody / .tab-content, and the console has none
    of those. It now anchors on the console's real markup and sits directly above the
    Frequency field on the RNode radio namespace, under Transport Config. The
    modem-parameter warning was failing the same way and is fixed with it.
  • Auto-discovery sweeps the local network. Discovery now runs in three tiers —
    this page's own address, then this computer, then a sweep of .local names on the
    proxy port 8443 and the usual published container ports. Hosts that have answered
    before are remembered and tried first, and ?hosts=depot.local adds a name of your
    own. This is for Docker deployments reached by mDNS name.
  • Docker connection failures now say which side is at fault. If the bridge answers
    over HTTPS on the same address but the WebSocket will not open, the console says so
    and points at the self-signed certificate, with a link to accept it. Every failure
    banner now carries a box to type an address into directly, so a failed discovery
    never leaves you stuck. window.__lcsBridgeDiscovery records every address tried
    and why each failed.
  • The console is built from source, and tested. The two LCS scripts now live in
    tools/console/ and are injected by tools/console/build_console.py, which also
    verifies that every selector they depend on still exists in the console bundle.
    sh tools/console/run_tests.sh drives the built console in a headless browser: 44
    checks covering the preset dropdown, the warnings and end-to-end discovery against
    a real WebSocket server. The preset dropdown shipped broken twice because nothing
    ever loaded the page.
  • Documentation reorganised. Docker install, the reverse proxy for OpenWrt 24.10
    and Debian, reaching the console through it and troubleshooting are now in
    docs/DOCKER.md. Voice — full duplex, push-to-talk half duplex,
    switching codec mid-call, and what each link speed can carry — is in
    docs/VOICE.md. The README is a feature list and an index again.

Commits

  • v1.9.6: fix preset dropdown, sweep .local for the bridge, split the docs (e475fe6)
  • v1.9.5: README restructure, inline proxy guide, changelog split (e418949)
  • v1.9.4: proxy host-port fix, docker docs, corrected signing guidance (5e2b83a)
  • v1.9.3: reverse proxy support, presets restored, label updates, dependency bump (c9c1ce5)
  • release notes: write UTF-8 directly, fixes Windows cp1252 crash (849800f)
  • v1.9.2: blackhole identity blocking, release notes, announce-independent resolution (6d1e661)
  • v1.9.1: blackhole management (088c78f)
  • v1.9.0: RNS console bridge, LCS MeshChat naming, remote-management setup guidance (72aaee6)
  • v1.8.9: RNS console bridge, serve from MeshChat's own port (4bdec69)
  • console: inline endpoint discovery, drop server-side injection (4627583)
  • v1.8.8: complete in-app Reticulum guide with embedded figures, remove bundled PDF (197f680)
  • Update transport node console and bundled network guide (ab8ec26)
  • v1.8.7: in-app Reticulum guide dialog, new transport console, unmute mic on return to full duplex (065ae06)
  • Remove patch staging folders from repo, ignore them going forward (206b5ae)
  • Update README.md (1d902ae)
  • Update LCS Network guide to v4 (6cb697d)
  • v1.8.6 (e51e82e)
  • v1.8.5: replace stale speaker sinks and fix echo suppressor reference ordering (b4f4cba)
  • v1.8.4: implement LXST buffer contract on browser speaker sink (7ab6bb6)
  • v1.8.3: don't let prepare_dialling_pipelines errors abort the RINGING transition in Docker (2463efc)
  • v1.8.1: fix Docker incoming call - guard Notification API, ring before notifying (da01073)
  • Add LCS Network guide, Reticulum logo and interface mode reference images (f2e89ea)
  • v1.8.0: mid-call codec switching, duplex toggle + PTT, in-app interface help dialogs (8c2c98a)
  • v1.7.0: half duplex PTT, remove in-call codec selector, lxst 0.5.1 (dc9ec74)
  • v1.6.1: pin exact v1.0.0 call stack (rns 1.3.7 / lxmf 1.0.1 / lxst 0.4.8) (fda1be2)
  • v1.6.0: LXST 0.4.8 (pre-duplex signalling), rns 1.4.2, lxmf 1.1.1; remove codec-switch workarounds (32dee4d)
  • v1.5.7: fix mid-call codec switch (skip no-op rebuild, preserve echo reference, update frame size) (407e933)
  • v1.5.6: keep mic mute node referenced so capture doesn't stop after one frame (30bbeaf)
  • v1.5.5: re-apply audio bridge race-condition fix (null micStream crash) (6a286d1)
  • v1.5.4c: pin to v1.5.0 floor versions to isolate version cause (69ebbb0)
  • v1.5.4: restore v1.5.0 audio path, keep library pin (4db498b)
  • v1.5.4: pin rns/lxmf/lxst back to v1.5.0 versions (38783dd)
  • v1.5.3: fix audio bridge start race (null micStream) + handler hardening (ec77954)
  • v1.5.2: harden websocket handler so incoming-call UI works (c964d4d)
  • v1.5.1: bump rns/lxmf/lxst to latest; Docker speaker samplerate resample (67efc39)
  • Add bundled RNode Configuration Tool and KJV Bible PDF (1ba969d)
  • v1.5.0: RNode config tool + Bible in Tools, LoRa modem presets, LCS Gateway server (e7d6240)
  • Fix call echo (route playback through browser AEC) + remove dead prime listeners (f798465)
  • Fix ReferenceError (data->json) that crashed the websocket message handler (bea19e9)
  • v1.4.0: backend-driven browser audio bridge (use_browser_audio flag) (141f6a2)
  • v1.4.0: fix Docker audio - override reconfigure_transmit_pipeline (LineSource crash) + robust docker detection (57fbb73)
  • v1.4.0: per-codec frame sizing, send frame_config up front, loud mic diagnostics (b2abf89)
  • v1.4.0: full Opus+Codec2 support (dynamic frame sizing) + desktop mic fix (d16b42f)
  • Add mic diagnostics for per-codec Docker audio (70e318f)
  • Correct version to 1.3.0 (87061e1)
  • v2.3.0: 6h announce+sync, resend w/attachments, auto propagation node + settings toggle, interface enable-update (2be3f67)
  • Send 20ms (960-sample) mic frames for Opus+Codec2 compatibility (95f4285)
  • Global browser audio bridge + PassthroughCodec fixes outbound audio + home-page answer (d2f58f3)
  • Fix Docker call audio: sink stop() + int16<->float frame conversion; announce confirm on home page (f89a7b1)
  • Fix Docker answer: replace __open_pipelines to use WebSocket mic (LineSource crashed) (57c261e)
  • Fix Docker answer/call: skip device checks, fix bridge wrapper args, add logging (b97faf7)
  • Install libopus in Docker image (fixes call audio: Opus library not found) (b8e0952)
  • Telephone fixes: null guard, audio-devices 500, announce feedback, hide Add-LCS in Docker, ringtone priming, hourly announce (dca9e50)
  • v1.2.0: splash text, updates link, version bump, Docker browser-audio bridge (09d4dd7)
  • Update README.md (9edbe14)
  • Fixes v2: LCS icons in electron/build, mac retry, ringtone, restart, scroll text, updates link, Inc. (9ede9ef)
  • Fixes: mac DMG retry, global ringtone, desktop restart, LCS installer icons, scroll text, updates link, Inc. (6e70c5f)
  • Polished Add-LCS-Interfaces dialog, interface renames, remove attribution link, README (e774661)
  • v1.1.0: RNS 1.3.8, lxst 0.5.0, IP RNode iface, LCS naming, transport console, ringtone, mac build fix, single release (b8f6d0d)
  • Fix corrupted App.vue + correct lcs build workflow (a118204)