{
  "_comment": "OSHI node compatibility database. Served at /lora/nodes.json and rendered by /lora/. Single source of truth for the website AND for anything else that needs to know what OSHI supports — keep it data, not prose. `tested` is the honest field: it records what was actually verified on real hardware and by whom, and it must never be edited to something nobody ran.",
  "schemaVersion": 1,
  "updated": "2026-08-03",
  "firmwareFamilies": {
    "meshtastic": {
      "name": "Meshtastic 2.x",
      "status": "supported",
      "note": "What OSHI talks to today, over Meshtastic's published BLE service. Flash it with the official web flasher, then pair from OSHI."
    },
    "oshi": {
      "name": "OSHI Firmware",
      "status": "planned",
      "note": "Reserved. The app already speaks to nodes through a firmware-neutral contract, so adding this is an adapter, not a rewrite."
    }
  },
  "boards": [
    {
      "id": "heltec-v3",
      "name": "Heltec WiFi LoRa 32 V3",
      "vendor": "Heltec",
      "mcu": "ESP32-S3",
      "radio": "SX1262",
      "flashMB": 8,
      "ble": true,
      "wifi": true,
      "display": "0.96\" OLED",
      "battery": "JST 1.25 Li-Po",
      "gps": false,
      "firmware": [
        "meshtastic"
      ],
      "ota": false,
      "priority": 1,
      "buyUrl": "https://heltec.org/project/wifi-lora-32-v3/",
      "tested": {
        "state": "verified",
        "detail": "Flashed from this site and verified on real hardware 2026-08-03: ESP32-S3 rev v0.2, 8 MB flash, image MD5 matched the vendor metadata, 'Hash of data verified' on write, and the node booted Meshtastic 2.7.26.54e0d8d with 'SX1262 init success' and the BLE module starting. Set your region on first pairing — a new node ships with region UNSET and will not transmit until it has one."
      }
    },
    {
      "id": "tbeam",
      "name": "LilyGO T-Beam",
      "vendor": "LilyGO",
      "mcu": "ESP32",
      "radio": "SX1276 / SX1262 (revision dependent)",
      "flashMB": 4,
      "ble": true,
      "wifi": true,
      "display": "0.96\" OLED",
      "battery": "18650 holder",
      "gps": true,
      "firmware": [
        "meshtastic"
      ],
      "ota": false,
      "priority": 2,
      "buyUrl": "https://lilygo.cc/",
      "tested": {
        "state": "untested",
        "detail": "Compatible on paper via the same BLE service. Not yet run against OSHI."
      }
    },
    {
      "id": "t3s3",
      "name": "LilyGO T3-S3",
      "vendor": "LilyGO",
      "mcu": "ESP32-S3",
      "radio": "SX1262 / SX1280",
      "flashMB": 8,
      "ble": true,
      "wifi": true,
      "display": "0.96\" OLED",
      "battery": "JST 1.25 Li-Po",
      "gps": false,
      "firmware": [
        "meshtastic"
      ],
      "ota": false,
      "priority": 3,
      "buyUrl": "https://lilygo.cc/",
      "tested": {
        "state": "untested",
        "detail": "Compatible on paper. Not yet run against OSHI."
      }
    },
    {
      "id": "t-echo",
      "name": "LilyGO T-Echo",
      "vendor": "LilyGO",
      "mcu": "nRF52840",
      "radio": "SX1262",
      "flashMB": 1,
      "ble": true,
      "wifi": false,
      "display": "1.54\" e-paper",
      "battery": "internal Li-Po",
      "gps": true,
      "firmware": [
        "meshtastic"
      ],
      "ota": false,
      "priority": 4,
      "buyUrl": "https://lilygo.cc/",
      "tested": {
        "state": "untested",
        "detail": "nRF52 rather than ESP32 — it is flashed by drag-and-drop UF2, not by the web flasher."
      }
    },
    {
      "id": "heltec-wireless-tracker",
      "name": "Heltec Wireless Tracker",
      "vendor": "Heltec",
      "mcu": "ESP32-S3",
      "radio": "SX1262",
      "flashMB": 8,
      "ble": true,
      "wifi": true,
      "display": "0.96\" TFT",
      "battery": "JST 1.25 Li-Po",
      "gps": true,
      "firmware": [
        "meshtastic"
      ],
      "ota": false,
      "priority": 5,
      "buyUrl": "https://heltec.org/",
      "tested": {
        "state": "untested",
        "detail": "Compatible on paper. Not yet run against OSHI."
      }
    }
  ],
  "ranges": [
    {
      "transport": "Bluetooth mesh",
      "range": "10–100 m",
      "note": "Phone to phone, both apps open."
    },
    {
      "transport": "Wi-Fi Direct",
      "range": "50–200 m",
      "note": "Phone to phone, no router needed."
    },
    {
      "transport": "LoRa · dense city",
      "range": "2–5 km",
      "note": "Buildings and interference dominate."
    },
    {
      "transport": "LoRa · suburban",
      "range": "5–15 km",
      "note": "Typical rooftop or window placement."
    },
    {
      "transport": "LoRa · open terrain",
      "range": "15–50+ km",
      "note": "Line of sight, decent antenna."
    }
  ],
  "rangeDisclaimer": "Real range depends on antenna, placement, terrain and the transmit power your region allows. These are field figures, not laboratory maxima."
}