A receiver/display for a LoRa (SX1262) multi-node GPS tracking mesh on the M5CardputerZero. Nodes send their position over LoRa; this app shows a live hub view (per-node ID / solution quality / lat-lon / satellites / signal) and a node-detail view (GPS fix, speed, altitude, TX). v0.2.0 adds a full-screen offline map for each mode: the SIDE key cycles hub → hub-map → node → node-map. 320×170, dark theme.
The offline map draws SD-stored raw RGB565 slippy tiles (decode-free) with
GPS/LoRa positions as markers, a scale bar, and pan/zoom (arrows pan, +/-
zoom, 0 recenters): the hub-map auto-fits all received nodes; the
node-map follows your own position at the most detail available. A small
demo tile set of the Kanto–Chubu region ships so the map self-demos out of the
box; point CZ_TILES_DIR at your own tiles for other areas.
Radio + GNSS use the M5Stack Cap LoRa-1262 (SX1262 + AT6668/ATGM336H GNSS) — the same cap as the Cardputer ADV — so ADV and CardputerZero nodes/hubs interoperate (same LoRa PHY + packet + crypto).
This is the AppStore submission repo: the standalone CardputerZero app only. The full system (ESP32 sender/hub firmware, Mac tracker, GIS tools, PPK) lives in the development monorepo
u44e/cardputer-location-tracker.
The app reads NDJSON on stdin (appendix E.2 format): on the device from a LoRa hub over USB-CDC (or the on-device native LoRa receiver). When stdin is a tty (no pipe) it self-demos from the bundled sample so it shows data out of the box.
A companion macOS app (native MapKit map view) reads the same LoRa-hub NDJSON stream over USB-CDC / TCP, so the same fleet can be viewed on the Mac at the same time (the desktop GIS lives in the development monorepo).
The official AppStore fork/execs a standalone binary. port/main.c owns the
LVGL display + input and calls the app's app_main()/app_event() ABI
(src/cz_app.c unchanged). Builds in an arm64 Debian container — no device:
./port/build.sh # -> port/dist/location-tracker_0.2.0_arm64.deb (needs docker)Submit with czdev — see docs/SUBMIT.md.
src/ cz_app.c (hub/node/map UI) + cz_app.h (ABI) + cz_ndjson.h +
cz_theme.h + cz_map.{c,h} (offline map: Web Mercator + tile compositor)
port/ standalone entry: main.c (memory/fbdev display + evdev), evdev_kbd.c,
CMakeLists.txt, build.sh
assets/samples/combined_sample.ndjson bundled demo track (self-demo)
assets/tiles/{z}/{x}/{y}.565 bundled demo map tiles (© GSI Japan)
share/images/location-tracker.png 100x100 icon
store/screenshots/*-320x170.png store screenshots (hub / node / detail / hub-map / node-map)
app-builder.json AppStore store metadata
- App code: MIT — © 2026 Yusuke Yoshie (see LICENSE).
- Bundled offline map tiles (
assets/tiles/, installed toshare/APPLaunch/share/tiles): © 国土地理院 / GSI Japan — 地理院タイル, used under the GSI tile terms of use. The source credit is shown on-screen (bottom-right of the map). Tiles are read from local storage only; the app performs no network access. Replace them with your own area viaCZ_TILES_DIR(see thetools/cztilestile generator in the development monorepo). See NOTICE.
Built + verified in an arm64 container (runs, parses NDJSON, clean exit; .deb
passes the packages CI checks). Not yet verified on physical CardputerZero
hardware — the native LoRa receiver is a skeleton, so on-device data currently
comes from a LoRa hub over USB-CDC. MIT licensed.