Skip to content

Repository files navigation

NW-Status

At-a-glance status of every NorthernWidget hardware design and firmware/software library across the current threads of work: bringing the libraries to a common form, the Schema 1 (NW-Device-Specification) rollout, and hardware readiness.

Status — 2026-09-24

Generated by nw_status.py from the working tree, git, the GitHub API, and NW-Device-Specification. Cells listed in nw_status_manual.csv are hand-maintained (Schema 1 firmware and library state, hardware verification, next actions, notes); everything else is scanned. Supersedes nw_library_audit_2026-05-15.csv.

One row per device (its library and its hardware repo together) or per unpaired library; rows are banded as Devices, Standalone libraries, and Bare repos. This file carries one table per thread of work; the master table with every column side by side is nw_status_2026-09-24_icons.pdf. A column in which every row passes or does not apply is hidden and listed under the table.

Legend: ✅ done · ◐ partial · ❌ missing or wrong · — not applicable · ? not determined

Common sensor API: goal is that every sensor library presents the same C++ interface in Arduino style. Facets, one column each: begin() returns bool; getHeader()/getString(); the raw-readings triad beginRawReadings()/takeRawReading()/endRawReadings(); casing in two steps, camelCase conversion (every method has a camelCase name and any PascalCase name still present is marked [[deprecated]]) then PascalCase removed (no PascalCase method remains; "pending" while deprecated aliases are still carried); header string has no trailing space; header separator (comma or comma-space, a fact rather than a check, since the target format is undecided). Whether every sensor must carry the raw triad is also an open decision.

Release readiness: columns follow RELEASING.md, one per required file or field.

Open items that are not per-row: spec appendices still print Magic=0x00 (spec body says 0x4E); NorthernWidget_Core and the NorthernWidget bundle library have no repo yet; Firmware-Aggregator repolist.txt still names BME_Library and MCP3421; Symbiont-LiDAR_Library is not cloned locally (superseded by Apis); Monarch/Dyson libraries are archived, split into Libelle and Liasis.

Where is everything

Row Type Library GitHub HW: Repo HW: GitHub Arduino registry Open issues Uncommitted files HW: Open issues HW: Uncommitted files
Devices
Apis Sensor Apis_Library NorthernWidget/Apis_Library Project-Apis NorthernWidget/Project-Apis ✅ 3 ✅ 0 19 ◐ 2
Haar Sensor Haar_Library NorthernWidget/Haar_Library Project-Haar NorthernWidget/Project-Haar ❌ no 3 ✅ 0 10 ✅ 0
Walrus Sensor Walrus_Library NorthernWidget/Walrus_Library Project-Walrus NorthernWidget/Project-Walrus ❌ no 0 ✅ 0 7 ✅ 0
Libelle Sensor Libelle_Library NorthernWidget/Libelle_Library Project-Libelle NorthernWidget/Project-Libelle ❌ no 7 ✅ 0 17 ✅ 0
Liasis Sensor Liasis_Library NorthernWidget/Liasis_Library Project-Liasis NorthernWidget/Project-Liasis ❌ no 5 ✅ 0 2 ✅ 0
Margay Logger Margay_Library NorthernWidget/Margay_Library Project-Margay NorthernWidget/Project-Margay ❌ no 14 ✅ 0 19 ◐ 2
Okapi Logger Okapi_Library NorthernWidget/Okapi_Library Project-Okapi NorthernWidget/Project-Okapi ❌ no 8 ✅ 0 22 ◐ 1
Tally Sensor Tally_Library NorthernWidget-Skunkworks/Tally_Library Project-Tally NorthernWidget-Skunkworks/Project-Tally ❌ no 1 ✅ 0 4 ◐ 1
Standalone libraries
MCP3421 Component MCP3421 NorthernWidget/MCP3421 — — ❌ no 2 ✅ 0 — —
NW_BME280 Sensor NW_BME280 NorthernWidget/NW_BME280 — — ❌ no 0 ✅ 0 — —
NW_Core Core NW_Core NorthernWidget/NW_Core — — ❌ no 0 ✅ 0 — —
DS3231 Component DS3231 NorthernWidget/DS3231 — — ✅ 12 ◐ 1 — —
DS3231_Logger Component DS3231_Logger NorthernWidget/DS3231_Logger — — ❌ no 1 ✅ 0 — —
MaxBotix_Library Sensor MaxBotix_Library NorthernWidget/MaxBotix_Library — — ❌ no 4 ◐ 3 — —
T9602_Library Sensor T9602_Library NorthernWidget/T9602_Library — — ❌ no 0 ✅ 0 — —
TP-Downhole_Library Sensor TP-Downhole_Library NorthernWidget/TP-Downhole_Library — — ❌ no 5 ◐ 1 — —
MS5803 Component MS5803 NorthernWidget/MS5803 — — ❌ no 6 ◐ 1 — —
MCP23018 Component MCP23018 NorthernWidget-Skunkworks/MCP23018 — — ❌ no 0 ✅ 0 — —
Bare repos
VEML6030 Component VEML6030 NorthernWidget/VEML6030 — — ❌ no 1 ✅ 0 — —
VEML6075 Component VEML6075 NorthernWidget/VEML6075 — — ❌ no 0 ✅ 0 — —
TCA9534 Component TCA9534 NorthernWidget/TCA9534 — — ❌ no 1 ✅ 0 — —
MCP4725 Component MCP4725 NorthernWidget-Skunkworks/MCP4725 — — ❌ no 0 ✅ 0 — —

All rows pass or not applicable (column hidden): Unpushed commits, HW: Unpushed commits

Release readiness (Schema 0 checklist)

Row version= Last tag version = tag HW: Last tag HW: Commits past tag library.properties paragraph= url= ok category= LICENSE README DOI badge CITATION.cff .zenodo.json keywords.txt doxygen_NW.cfg src/ _Demo example Examples
Devices
Apis 0.1.0 v0.1.0 ✅ v0.1.1 39 ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Apis_Demo, Apis_Readings, Margay
Haar 1.0.0 v1.0.0 ✅ v0.1.1 22 ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Haar_Demo, SerialDemo
Walrus 0.2.0 v0.2.0 ✅ v0.3.0 27 ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ SerialDemo, Walrus_Demo
Libelle 1.0.0 v1.0.0 ✅ v0.2.0 24 ✅ ✅ ❌ WRONG (NorthernWidget-Skunkworks/Libelle_Library) ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ LibelleMargayDemo, LibelleSWDemo, Libelle_Demo
Liasis 1.0.0 v1.0.0 ✅ v0.2.0 2 ✅ ✅ ❌ WRONG (NorthernWidget-Skunkworks/Liasis_Library) ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Liasis_Demo
Margay 1.2.0 v1.2.0 ✅ v2.2.2 97 ✅ ✅ ✅ ✅ Data Storage ✅ ❌ latestdoi (deprecated) ✅ ❌ MISSING ✅ ✅ ✅ ❌ MISSING Basic, HighSpeed_NoSleep, Laser_Ranging, SensorDemo_TP-Downhole
Okapi 0.7.0 v0.6.0 ❌ NO (v0.6.0 vs 0.7.0) v0.6.0 7 ✅ ✅ ❌ WRONG (NorthernWidget-Skunkworks/Okapi_Library) ✅ Data Storage ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Okapi_Demo
Tally 0.1.0 none ❌ no tag v0.1 39 ✅ ✅ ❌ WRONG (NorthernWidget_Skunkworks/Tally_Library) ❌ MISSING ✅ ❌ no badge ❌ MISSING ❌ MISSING ✅ ❌ MISSING ✅ ❌ MISSING Tally_I2C_Read
Standalone libraries
MCP3421 2.0.0 v1.1.0 ❌ NO (v1.1.0 vs 2.0.0) — — ✅ ✅ ✅ ✅ Signal Input/Output ❌ MISSING ✅ ✅ ✅ ✅ ❌ MISSING ✅ ❌ MISSING VoltageRead
NW_BME280 3.0.0 v3.0.0-alpha.1 ❌ NO (v3.0.0-alpha.1 vs 3.0.0) — — ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ❌ MISSING ✅ ✅ ✅ ❌ MISSING BasicReadings
NW_Core 0.0.0 none ❌ no tag — — ✅ ✅ ✅ ✅ Sensors ✅ ❌ no badge ❌ MISSING ❌ MISSING ✅ ✅ ✅ ✅ NW_Core_Demo
DS3231 1.2.0 v1.2.0 ✅ — — ✅ ✅ ✅ ✅ Timing ✅ ❌ no badge ✅ ❌ MISSING ✅ ❌ MISSING ❌ flat layout ❌ MISSING AdvanceAlarm, AlarmInterrupt, AlarmPolling, DS3231_oscillator_test, DS3231_set, DS3231_test, echo_time, now, setEpoch, set_echo
DS3231_Logger 0.1.0 none ❌ no tag — — ✅ ❌ blank ✅ ✅ Sensors ❌ MISSING ✅ ✅ ❌ MISSING ✅ ✅ ✅ ❌ MISSING none
MaxBotix_Library 1.1.0 v1.0.0 ❌ NO (v1.0.0 vs 1.1.0) — — ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ❌ MISSING ❌ MISSING ✅ ✅ ❌ MISSING none
T9602_Library 0.0.0 v1.0.0 ❌ NO (v1.0.0 vs 0.0.0) — — ✅ ✅ ✅ ✅ Sensors ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ T9602_Demo
TP-Downhole_Library 0.1.0 none ❌ no tag — — ✅ ❌ blank ❌ WRONG (NorthernWidget/TP-DownHole) ✅ Sensors ✅ ❌ no badge ❌ MISSING ❌ MISSING ✅ ❌ MISSING ✅ ✅ TP_Downhole_Demo
MS5803 0.1.2 none ❌ no tag — — ✅ ❌ blank ✅ ✅ Sensors ✅ ❌ MISSING README ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING ✅ ✅ MS5803_Demo
MCP23018 0.0.0 none ❌ no tag — — ✅ ✅ ✅ ✅ Signal Input/Output ✅ ❌ no badge ❌ MISSING ❌ MISSING ✅ ❌ MISSING ✅ ❌ MISSING MCP23008_DigitalWrite, MCP23018_DigitalWrite
Bare repos
VEML6030 none — — — ❌ MISSING — — ✅ ✅ ❌ no badge ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING ❌ flat layout ❌ MISSING none
VEML6075 none — — — ❌ MISSING — — ✅ ✅ ❌ no badge ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING ❌ flat layout ✅ VEML6075_Demo
TCA9534 none — — — ❌ MISSING — — ✅ ✅ ❌ MISSING README ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING ❌ flat layout ❌ MISSING none
MCP4725 none — — — ❌ MISSING — — ✅ ✅ ❌ no badge ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING ❌ flat layout ❌ MISSING none

Common sensor API

Row begin() -> bool Raw-readings triad camelCase conversion PascalCase removed Header trailing space Header separator
Devices
Apis ✅ ✅ ✅ ✅ ✅ comma
Haar ✅ ❌ MISSING ✅ ✅ ❌ comma-space
Walrus ✅ ❌ MISSING ✅ ✅ ✅ comma
Libelle ✅ ❌ MISSING ✅ ✅ ✅ comma
Liasis ✅ ❌ MISSING ✅ ✅ ✅ comma
Margay ✅ — ✅ ✅ — —
Okapi ✅ — ✅ ◐ pending (12 deprecated aliases) — —
Tally ◐ uint8_t ❌ MISSING ❌ PascalCase only: Clear, ClearTicks, GetHeader, GetString … ❌ NO (10 PascalCase live) ❌ comma-space
Standalone libraries
MCP3421 ◐ int — ✅ ✅ — —
NW_BME280 ✅ ✅ ✅ ◐ pending (5 deprecated aliases) ✅ comma
NW_Core ✅ — ✅ ✅ — —
DS3231 — — ✅ ✅ — —
DS3231_Logger ◐ int — ✅ ✅ — —
MaxBotix_Library ✅ ❌ MISSING ◐ unmarked aliases: GetHeader, GetRange, GetString ❌ NO (3 PascalCase live) ❌ comma-space
T9602_Library ✅ ❌ MISSING ✅ ✅ ✅ comma
TP-Downhole_Library ◐ uint8_t ❌ MISSING ❌ PascalCase only: GetBaud, GetByte, GetData, GetHeader … ❌ NO (10 PascalCase live) ❌ comma-space
MS5803 ◐ uint8_t — ✅ ✅ — —
MCP23018 ✅ — ◐ unmarked aliases: DigitalWrite, PinMode, SetInterrupt ❌ NO (3 PascalCase live) — —
Bare repos
VEML6030 ◐ uint8_t — ❌ PascalCase only: AutoRange, Gain2Bits, GetALS, GetGain … ❌ NO (20 PascalCase live) — —
VEML6075 ◐ uint8_t — ❌ PascalCase only: GetUVA, GetUVB, Mode, PowerOn … ❌ NO (7 PascalCase live) — —
TCA9534 — — ❌ PascalCase only: Begin, DigitalWrite, PinMode ❌ NO (3 PascalCase live) — —
MCP4725 ◐ void — ❌ PascalCase only: SetGain, SetRef, Sleep ❌ NO (3 PascalCase live) — —

All rows pass or not applicable (column hidden): getHeader/getString

Logger compile (NW-Tests)

Row Compiles: Margay Compiles: Okapi
Devices
Apis ✅ ✅
Haar ✅ ✅
Walrus ✅ ✅
Libelle ✅ ✅
Liasis ✅ ✅
Margay — —
Okapi — —
Tally ✅ ✅
Standalone libraries
MCP3421 — —
NW_BME280 ✅ ✅
NW_Core — —
DS3231 — —
DS3231_Logger — —
MaxBotix_Library ◐ FAIL ◐ FAIL
T9602_Library ✅ ✅
TP-Downhole_Library — —
MS5803 — —
MCP23018 — —
Bare repos
VEML6030 — —
VEML6075 — —
TCA9534 — —
MCP4725 — —

Docs conversion (moxygen -> Doxygen on Pages)

Row docs.yml .doxybook config _docs/ site config README API link
Devices
Apis ✅ ✅ ✅ ✅
Haar ✅ ✅ ✅ ✅
Walrus ✅ ✅ ✅ ✅
Libelle ✅ ✅ ✅ ✅
Liasis ✅ ✅ ✅ ✅
Margay ✅ ✅ ✅ ✅
Okapi ✅ ✅ ✅ ✅
Tally ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
Standalone libraries
MCP3421 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
NW_BME280 ✅ ✅ ✅ ✅
NW_Core ✅ ✅ ✅ ✅
DS3231 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
DS3231_Logger ✅ ✅ ✅ ✅
MaxBotix_Library ✅ ✅ ✅ ✅
T9602_Library ✅ ✅ ✅ ✅
TP-Downhole_Library ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
MS5803 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING README
MCP23018 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
Bare repos
VEML6030 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
VEML6075 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING
TCA9534 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING README
MCP4725 ❌ MISSING ❌ MISSING ❌ MISSING ❌ MISSING

All rows pass or not applicable (column hidden): Pages enabled, moxygen remnants

Schema 1 rollout

Row HW: Schema 1: firmware Schema 1: library HW: Page 0 provisioned + tested
Apis ◐ patch 2 on master 2026-09-22 (on-demand run model per #23; readings-requested word; STATUS-register readiness and busy polling; compiled for ATtiny1634; untested on hardware; sleep bit deferred) ◐ series 4 on master 2026-09-22 (requires firmware patch 2; readings-requested word; one storage path; untested on hardware) ❌ no (NW-Provision writes magic 0x4E as of ca3a64d)
Haar ◐ done on master 2026-09-23 (patch 1: Page 0 from EEPROM with CRC; data at 0x28-0x35 in 0.01 units; writable rule, 0x1F persisted; 32-byte page reads; on-demand trigger, chip select, counter, live and latched faults incl. SHT31 checksum and LPS35HW timeout; address 0x42 -> 0x48); untested on hardware ◐ done on master 2026-09-23 (NW_Core: begin() gates with min patch 1, default address 0x48, chip-group components, N readings with statistics, reading interface, faults, harness with baseline); untested on hardware ❌ no
Walrus ◐ Block 0 done on master 2026-09-23 (patch 1: Page 0 from EEPROM with CRC; writable rule, 0x1F persisted; 32-byte page reads; trigger or timer, chip select, counter, live and latched faults; batch word accepted, no effect); untested on hardware (#18) ◐ done on master 2026-09-23 (NW_Core: begin() gates with min patch 1, chip-group components, N readings with statistics, reading interface, faults, harness with baseline); untested on hardware (#18) ❌ no (#17 provisioning check; #18 hardware validation)
Libelle ◐ done on master 2026-09-23 (patch 1, Libelle_Driver_ShortWave: Page 0 from EEPROM; data at 0x28-0x3D; writable rule, 0x1F persisted; 32-byte page reads; trigger or timer, chip select, counter, unit faults; addresses 0x4C UP / 0x0C DOWN); per-chip faults not yet; untested on hardware ❌ MISSING (v2.0.0 planned; Project-Libelle #23) ❌ no
Liasis — — —
Margay — ❌ MISSING (no Page 0 read) ❌ no
Okapi — ◐ on NW_Logger 2026-09-23: Page 0 read (Schema 0 fallback); Pages 2-3 per the hypothetical appendix; status file; untested on hardware ❌ no
Tally ❌ MISSING (fw 0.2.0 2019: 5-byte map; command bits at 0x00; address 0x33 hard-coded) — ❌ no

All rows pass or not applicable (column hidden): HW: Spec appendix

Hardware design

Row HW: Last tag HW: Commits past tag HW: Eagle .brd HW: KiCad .kicad_pcb HW: KiCad verified vs Eagle HW: Bug-labelled issues
Apis v0.1.1 39 3 0 — 2
Haar v0.1.1 22 2 0 — 0
Walrus v0.3.0 27 3 0 — 2
Libelle v0.2.0 24 2 0 — 3
Liasis v0.2.0 2 1 0 — 0
Margay v2.2.2 97 1 1 ❌ no (KiCad 7 import; BoM fields populated; not netlist-compared) 7
Okapi v0.6.0 7 3 2 ❌ no (KiCad 10 import; power nets and no-connects fixed; not netlist-compared) 13
Tally v0.1 39 3 0 — 1

Next actions

Row Next action Notes
Devices
Apis Bench (needs boards): provision with NW-Provision; flash firmware patch 2; Apis_Library Margay example on a Margay; scope one getRange() (mode-pin finding
Haar Provision Page 0 with NW-Provision; bench-validate firmware patch 1 with Haar_Library on NW_Core (address change 0x42 -> 0x48 breaks old sketches)
Walrus #17 provisioning check and #18 bench validation of firmware patch 1 with Walrus_Library on NW_Core
Libelle Libelle_Library onto NW_Core (harness first; the ADXL343 at 0x1D on the same bus needs a second device in the stub); capture chip acknowledges in the firmware for per-chip faults; bench
Liasis Decide on adding an MCU (#2)
Margay June review fixes in KiCad -> v3 tag; provision Page 0 · Tracking list Margay_Library #32: (1) BME.h -> NW_BME280.h + depends= [build break]; (2) Page 0 read (serial moves to Block 2) + spec fix; (3) sketch addresses; (4) #27/#31; (5) #7 faults depends= should say NW_BME280 · hardware v3 release in progress
Okapi Parallel thread: decide manufacturing source (KiCad-10 import vs Eagle) -> fix #15-#28 there -> ERC/DRC -> Gerbers -> v1.0 tag -> order · Compiles again (2026-09-23 5 library bugs filed 2026-06-02 (#3-#7); snapshot tag waits on hardware test · Prototype; current design is untagged Eagle v1.0 updates (2024-11-02) with CAM outputs
Tally Andy to decide the proposed Tally appendix (spec README, 2026-09-23: monotonic uint32 count latched by the trigger, cap voltage at each latch, NOCAP as Config bit 0, address 0x54 inside the Okapi FRAM range); then firmware Block 0 on the ATtiny841 and the library onto Core · camelCase rename with aliases; category=; url=; CITATION.cff; .zenodo.json; doxygen_NW.cfg; docs.yml Absent from spec / provisioning / registry / snapshot issue until 2026-09-20; library I2C support only on Dev_I2C branch (7 commits unmerged)
Standalone libraries
MCP3421 Add [[deprecated]] PascalCase aliases; LICENSE; doxygen_NW.cfg; docs.yml; NW_MCP3421_Demo; bool begin(); then review and tag v2.0.0 camelCase rename on master since 2026-09-20 push; needs [[deprecated]] aliases before v2.0.0 tag
NW_BME280 Add .zenodo.json; review; tag v3.0.0
NW_Core Apis, Walrus, Haar, T9602 on Core; Libelle firmware done, library next; Tally after its appendix; unversioned until the overhaul ends Created 2026-09-23 from Apis series 4 per LIBRARY-DESIGN section 11; shared harness stubs and NW_TestSupport.h/run_library.sh live in extras/test; kept per library by decision: the forwarders (11a.6), field-named accessors, header/row text, demos
DS3231 CITATION.cff; .zenodo.json; doxygen_NW.cfg; docs.yml (in registry already)
DS3231_Logger LICENSE; CITATION.cff; .zenodo.json; docs.yml; example; paragraph=; bool begin()
MaxBotix_Library TABLED until Haar and Walrus are done (Andy 2026-09-23); design saved (Apis-form surface on NW_Core's common layer; sketch-owned Stream port). Idea to weigh then: an ATtiny on MaxBotix-Helper making it a Schema 1 device like Apis uncommitted Serial1 hack in src/ (deferred refactor; issue #4)
T9602_Library Stale-bits fix + checklist files + Pages docs committed 2026-09-22 (12 commits; unpushed): set version= (last release 1.0.0; proposal 1.1.0); hardware test (bundle refresh is an end-of-overhaul step for all libraries) tag v1.0.0 (2022) exists while library.properties says 0.0.0
TP-Downhole_Library Legacy: keep buildable; no standardization planned legacy; lineage tracked under Walrus
MS5803 README; CITATION.cff; .zenodo.json; keywords.txt; doxygen_NW.cfg; docs.yml; paragraph=
MCP23018 Rewritten 2026-09-23 (src/ layout; pinMode/digitalWrite/digitalRead/setInterrupt; MCP23018::Port; four fixes; harness on NW_Core stubs; unpushed): LICENSE check; CITATION/.zenodo; docs.yml + _docs + doxybook; still under NorthernWidget-Skunkworks
Bare repos
VEML6030 Bare: library.properties and full checklist if kept
VEML6075 Bare: library.properties and full checklist if kept
TCA9534 Bare: library.properties and full checklist if kept
MCP4725 Bare: library.properties and full checklist if kept

Use

python3 nw_status.py           # scan the workspace and GitHub, then render
python3 nw_status.py scan      # write nw_status_<date>.csv only
python3 nw_status.py render    # render the latest dated CSV into this README and to _icons.pdf

The NW repositories are expected in the parent directory of this one, or in $NW_WORKSPACE if set. Rendering the PDF needs Google Chrome; without it the Markdown and the intermediate HTML are still produced. GitHub queries use the gh CLI.

Where the testing lives

Two repositories beside this one carry the tests the table reports on. NW-Tests compiles every sensor library inside a Margay and an Okapi sketch and runs each library's desktop harness. NW-Sim (private) runs a logger's firmware on a simulated ATmega1284P with the board hung off it – clock, card, on-board sensors, rails and bus switch – and, since 2026-09-24, a sensor's own firmware on a simulated ATtiny1634 answering the logger's library over a simulated two-wire bus. Neither replaces the bench; both replace finding out on the bench.

What is scanned and what is hand-maintained

Almost every cell is derived from the working tree, git, the GitHub API, or the NW-Device-Specification text at scan time: required files, library.properties fields, tags, begin() return type, the common-API facets (including casing in two steps: camelCase conversion, then PascalCase removed), open and bug-labelled issues, uncommitted and unpushed state, design-file formats.

Cells that no scanner can read live in nw_status_manual.csv as Row,Column,Value and are merged over the scanned values: Schema 1 firmware and library state, hardware verification, next actions, notes. Edit that file when a hand-tracked state changes; rerun the scan for everything else.

Outputs

  • nw_status_<date>.csv — one row per device (its library and hardware repo side by side) or per unpaired library; one fact or one check per column.
  • the report below, written into this README between markers — one table per thread of work, rows banded as Devices / Standalone libraries / Bare repos; a column in which every row passes or does not apply is hidden and listed under the table. Git history of this file is the dated record.
  • nw_status_<date>_icons.pdf — the master table with every column, group bands over the columns, one icon per cell (not committed; regenerate).

Dated CSV snapshots are committed so that the state on a given day can be recovered; the report itself lives below.

Archive

archive/ holds the May 2026 Library Manager readiness audits and their render script, which this tool supersedes.

License

GPL-3.0, see LICENSE.md. The dated CSV and Markdown reports are generated data about the NorthernWidget repositories, not creative works.

Queue

Held and not-yet-started work, with blockers: QUEUE.md.

About

At-a-glance status of every NorthernWidget hardware design and firmware/software library

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages