Repository navigation
Releases: Loomwave/lorascan
Release list
lorascan 0.1.31
If you decode Loomwave traffic, upgrade. The Loomwave fleet moved to SF11/BW500 on 2026-09-24 (the #451 flag day — the 500 kHz mode that qualifies under FCC Part 15.247). The built-in loomwave/fleet preset still said SF9/BW125, so a decode at 911.5 MHz silently stopped naming Loomwave traffic.
loomwave/fleetis now SF11/BW500.- New
loomwave/fleet-pre451(SF9/BW125, 911.5 MHz) keeps the retired PHY decodable: boards flashed before the flag day keep transmitting it until reflashed, and finding them is useful during the cutover. A scan at 911.5 MHz tries both. loomwave/bench-cell(905.0 MHz) moves to SF11/BW500.
Also in this release:
- Fix (#13): on a calibrated board, the recommended-500 kHz-slot floor now reads in the same dBm units as the quietest-channels table. The pick itself was already correct.
- CI (#28): every push and PR is tested on Python 3.11, 3.12 and 3.13, plus a wheel install check.
Install: pip install lorascan-0.1.31-py3-none-any.whl (attached).
lorascan 0.1.30
Closes #25 (pinztrek): first-boot setup from a cron job or balena start script, no prompts.
0.1.30
lorascan setup --non-interactive(explicit opt-in; the wizard is unchanged without it): pins + location from--from openhop|meshtasticd --config PATH(or--profile NAME);--cell LAT,LON,--endpoint URL(default share.lorascan.app),--granularity;--skip-radiofor boot scripts (skips preflight/probe/self-test/first-light);--dry-run.- Idempotent: loads the existing config, merges the flags —
setup: unchanged(exit 0, no radio or network call) /setup: updated <field>/setup: written. Changing--fromre-imports the profile (auto-<source>). An unanswered question exits 2 naming the flag; a failed step exits 1. - Fixes a latent wizard bug: autoconf's 3-tuple location now normalised on the interactive path too.
FlagsIO+run_noninteractive(); 17 new tests (fail-first); suite 324 passed; bench Python 3.11.2compileall+ end-to-end smoke on the target interpreter.
Install: pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.30/lorascan-0.1.30-py3-none-any.whl
lorascan 0.1.29
Closes #22 (pinztrek): balena repeaters run a read-only rootfs with only /data writable.
0.1.29
- Global
-d/--data-dir DIR(before the subcommand) andLORASCAN_DIRfor units; precedence flag > env > legacy. - With it set: station config, board profiles,
networks.yaml, the share token and every default-named output (lorascan.db,lorascan-report.html,lorascan-share.json, calibrated profile,auto's profile) live underDIR; missing subfolders created. A path passed explicitly is used as given (parent created). - Reads fall back to the legacy
~/.config/lorascanonce (token/config carry over); writes go only toDIR.autoforwards-dto its scan/share re-entries; module namesTOKEN_PATH/PROFILE_DIRS/USER_NETWORK_PATHS/USER_PATHresolve live. - An unwritable or missing
DIRis one cleanlorascan: …line (OSError / sqlite OperationalError handled), never a traceback. - New
lorascan/paths.py;tests/test_paths.py(29 tests, fail-first); suite 304 passed; bench Python 3.11.2compileall+-d/LORASCAN_DIRsmoke OK on the target interpreter.
Install: pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.29/lorascan-0.1.29-py3-none-any.whl
lorascan 0.1.28
Matt (2026-09-18): nothing in the README or the tool pointed users at share.lorascan.app to see results — every mention was an upload target, and the README still said the endpoint "is being deployed".
What changes (0.1.28)
- README: new "The community map (share.lorascan.app)" section (what is there, how to upload,
/v1/dump.json//v1/dump.csv); stale "being deployed" line fixed. share/upload/auto: print[share] view: https://…/after a successful upload (newshare.share_view_url(to), strips a/v1/shareroute to the map root).lorascan --helpepilog names the map; HTML report footer links to it;setupsays where uploads are published.- Tests:
tests/test_share_view_url.py(helper cases + README guard). Suite 274 passed; bench Python 3.11.2compileallgate OK.
Install: pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.28/lorascan-0.1.28-py3-none-any.whl
lorascan v0.1.27
Fix. 0.1.26 dropped the auto-range legend colour swatch to fix an overlap; this restores the gradient, positioned to the left of the "busy X% -> Y%" text so the swatch and label no longer collide. Applies to both the band summary and the 500 kHz ribbon.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.27/lorascan-0.1.27-py3-none-any.whl
lorascan v0.1.26
Fix. The auto-ranged band-summary legend on the community page had a colour swatch overlapping the "auto-ranged" text. It is now text-only (busy X% -> Y% - colour auto-ranged), matching the 500 kHz ribbon.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.26/lorascan-0.1.26-py3-none-any.whl
lorascan v0.1.25
Band-summary auto-range legend. The community page auto-ranges the band-summary colours (since 0.1.24) but did not say what range it mapped to. This adds the same "busy X% → Y%" legend and colour swatch the 500 kHz ribbon prints, so a relatively-coloured band names its range instead of leaving the reader to guess. band_svg(auto_range=True) only — the absolute-scale per-station report is unchanged.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.25/lorascan-0.1.25-py3-none-any.whl
lorascan v0.1.24
Community share page — "Best 500 kHz slot" ribbon. When any submitter has scanned at 500 kHz bandwidth, share.lorascan.app now ranks and draws the fixed .250/.750 grid of 52 coordination channels as a static ribbon (recommended channel ringed, exclusion-zone channels struck, hover for busy/floor). No 500 kHz data yet? It shows how to populate it.
Auto-ranged colours. Channel colours — the ribbon and the community band-summary strip — now normalize to the data's actual busy spread, so a quiet band no longer renders every bar the same pale colour. The per-station report is unchanged.
Bulk export documented. /v1/dump.json and /v1/dump.csv (from 0.1.22) are now written up in the share-server deploy README.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.24/lorascan-0.1.24-py3-none-any.whl
lorascan v0.1.23
Grid-aligned 500 kHz recommendation. lorascan report --recommend-grid ranks the fixed .250/.750 grid of 52 non-overlapping 500 kHz channels (902.25, 902.75, … 927.75 MHz) — the coordination grid MeshCore-500 deployments share so neighbours interoperate — instead of a free window. Each grid channel is scored worst-case from the true 500 kHz-bandwidth energy that falls in it, with exclusion-zone channels struck (including the 902.25/902.75 band-edge pair), so the pick is the cleanest usable grid channel. Without the flag, the free-grid recommendation is unchanged.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.23/lorascan-0.1.23-py3-none-any.whl
lorascan v0.1.22
Community share server: bulk data dump. Adds bandwidth-aware bulk export so the community and researchers can pull the raw fleet aggregates for their own analysis (the blended /v1/map.json hides bandwidth).
GET /v1/dump.json— every unflagged per-(submitter, freq, bandwidth) aggregate row (includingbw_hz) plus submitter metadata.GET /v1/dump.csv— the same rows as CSV.
Flagged (miscalibrated) uploads are excluded, matching the public map. Stdlib only.
Install:
pipx install --system-site-packages https://github.com/Loomwave/lorascan/releases/download/v0.1.22/lorascan-0.1.22-py3-none-any.whl