Torlando affd5566ab fix: coordinate CLI and flasher map installs with a shared marker
Greptile round 7 remediation:

The CLI's advisory flock and the web flasher's Web Locks name live in
incompatible lock namespaces, so a CLI install and a browser install
on the same card could each hold "their" lock, both pass preflight on
identical slot state, and clobber each other's records (orphaning a
pack, or writing the same generation into two slots).

Both producers now share two symmetric layers:

1. An on-disk install marker (.pyxis-installing in pyxis-map/,
   token "PYXI 1 <owner> <epoch_ms>") claimed at install start via an
   atomic exclusive create, with ownership verified by read-back. A
   fresh foreign marker refuses the install before any mutation; a
   stale one (30-minute TTL; a future epoch counts as fresh under
   clock skew) is reclaimed. Release only deletes the releasee's own
   token.
2. Commit-time revalidation: activate_map_set / activateMapSet
   snapshot the raw slot and style bytes at derivation, re-read them
   immediately before the record writes, and abort if the activation
   state moved or a fresh foreign marker is present. The published
   pack is kept (device-harmless: the firmware only reads packs named
   by an active selection) and the existing retry/resume path
   converges it.

Regression tests on both producers: marker refusal before any
publication, stale-marker reclamation and release, and
commit-time-race abort with retry convergence. The in-memory flasher
FS now models getFileHandle({exclusive:true}) -> FileExistsError.

CLI: 85 passed. Flasher: 24 passed.
2026-08-29 17:54:27 +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
Languages
C++ 47%
C 40.3%
Python 10.7%
JavaScript 1%
mupad 0.7%
Other 0.2%