2 Commits
5 changed files with 29 additions and 13 deletions

No files matched your search

+13
View File
@@ -1,5 +1,18 @@
# Changelog # Changelog
## [0.2.3] - 2026-04-06
### Changed
- README: clarify that the bridge relays raw LoRa packets and works with any
protocol (Meshtastic, MeshCore, etc.) simultaneously.
## [0.2.2] - 2026-04-06
### Fixed
- TUI now fits in 80-column terminals (was 86).
## [0.2.1] - 2026-04-06 ## [0.2.1] - 2026-04-06
### Fixed ### Fixed
Generated
+1 -1
View File
@@ -906,7 +906,7 @@ dependencies = [
[[package]] [[package]]
name = "donglora-bridge" name = "donglora-bridge"
version = "0.2.1" version = "0.2.2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"blake3", "blake3",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "donglora-bridge" name = "donglora-bridge"
version = "0.2.1" version = "0.2.3"
edition = "2024" edition = "2024"
authors = ["Stephen Waits <steve@waits.net>"] authors = ["Stephen Waits <steve@waits.net>"]
license = "MIT" license = "MIT"
+11 -8
View File
@@ -4,16 +4,19 @@
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
![Rust](https://img.shields.io/badge/rust-1.94.1%2B-orange) ![Rust](https://img.shields.io/badge/rust-1.94.1%2B-orange)
**donglora-bridge** connects LoRa radios to the internet so packets heard by one **donglora-bridge** relays raw LoRa packets over the internet. Every packet your
radio can be retransmitted by another radio anywhere in the world. radio hears is forwarded to every other bridge running the same passphrase, and
their radios retransmit it locally. Because it operates on raw packets, it works
with any protocol built on LoRa --
[Meshtastic](https://meshtastic.org/),
[MeshCore](https://github.com/rocketgithub/meshcore-firmware),
or anything else -- simultaneously and without configuration. If your radio can
hear it, the bridge will relay it.
[LoRa](https://en.wikipedia.org/wiki/LoRa) is a long-range, low-power wireless [LoRa](https://en.wikipedia.org/wiki/LoRa) is a long-range, low-power wireless
protocol used by off-grid mesh networks like modulation used by off-grid mesh networks. A single radio might cover a few
[MeshCore](https://github.com/rocketgithub/meshcore-firmware). A single LoRa kilometers. This bridge removes that limit, extending a local LoRa network
radio might cover a few kilometers. This bridge removes that limit: any packet across a larger geographic area.
your radio hears gets relayed over the internet to every other bridge running the
same passphrase, and their radios retransmit it locally. The result is a single
mesh network across a larger geographic area.
There is no central server. Bridges discover each other automatically using the There is no central server. Bridges discover each other automatically using the
[Mainline DHT](https://en.wikipedia.org/wiki/Mainline_DHT) and communicate [Mainline DHT](https://en.wikipedia.org/wiki/Mainline_DHT) and communicate
+3 -3
View File
@@ -245,8 +245,8 @@ fn draw_ui(
series: &TimeSeries, series: &TimeSeries,
) { ) {
// Minimum terminal size for the 3-column layout. // Minimum terminal size for the 3-column layout.
if area.width < 86 || area.height < 12 { if area.width < 80 || area.height < 12 {
let msg = format!("Terminal too small ({}x{}), need 86x12+", area.width, area.height); let msg = format!("Terminal too small ({}x{}), need 80x12+", area.width, area.height);
frame.render_widget( frame.render_widget(
Paragraph::new(msg).alignment(Alignment::Center).style(Style::default().fg(C_RATE_DROP)), Paragraph::new(msg).alignment(Alignment::Center).style(Style::default().fg(C_RATE_DROP)),
area, area,
@@ -266,7 +266,7 @@ fn draw_ui(
// Packet log columns: Age=5 Hash=8 RF=4 Net=4 Size=6 RSSI=6 SNR=5 Act=5 = 43 + 2 border + 1 pad = 46 // Packet log columns: Age=5 Hash=8 RF=4 Net=4 Size=6 RSSI=6 SNR=5 Act=5 = 43 + 2 border + 1 pad = 46
let cols = Layout::default() let cols = Layout::default()
.direction(Direction::Horizontal) .direction(Direction::Horizontal)
.constraints([Constraint::Length(30), Constraint::Length(46), Constraint::Min(10)]) .constraints([Constraint::Length(30), Constraint::Length(46), Constraint::Min(4)])
.split(rows[1]); .split(rows[1]);
// Left column: Network, Radio, Stats stacked. // Left column: Network, Radio, Stats stacked.