A self-hosted LoRa sensor & actuator mesh for the places WiFi can't reach — with a cyberpunk Android app and zero-config Home Assistant integration.
Battery/solar sensor nodes in the yard, a relay on the fence line, an LED ring in a jack-o-lantern, a four-servo robot arm — all talking over 915MHz LoRa to a base station that bridges everything into MQTT and Home Assistant. No cloud, no subscriptions, everything runs on your own network.

The dashboard — live sensor readings, battery level, and per-node controls
| Role | What it does |
|---|---|
| Cortex | The base station. Connects to WiFi + your MQTT broker, receives LoRa data from every node, publishes to Home Assistant with full auto-discovery, and relays commands back out over LoRa. One per network. |
| Synapse | A sensor/actuator node. Reads sensors, drives actuators, sleeps on battery. No WiFi needed. As many as you like. |
| Repeater | Rebroadcasts packets to extend range. Any node can be reconfigured into one. |
Every board runs the same firmware — the role, radio settings, sensors, and actuators are all configured over Bluetooth from the Android app. No recompiling, no hardcoded credentials.
- AES-256 encrypted LoRa with replay protection, ACK + retry, and listen-before-talk
- Deep sleep for battery/solar nodes — wake on timer or instantly on sensor interrupt; the base station holds commands for sleeping nodes and delivers them at next wake
- Home Assistant auto-discovery — nodes appear as devices with proper entities (climate sensors, switches, lights with effect lists, preset dropdowns) the moment they first report
- Sensors: BME280/680, AHT20, SHT31/SHT40, BMP280, DHT11/22, DS18B20, BH1750, TSL2591, HC-SR04, PIR, reed switches, buttons, soil moisture, analog, IR receiver (learns remote codes), and more
- Actuators: relays (with active-low + momentary pulse modes), LEDs, buzzers, servos (smooth motion, angle limits, multi-joint poses), PWM/MOSFET dimmers, IR blaster, and addressable LED strips
- LED strips: 15 effects, WLED-style segments, four color slots, speed/intensity/direction per effect, named presets applyable from the app or an HA automation
- The app: BLE device setup with wiring diagrams and a live pin map, real-time dashboard, mesh topology view with per-link signal strength, MQTT traffic monitor, config export/import for cloning nodes

The network tab — live mesh topology with per-link signal strength

LED strip control — effects, four color slots, speed/intensity/direction, and presets
- Heltec WiFi LoRa 32 V3 (ESP32-S3 + SX1262 + SSD1306 OLED) — the supported board
- 915MHz (US) by default; frequency configurable in the app
- Sensors/actuators wire to the header pins — the app shows a wiring guide with the exact pins highlighted for whatever you configure

Heltec V3 showing the SynapseLink boot screen
Requires PlatformIO:
cd firmware
pio run -e node -t uploadFlash every board with the same binary.
Grab SynapseLink.apk from the Releases page and install it (Android 8+; you'll need to allow installs from unknown sources).
- Open the app → DEVICES → scan. Fresh boards advertise as
SynapseLink - XXXX. - Configure your first board as the Cortex: WiFi credentials, MQTT broker address, an encryption passphrase, and a name.
- Configure the rest as Synapse nodes: unique address, the same passphrase, and whatever sensors/actuators you've wired (the app shows wiring for each). Tip: EXPORT CFG from one node and IMPORT on the next to clone the common settings.
- SAVE & APPLY — nodes join the mesh and appear on the dashboard and in Home Assistant automatically.

BLE device scanner — fresh boards appear here ready to configure
Nothing to configure — with the MQTT integration installed, SynapseLink devices appear on their own with all entities, availability tracking, battery levels, and preset dropdowns ready for automations.
Indoors through walls expect a few hundred meters; line-of-sight goes much further. A repeater node roughly doubles reach in its direction. The topology view shows live signal strength per link — walk around and watch it.
