Technical Architecture
ELRS Mobile is not just a web-wrapper; it is a native Dart implementation of the ExpressLRS compilation and configuration pipeline.
Unified Firmware Assembly
Instead of relying on a remote cloud compiler, the app dynamically builds binaries locally on your device. When flashing ESP32/ESP8285 targets, the FirmwareAssembler executes a precise bit-level modification sequence:
Extracts the base generic firmware from the cached firmware.zip archive.
Trims the base padding by seeking the ESP 0xE9 magic byte signature.
Extracts specific target pinouts and runtime configuration from hardware.json.
Byte-packs Product Name (128b), Lua Name (16b), options.json (512b), and hardware.json (2048b) directly into the binary stream.
Compresses the final payload into a .gz stream if required by the target platform (e.g. ESP8285 legacy).
Peripheral Logic
Section titled “Peripheral Logic”Regulatory Domain Injector
Section titled “Regulatory Domain Injector”The app accurately handles the complex differences between frequency bands. For 900MHz/Dual-Band devices, it actively injects your chosen domain (e.g., FCC, EU868) into the compiled JSON payload. For standard 2.4GHz targets, it utilizes a boolean flag to silently route the extraction process to either the standard FCC/ or European LBT/ base firmware folders during assembly.
Firmware Caching & Sync
Section titled “Firmware Caching & Sync”Offline flashing is made possible through a robust local caching system. When a user downloads a release via the Firmware Manager, the FirmwareCacheService pulls the generic firmware.zip and device-specific hardware.zip directly from the ExpressLRS Artifactory. These archives are managed and stored locally on the device, ensuring assembly and flashing can occur instantly in the field without any active internet connection.
Native Network Binding
Mobile operating systems (especially Android and iOS) will deprioritize Wi-Fi connections that lack internet access, silently routing traffic over cellular instead. This prevents standard apps from reaching ELRS hardware at 10.0.0.1.
ELRS Mobile solves this via the NativeNetworkService. When a hardware connection is detected, the app invokes a platform-specific MethodChannel to bind the entire Flutter process to the Wi-Fi interface at the OS kernel level. This ensures all HTTP and mDNS traffic routes correctly to the hardware, regardless of cellular status.