Skip to content

Releases: genemichael/MeshGemini

Mesh Gemini v0.2.9 — hybrid phone milestone

Choose a tag to compare

@genemichael genemichael released this 08 Aug 13:35

Mesh Gemini v0.2.9 — hybrid phone milestone (pre-release)

T-Deck Plus hybrid communicator: MeshCore LoRa texting + Reticulum/LXMF
messaging and LXST voice over WiFi, in one launcher.

New in this release

  • Native-8k call playback — call audio now bypasses the mixer's
    resample path for the duration of a call (fixes RX garble); the mixer
    is restored automatically at every call end, including abnormal ones.
  • Persistent conversations in the RNS app — messages survive
    reboot; conversation rows appear even for peers that haven't
    announced since boot; Address Book contact names (nicknames) always
    take priority over broadcast names.
  • Status bar — WiFi / AutoInterface / TCP indicators
    (green = up, amber = enabled but not up, grey = off); clock
    decluttered to HH:MM.

Status

⚠ Pre-release: builds pass and bench flashing is done, but
on-device verification of the new call-audio path and persistence UI
is still in progress. Expect a follow-up release once testing completes.

Flashing (esp32s3, 460800 baud)

  • Fresh install: mesh-gemini-v0.2.9-merged.bin at offset 0x0
  • Firmware-only update (keeps your data): mesh-gemini-v0.2.9-firmware.bin at 0x10000
  • Data image: mesh-gemini-v0.2.9-littlefs.bin at 0x590000 —
    ⚠ erases on-device user data (address book, messages; identities
    stored in NVS survive)
  • mesh-gemini-v0.2.9-test-firmware.bin: bench/test build with serial
    test hooks (T: commands) enabled — for development use
  • mesh-gemini-v0.2.9-launcher.bin: image for Launcher-based installs

License: GPL-3.0 (see COPYING / NOTICE). Built from hybrid-phone @ acaccb5.

Gemini v0.2.8-4 — first public release

Choose a tag to compare

@genemichael genemichael released this 26 Jul 14:07

Merged single-file images for the LilyGo T-Deck (Plus). Flash at offset 0x0 — see the README's Flashing section.

  • gemini-release.bin — handout build: self-contained, apps embedded (self-extract on first boot), no debug harness, generates its own identity.
  • gemini-test.bin — developer build: adds the T: serial harness (state, call control, identity export/import, no-wipe file push). Exposes the RNS private key over USB by design.

Both images audited: no builder-identifying strings, no credentials, no identities. Built reproducibly from c0b7b30.

Initial Release

Choose a tag to compare

@genemichael genemichael released this 26 Jul 01:37
c4f5620

Gemini hybrid phone — portable flash bundle

Flash a LilyGo T-Deck Plus from any machine (Raspberry Pi, laptop)
with no source repo. Built 2026-07-24 from branch hybrid-phone (v0.2.8-4-gc0b7b30,
reproducible from that commit). Chip: ESP32-S3, 16MB flash.

What's here

File What it is Flash offset
gemini-release.bin Handout build. No serial debug harness. Apps embedded in firmware, self-extract on first boot. Each device generates its own identity. 0x0 (single file)
gemini-test.bin Dev/support build. Full T: serial harness (state, calls, identity export/import, file-push). Includes filesystem. 0x0 (single file)
flash.sh One-command wrapper. —

Both are merged single-file images — everything (bootloader,
partition table, firmware, and for test the filesystem) is inside one
.bin flashed at offset 0x0. No offset juggling.

One-time setup on the Pi / Linux

python3 -m pip install --user esptool        # or: sudo apt install esptool
sudo usermod -aG dialout "$USER"             # serial access; then log out/in

Find the port after plugging the device in (USB-C, powered on):

ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null      # Linux/Pi — usually ttyACM0
# (macOS: ls /dev/cu.usbmodem*)

Flash

chmod +x flash.sh          # first time only
./flash.sh release /dev/ttyACM0     # handout device
./flash.sh test    /dev/ttyACM0     # your own device (with debug harness)

release erases the chip first (clean, identity-free), then flashes;
first boot unpacks apps for a few minutes (don't power off), then
generates fresh RNS + MeshCore identities. Configure over the on-screen
UI (Wireless app for WiFi, Settings > Names).

test flashes directly (its image carries the filesystem).

Manual command (if you skip the script)

python3 -m esptool --chip esp32s3 --port /dev/ttyACM0 --baud 460800 \
    write_flash 0x0 gemini-release.bin

For a handout device, run ... erase_flash first. Newer esptool (v5+)
prefers write-flash/erase-flash (hyphens) but still accepts the
underscore forms with a warning.

Notes

  • release has no T: serial commands — no way to export/import an
    identity or push Lua over serial. That's deliberate (a handout device
    shouldn't leak its private key over USB). Updating it means reflashing.
  • test exposes the identity over serial (T:IDEXPORT). Fine for
    your own devices; do not hand one out expecting the key to be private.
  • If flashing fails to connect, hold BOOT, tap RST, release BOOT
    to force download mode, then retry.
  • These images do not include your identity or WiFi — each device
    starts fresh. To migrate a specific RNS identity onto a test device,
    use T:IDEXPORT on the source and T:IDIMPORT <hex> on the target
    over a serial monitor (115200 baud), then reboot.

What's new in the 2026-07-24 images

  • WiFi modem sleep disabled (reliable RNS traffic; BLE is force-locked
    OFF to keep this legal — toggle visible but disabled in Settings).

  • AutoInterface: link-local rebind fix (no more permanent errno=118
    wedge) + T:AUTO on|off (test build) to disable it entirely on
    congested networks. Default remains ON for fresh devices.

  • TCP interface: INFO-level logging (failures are now visible),
    forced reconnect on host/port resave.

  • RNS identity tools (test build): T:IDEXPORT / T:IDIMPORT /
    T:IDNEW. EXPORT AND SAVE THE KEY on every new device — an
    accidental erase_flash otherwise loses the persona permanently.

  • Settings > RNS now has an AutoInterface on/off toggle (all builds),
    so release devices on congested networks can go TCP-only from the
    UI. Reboot to apply.