Skip to content

Releases

NodeWave 0.12.3

NodeWave 0.12.3 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 05 Nov 16:34

The code is now licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).

Changed

  • LICENSE is the official AGPL-3.0 text; every Kotlin source, our C file and the Gradle scripts carry SPDX-License-Identifier: AGPL-3.0-or-later; the app (Settings), the website, the README and the project rules say so.
  • The README states that the name NodeWave and the NW logo are trademarks reserved by the author: a fork must change the name and replace the icon and logo.
  • Earlier releases remain under the licence they were published with (GPL-3.0).

No functional changes. Pre-release, debug-signed APK, Android 10 or later.

NodeWave v0.12.2

NodeWave v0.12.2 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:27

Transfers that survive a weak radio.

Fixed

  • A photo or clip sent from a phone with an unreliable Bluetooth client (the Honor View 10) failed with "No answer" as soon as a few chunks timed out: a chunk whose send failed was skipped until the next pass, eight seconds later, and five passes without news ended the transfer. A chunk that fails to send is now tried again at once (three times, with a growing pause), the transfer gives up after six passes without any progress instead of four, and the failure says how far it got ("No answer from Mi Note 10 (120/283 chunks got through)").

Added

  • Tap a failed photo or voice message to send it again. It is sent with a new transfer id and chunks cut for the link as it is now (so a failed Bluetooth photo may now go over a Wi-Fi Direct link). If the link cannot carry it any more the message says so.
  • Log lines for acknowledgements and every sixteenth chunk received, to see where a transfer stops.
  • Tests: transient radio timeouts, a failed photo retried successfully, retry only for failed outgoing transfers.

Checked on the phones

  • Honor to Mi with a real photo from the Honor's library: over Wi-Fi Direct (154 chunks in about 3 s) and, with the Mi refusing the link, over Bluetooth (283 chunks in about 27 s), both delivered. The failure seen in use was not reproduced; if it happens again, the failed message now says how far it got.

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.12.1

NodeWave v0.12.1 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:26

Photos from the camera, the photo library and files, and the fix that made every real photo fail.

Fixed

  • Every photo picked from a gallery or file was silently refused ("Could not read that photo", shown for four seconds): the size check took the empty result of a bounds-only decode for an unreadable file. Only the synthetic test photo, which skips that step, got through. Fixed; a 16-megapixel photo is now shrunk to 130-250 KB for a fast link and sent.
  • A photo shown in the chat right after sending stayed a grey placeholder: it was looked up before its bytes were written. It now looks again.

Changed

  • The photo button opens a small menu: Camera, Photo library (the system photo picker) and Files. The camera shot is handed over through a private file provider and deleted once read; the camera permission is asked when first needed.
  • While a photo is prepared a line above the message field says what is going on (preparing, opening a Wi-Fi Direct link, shrinking) instead of a notice that disappears after four seconds; each step is also logged.

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.12.0

NodeWave v0.12.0 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:26

A fast Wi-Fi Direct link for big transfers, and photos.

Added

  • Wi-Fi Direct fast link. Bluetooth still finds people and sets everything up; when a big transfer needs it, one phone creates a Wi-Fi Direct group with a random name and passphrase, sends the offer sealed over Bluetooth, the other joins (Android 10 and later need no confirmation tap) and the two connect over TCP. Packets keep their end-to-end sealing; the link class becomes fast (1400-byte packets, bigger limits) and every send to that peer uses it. It closes by itself after 40 seconds without traffic. Settings → Wi-Fi Direct chooses who may start one with you (nobody / verified contacts / everyone; verified by default) and asks for the nearby-Wi-Fi permission (Android 13+) or location (Android 10-12). Diagnostics → Bench has a WIFI test button per node.
  • Photos in one-to-one chats (photo button next to the microphone): shrunk and recompressed to a JPEG without any EXIF (no location, no camera data), about 35-55 KB over Bluetooth, about 120-600 KB and up to 1600 px over a fast link (the app tries to open one first), refused on slow links and by relays whose next link is slow. Shown in the chat, tap to enlarge; stored encrypted at rest and deleted with the history. A PHOTO test button in Diagnostics → Bench sends a synthetic picture.
  • Tests: the fast link negotiation (offer sealed, declined unless the sender is allowed, failed joins leave the link medium), photo limits per link class, photos over fast links and refused by slow relays.

Measured (Mi Note 10 and Samsung A52)

  • Opening the link took 6.5 to 7 seconds; a 122 KB photo then crossed in 0.3 s. Over Bluetooth alone a 35 KB photo took 8.6 s (about 4 KB/s).

Changed

  • More than one radio can sit behind the transport (CompositeTransport): the main radio finds peers, the fast link carries bytes. MeshTransport.fastLink and FastLinkTransport are the interface for it.
  • A transfer may have up to 1024 chunks (was 640).

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.11.0

NodeWave v0.11.0 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:26

Codec2 for slow links.

Added

  • Codec2 (modes 700C, 1300, 2400, 3200 bit/s) for voice messages, next to Opus. The sender picks the codec from the slowest link on the path (see 0.10.0) or always the thinnest one if Always low bandwidth is on; a 15 s clip is about 1.3 KB with 700C and 4.5 KB with 2400 against about 15 KB with Opus 8k. A phone needs no setting: it plays whatever codec the clip names.
  • The Codec2 C sources (version 1.2.0, LGPL-2.1, compatible with the GPL-3.0) are in app/src/main/cpp/codec2 with their licence and a note on how they were taken, built into a small separate library libnodewave_codec2.so through the NDK and CMake (app/src/main/cpp). Checked on the Mi Note 10, Honor View 10 and Samsung A52: the four modes encode and decode with the same results as the upstream library on a computer, and a clip sent over Bluetooth with CODEC2 2400 from the Mi was delivered and played on the Samsung.

Changed

  • Building the app now needs the NDK (27.2) and CMake 3.22.1 from the Android SDK; Android Studio offers to install them.

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.10.0

NodeWave v0.10.0 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:25

Voice messages and the bulk-transfer layer underneath them. Checked on the Mi Note 10, Honor View 10 and Samsung A52: Opus encodes and decodes on all three, and a 3.9 s clip (3.3 KB) went from the Mi to the Samsung over Bluetooth in about 4 seconds and played. Not yet tried: a clip from or to the Honor, across a relay, and Codec2.

Added

  • Link classes (LinkClass: slow, medium, fast). A transport says what kind of link it has to each peer; HELLO packets now carry that class for every neighbour, so a node knows the slowest link of a two-hop route. The sender picks codec and size for the slowest link it knows.
  • Bulk transfers (DataFrame, packet types DATA, DATA_ACK, DATA_REFUSE): a blob is cut into chunks sealed one by one with the pairwise session, the receiver answers with a bitmap every eight chunks and after a quiet moment, and the sender sends again what is missing. A byte in front of each chunk (bound into the sealed data) tells relays what class of link the transfer needs: a relay whose next link is slower refuses it and tells the author, which stops and says why. A receiver limits transfers in number, size and age.
  • Voice messages in one-to-one chats: record (hold the microphone, or tap, tap, send; Settings), at most 15 seconds, play in the chat, with progress and delivery state. Audio is kept encrypted at rest like message text, in its own files, and deleted with the history. Opus through the phone's MediaCodec for Bluetooth links (decoded at 48 kHz by Android and brought back to 8 kHz); the Codec2 modes for slow links are defined but need the native library, still to come. Settings: record mode, "always low bandwidth", and a codec test.
  • Tests: chunk framing, reassembly limits, resend after a lost chunk, relays across mixed links (a thin codec passes a slow link, Opus is refused), class learned from HELLO.

Fixed

  • The microphone button keeps its place in the chat row while recording, so the press that ends a hold-to-record clip is not lost.

Changed

  • HELLO entries have a link-class byte (the wire format changed; update all phones together).
  • Database version 5 (voice columns on messages).

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.9.2

NodeWave v0.9.2 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:25

The tag v0.9.1 was created on a commit that held only the move of the website (its app version still said 0.9.0); this release contains everything meant for it.

Fixed

  • The icon shown inside the app (top bar and splash screen) was the old one; it is now the current icon, docs/images/icon.png.

Changed

  • The website moved from website/ to docs/, the only folder besides the repository root that GitHub Pages can serve; it is published from the branch (main /docs) and the Pages workflow is gone. See docs/SITE.md.

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.9.1

NodeWave v0.9.1 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:25

Incomplete tag. This tag was created on a commit that held only the move of the website to docs/: its app still says 0.9.0 and has the old in-app icon. Use v0.9.2, which has everything meant for it (see its notes).

Debug-signed build for testing.

NodeWave v0.9.0

NodeWave v0.9.0 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:25

The app gets its icon and a splash screen, a clearer tab bar, a readable status bar, a more usable map, and a website.

Added

  • The official icon inside the app: in the top bar next to the name, and on a splash screen at start (icon, name, version and nodewave.org; it fades after under two seconds or on a tap).
  • Website in docs/ (English), served by GitHub Pages from main /docs on nodewave.org (CNAME), with screenshots of the app in use. The same screenshots are in the README and in fastlane/metadata/android/en-US/images/phoneScreenshots/ for F-Droid.
  • A node set to a fixed position now shows that position as its own marker ("FIXED POSITION") and no longer follows the GPS.

Changed

  • The tab bar marks the current section with a pill around the icon and a green bold label (no bar, no glow); the change is animated.
  • Status and navigation bar icons are always light on the dark background (they were dark on dark with the phone in light theme).
  • Map: labels of the vector map are drawn at half the size they had (they were poster-sized), and the buttons and chips over the map have a dark plate so they stay readable on a white map.

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.

NodeWave v0.8.1

NodeWave v0.8.1 Pre-release
Pre-release

Choose a tag to compare

@sputlab sputlab released this 04 Nov 23:24

Fixes found on the test phones: the map download crash, a radio that would not start, the diagnostics page, the unread badge.

Fixed

  • The app restarted at the end of a map download on Android 10 and 11 (Mi Note 10, Honor View 10): the signature check used InputStream.readNBytes, which exists only from Android 13, and the resulting NoSuchMethodError killed the process right after the last byte arrived. It now reads the header with a plain read. A download whose .part is already complete (the finish was cut short) is recognised when the server answers 416 and is kept instead of being fetched again; a .part that does not fit the file is still discarded.
  • The radio did not start on a phone whose BLE advertiser slots were all taken (the Honor answered ADVERTISE_FAILED_TOO_MANY_ADVERTISERS, error 9): the whole start was abandoned. It now retries three times and then runs without advertising (it still scans and can connect to the nodes it hears), and the watchdog keeps trying to advertise every 15 seconds.
  • The unread badge on the Chats tab sat off the icon and its text was cut; it is now anchored to the icon's corner with the text centred.
  • Diagnostics page: the whole page scrolls, texts and buttons stay on one line on every phone width, and the console is much taller.

Changed

  • 203 unit tests (new: a complete .part is kept on a 416, an invalid one is discarded).

Debug-signed build for testing: it updates over the other NodeWave pre-releases. Not independently audited, see docs/SECURITY.md.