TorlandoandClaude a2c156bd81 fix(nomadnet): keep image identity stable across partial refresh
Greptile round-4 residual: "retained image identity is still not
preserved when removing an earlier partial-owned image." Decode slots
(NomadNetScreen) and loader entries (NomadNetImageLoader) are both keyed
by the compact image index, and the loader is configured once at full
page load and never re-run on a partial refresh. The previous
discard-and-compact design shifted every surviving record after a
removed region image, so a decoded slot kept showing the old image's
pixels (or nothing) at the wrong index, and loader state pointed at the
wrong record.

- assign_replacing_partial now keeps the record list at a stable size:
  every base record keeps its index (verbatim); a region-owned record is
  replaced IN PLACE with the fragment's record of the same position (real
  alt text, same index its decode slot is tagged with); fragment images
  beyond the region's old count are appended; leftover region slots are
  blanked (empty URL). Bounded, never accumulates, never shifts a
  surviving index.
- Decode slots now tag the record URL at store time (FNV-1a); the draw
  path rejects a slot whose record URL no longer matches, so an in-place
  URL change cannot render stale pixels.
- The /media RESPONSE branch discards a response whose record was
  replaced in place while in flight (per-image terminal failure; the
  page and remaining images are unaffected).

Regression: two-refresh shrink scenario pins in-place replacement,
blanked leftover record (empty URL), and retained-record index/URL
stability. Falsified against the pre-fix discard-compact code (fails).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-22 16:09:28 +00:00
2026-02-07 11:49:21 -05:00

Pyxis logo

Pyxis

An LXMF and LXST client firmware for T-Deck, built on a highly modified fork of microReticulum

Very much WIP, don't expect stability :)

Features

Reticulum transport over:

  • RNode-compatible LoRa
  • AutoInterface (local wifi)
  • TCP Client
  • BLE Interface (barely working if at all)

Other features:

  • GPS-synced time
  • One really annoying beep when you get a new message (user toggle)
  • View the announce stream
  • Choose a propagation node (and sync with it) (fixed in v0.2.1)
  • Set auto announce timer
  • Light up keyboard (user toggle)
  • Will crash in about 5 minutes of normal use (sorry) I had 5d uptime on v0.2.0 with BLE disabled
  • Make LXST voice calls (codec2 only, quality sounds horrible coming out the other end in Columba, needs work)

Flashing

The easiest way to get Pyxis running is the web flasher, which downloads release firmware from this repository's releases and verifies each image's SHA-256 digest against the release metadata.

For esptool (or any other tool that writes raw flash), each release also publishes a merged binary (pyxis-<tag>-merged.bin) that contains the bootloader, partition table, OTA selector, and application at their fixed offsets. Provision a T-Deck Plus (8 MB flash) with:

esptool.py --chip esp32s3 erase_flash
esptool.py --chip esp32s3 write_flash 0x0 pyxis-<tag>-merged.bin

Merged binaries are for first install / provisioning. Flashing one overwrites every flash region, including NVS (settings, identity) and the LittleFS partition (messages, paths, maps). To update an existing device without losing data, flash firmware.bin to 0x10000 only, or use the Columba-compatible pyxis-<tag>.pyxis.zip update package.

Why "Pyxis"

Pyxis, latin for "compass," is a constellation in the southern sky depicting a mariner's compass. Small but essential, the compass ensures every message finds its destination - even when the path is uncertain.

S
Description
No description provided
Readme GPL-3.0
311 MiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 47%
C 40.3%
Python 10.7%
JavaScript 1%
mupad 0.7%
Other 0.2%