NomadLink

NomadLink One · NomadLink OS · NomadLink Console · NomadLink Cloud — v0.1.0 — generated 2026-10-01 12:10 UTC

Current Sprint

SPRINT-001 — Foundation, safety and de-risking
Goal: Make the repository trustworthy as the source of truth, remove the credential leak risk, and run the three blocking hardware experiments that determine whether the product's headline features are feasible at all.
Window: 2026-09-29 → 2026-10-10 · Status: IN_PROGRESS

Sprint Exit Criteria

#Criterion
1Repository initialised and committed with a clean history and no secrets [DONE: TASK-001, TASK-003; secrets scan over full history is clean]
2Broker credential removed from tracked source and rotation flagged to the user [PARTIAL: code done and verified; rotation is a user action, TASK-004 held at VERIFICATION]
3ADR-005 framework decision Accepted or Rejected with a written rationale [OPEN - one of its two preconditions is now met, RISK-002 retired]
4RISK-002 PPP on the Airtel SIM produces an IP on the ESP32 [DONE: TEST-020 PASS, phase RUNNING, local=100.76.140.112]
5RISK-003 audio hardware population confirmed [BLOCKED on physical board inspection by the user, TASK-021]
6RISK-001 GPS cold start benchmarked [OPEN, TASK-022]

Progress

23
Requirements
2
Verified
9
Partially verified
12
Not started
48
Tasks
8
Tasks done
10/30
Tests passing
10
Open defects
3
Critical risks

Firmware Installer

NomadLink One

Flash the ESP32-S3 router firmware directly from the browser. No command line or Python installation required.

Base plus an A7670E 4G uplink over UART (components/modem_4g) with a /modem web page to choose WiFi vs 4G. The 4G stack is started from its own task 2 s into boot, AFTER the SoftAP and web server are up, so a modem problem can never stop the AP coming up. RGB LED signalling is compiled in but DISABLED by default (the 0.2.0-4g.1 loop was traced to code running before AP start; the LED RMT allocation is the prime suspect). App console is UART0 so panics are visible on the CH343.
Source: manifest_nomadlink_esp32s3.json · Version 0.6.2-position3 · Upstream base 2.4.17
Recommended: Chrome, Edge or Opera. Close all other serial monitors first. Browser flashing writes bootloader, partition table, otadata and app.

Honest Status

Hardware capabilities are substantially proven and the product has now started to build on them. The decisive gap that was open at the last update is closed: PPP over UART now negotiates end to end on the Airtel SIM, giving the ESP32 a real IP interface (100.76.140.112, gw 10.64.64.64). That was the single precondition gating the NAT router. What is still unproven is product behaviour, not hardware: end-to-end MQTT publish, any forwarding/NAT, and any web portal.

Verified and usable

Capability
GNSS fix: 18.480776, 73.897998 in 69 s cold start (PWRKEY power-on sequence is mandatory; see L-1)
Cellular LBS fallback: +CLBS: 0,18.481703,73.897415,550, corroborated against the GNSS fix
4G data bearer: +CEREG: 0,1, +CGPADDR: 1,100.90.93.199, +CSQ: 26,99 with antenna
PPP over UART: lwIP reaches phase RUNNING, local=100.76.140.112 gateway=10.64.64.64 mtu=1500, held stable, reproduced on a cold boot. Three fixes were needed (BUG-006): post-CONNECT settle delay, tcpip_init(), and the core lock.
Camera OV2640 live capture, SD card round trip (Arduino), outbound SMS, outgoing call control

Not yet proven

Item
End-to-end MQTT publish from the device to the broker (TASK-405, TEST-403 FAIL)
IP forwarding / NAT between SoftAP clients and the LTE link, and the 3 s dual-WAN failover target (REQ-004). The PPP interface it needs now exists; the routing above it does not.
Any web portal functionality
Audio hardware presence (RISK-003) - needs physical board inspection, still blocking for voice/ESP-SR
TLS on the cellular path (RISK-005)

Traceability: Requirement → Task → Test → Verification

RequirementPriorityStatusTasksTestsEvidence
REQ-001
Wi-Fi SoftAP with internal DHCP
P0PARTIALLY_VERIFIEDTASK-101, TASK-102, TASK-103TEST-101SoftAP is verified up and stable on the bench with the SSID derived from the efuse MAC, and the admin page is implemented. NOT verified: no real clien
REQ-002
Wi-Fi STA scan, credential entry and auto-connect
P0NOT_STARTEDTASK-102, TASK-105TEST-102Not yet attempted.
REQ-003
Cellular connection management over A7670E
P0PARTIALLY_VERIFIEDTASK-106, TASK-107TEST-103VERIFIED. AT+CSQ, AT+CEREG?, AT+COPS? all respond. Registered on Airtel MCC 40490 / MNC 90, +CEREG: 0,1, CSQ 26,99 with patch antenna attached. Data b
REQ-004
Dual-WAN automatic failover with NAT routing
P0PARTIALLY_VERIFIEDTASK-020, TASK-108, TASK-109, TASK-110TEST-104, TEST-105Precondition now proven, feature not yet implemented. TASK-020 (2026-09-29) verified on hardware that PPP negotiates end to end on the Airtel SIM: lwI
REQ-005
Camera capture and MJPEG stream over HTTP
P1PARTIALLY_VERIFIEDTASK-201, TASK-202TEST-201VERIFIED at sensor level. OV2640 confirmed MID 0x7fa2 PID 0x0026 VER 0x0042, SCCB addr 0x30. 320x240 RGB565 in PSRAM, luma stddev 15.4 (non-zero varia
REQ-006
Camera control web page
P2NOT_STARTEDTASK-203TEST-202Not yet attempted.
REQ-007
GNSS acquisition, NMEA parsing and position fix
PRD defect: PRD FR-3.1 names AT+CGNSINF, which does not exist on this module. AT+CGPSINFO is valid. Corrected per ADR-002.
P0VERIFIEDTASK-301, TASK-302TEST-301VERIFIED. Cold-start fix 18.480816, 73.898640 (LOCK t+130s, 4 sats, hdop 7.3, 2026-09-30 17:46 local). Prior 2026-09-29: 18.480776, 73.897998 in 69 s,
REQ-008
Cellular LBS position fallback
P0VERIFIEDTASK-303TEST-302VERIFIED 2026-09-29. AT+CLBS=1,1 returned +CLBS: 0,18.481703,73.897415,550. Independently corroborated by the GPS fix at 18.480776, 73.897998 (separat
REQ-009
Location web page with live map
P2NOT_STARTEDTASK-304TEST-303Not yet attempted.
REQ-010
Cloud broker credential configuration UI
P1NOT_STARTEDTASK-401, TASK-402TEST-401Not yet attempted. Credentials must be stored in NVS and never committed to the repository.
REQ-011
Telemetry publish controls and interval
P1NOT_STARTEDTASK-403, TASK-404TEST-402Not yet attempted.
REQ-012
Direct MQTT telemetry publish from device over LTE
P0PARTIALLY_VERIFIEDTASK-405, TASK-406TEST-403NOT VERIFIED END TO END. The transport is proven: AT+CIPOPEN returns +CIPOPEN: 0,10 to broker.hivemq.com:1883, which is the command the TinyGSM A7672x
REQ-013
MQTT subscriber command engine
P1NOT_STARTEDTASK-407, TASK-408TEST-404Not yet attempted. Depends on TASK-405 completing first.
REQ-014
SMS receiver engine with whitelist
P1PARTIALLY_VERIFIEDTASK-501, TASK-502TEST-501PARTIALLY VERIFIED. Outbound SMS confirmed working: +CMGS: 2 and +CMGS: 3, both received by the user. AT+CNMI=2,1,0,1,0 is required to get delivery re
REQ-015
SMS command parser and auto-reply
P2NOT_STARTEDTASK-503TEST-502Not yet attempted. Depends on TASK-501.
REQ-016
Incoming call management with auto-answer and whitelist
P1PARTIALLY_VERIFIEDTASK-601, TASK-602TEST-601PARTIALLY VERIFIED. Outgoing call confirmed: +VOICE CALL: BEGIN, active call state +CLCC: 1,0,2, user heard audio. Poll AT+CLCC? for state 2=active, 4
REQ-017
Outgoing call execution and dialpad UI
P2NOT_STARTEDTASK-603, TASK-604TEST-602ATD dialing is proven. The web dialpad and the full-duplex I2S audio path are NOT verified. See RISK-003: the board's audio codec/mic wiring is unconf
REQ-018
Offline speech recognition engine (ESP-SR)
P2NOT_STARTEDTASK-701, TASK-702TEST-701Not attempted. PRD NFR requires recognition latency strictly under 800 ms; that target is unvalidated. See RISK-004.
REQ-019
Voice contacts directory with wake-word dialing
P3NOT_STARTEDTASK-703TEST-702Not attempted. Depends on REQ-018 and on the audio hardware being confirmed present.
REQ-020
Asynchronous responsive web portal
P0PARTIALLY_VERIFIEDTASK-801, TASK-802, TASK-803TEST-801The async server, the seven-section navigation and the dashboard are implemented and inside the commit gate (make product), 2026-09-30. Verified only
REQ-021
NVS persistence of configuration and secrets
P0NOT_STARTEDTASK-404, TASK-402TEST-802Not started as a product feature, but the specific Rule 27 violation found during bootstrap is now closed: the hardcoded broker credential was removed
REQ-022
Security hardening
P0NOT_STARTEDTASK-804, TASK-405TEST-803Not attempted. TLS on the cellular path is untested: AT+CSSLCFG and SNI are unverified on firmware A011B04A7670M7_F. See RISK-005. ADDITION 2026-09-30
REQ-023
SD card storage for captures and logs
P2PARTIALLY_VERIFIEDTASK-805TEST-804VERIFIED on the Arduino sketch path: 3,984,588,800-byte FAT32 card, write/read/delete round trip passed. Pins SD_MMC.setPins(5, 4, 6) with 20000 kHz.