Releases: ExpressLRS/ExpressLRS
Release list
ExpressLRS 4.1.0
Compatibility
Compatible with all hardware running any ExpressLRS 4.x version
Highlights
Dynamic Power Goes Down
#3577 The statistical dynamic power algorithm introduced in 4.0 had a tendency to keep the power level high once it raised it, this change allows it to be a little less cautious. The power down threshold has been lowered from +1.5 SD to +0.5 SD, resulting in more opportunities to lower the power when the signal is good enough. A bug was also fixed where the output would get wonky if you lowered the config power while armed and dynpower also was changing the power (#3639)
Set Bindphrase From Handset
#3554 You can now set a bindphrase on a transmitter or receiver directly from a Lua script. For users that share models by swapping bind phrases, this can be managed directly from the handset without going to wifi now. Lua tool in ZIP in first post
Less "Telemetry Lost"
#3550 How do you know when someone is flying ExpressLRS? Their handset keeps calling out "Telemetry Lost" while they are flying! 🫣 Our behavior of immediately reporting downlink signal instability to the handset upsets a lot of new users, who believe this means they've failsafed, however it only means that we've missed a few telemetry packets. We've switched to a linearly-scaled grace period which will substantially decrease this callout.
Tighter PWM timings for 8285
#3504 The ESP8285 servos twitch and jitter a little, since it has got a lot going on, and all 6 PWM outputs all have to run from a single timer multiplexed in software. This made the timings less accurate than they could be if developers just spent a full week refactoring and hand-tuning the code. 8285 will also stop outputting pulses if the main loop locks up, or the ESP32 browns out (#3681). There should now be less servo jitter on these devices, although they can never be as good as the ESP32-based receivers which run the PWM output in hardware.
WebUI VBAT Calibration and Features
#3644 For receivers with built-in VBAT measurements, a calibration interface has been added to the webui to let you fix that 0.05V error that's been driving you nuts. Many receivers also get updated calibration values, and support was added for multiple simultaneous VBAT sensors.
Screen.Recording.2026-05-11.at.1.20.45.PM.mp4
The wifi signal strength is also shown now on the main information page (#3526), and the wifi password box got a revealer so all the friends you have gathered behind you can see your password as you type (#3590). And don't look now, there's also a favicon (#3606).
New Telemetry
- All VBAT-measuring receivers will also report millivolt-precision voltage as a new sensor e.g. 11.987V vs 12.0V.
- GPS Time sync using the new CRSF sensor type to set the handset time from a flight controller (e.g Betaflight 2026.06) (#3642) or a serial-connected GPS (#3662)
- HoTT protocol gets new Aspd sensor (#3528)
Core Refactoring for LR2021
Semtech's new 4th generation LoRa chip is now in production and much work has been done to better generalize our RF paths to support it. The new chip supports LoRa, FLRC, and FSK on both sub-Ghz and 2.4GHz bands, making it the first chip to support all current ExpressLRS modes. Full LR2021 support coming soon.
Minor Changes
- VTX Admin's "Band" field renamed to "Band/Enabled" and Off is renamed to Disabled, which will hide all the other VTX Admin fields
- Receiver will now refuse to change modes if the TX requests it to switch to a mode that it does not support. Previously, it would soft lock the connection because the two would be in incompatible modes #3610
- Wait until all channels have been received at least once before sending them to the flight controller. Previously a value of 0 was sent, which was ignored by all major flight controller softwares #3645
- Fix
Antenna Mode: Switchfavoring one antenna in 1:2 telemetry mode #3675 - For local builds, the last hardware config is saved per-target to save remembering the number #3449, 8285 firmwares are built with the file suffix the webui expects #3634, and vite testing can proxy data to a real piece of hardware #3487
- elrs.lua supports nesting folder more than 1 deep if needed #3474, 16/32 bit integer editing #3491, hiding irrelevant fields when in MAVLink mode #3565
- Support for "output only" buffered PWM pins #3624, OLED screen mirrored mode #3649
Changes Since RC1
** Complete List **
- PWM ISR watchdog and ESP32 PWM stop on brownout #3681
- Remove isElrs distinction from CRSF parameter read/write #3680
- Only process/forward MAVLink messages which pass frame check #3679
- Fix: Antenna Mode Switch not working properly #3675
- Inhibit VBat telemetry in Mavlink mode #3670
- Load proper default product with mixed case #3665
- Add CRSF GPS Date/Time from Serial connected GPS #3662
- Remove unused small OLED hardware support #3661
- Fix verbose logging build #3660
- Implement screen mirror feature for OLED screens #3649
- Wait for all channels to have data before marking channel data available #3645
- Multiple Voltage Sources and Calibration UI #3644
- Add GPS Time (0x03), MAVLink parsing for GPS Time, Temp #3642
- Fix dynamic power headroom underflow when config power lowered while armed #3639
- Fix regression in band/modulation consolidation #3637
- VSCode: create compressed .bin.gz firmware file #3634
- MAVLink Capa Fix #3632
- Merge 4.x to master #3627
- Option in
hardware.jsonto set PWM pins as output-only #3624 - Separate FIFO locations for TX & RX on SX1280 #3620
- Fixes the joystick which broke in #3554 #3614
- Do not switch RX rate if RX cant do rate from SYNC packet #3610
- Hide VTXAdmin lua fields if disabled #3608
- Add favicons and improve feature flag handling and cleanup #3606
- Housekeeping: get rid of some magic numbers #3605
- Add logging when DCDC is enabled to the LR1121 and SX1280 drivers. #3598
- Add password revealer to WebUI WiFi page #3590
- Modulation/Band consolidation #3587
- PIO ini file cleanup/simplification #3586
- Simplify the flasher to only use the PIO env for target selection #3585
- Fix github build deprecation warnings #3584
- Reduce dynpower SNR down threshold #3577
- Fix web UI display of band information #3566
- Hide Switch & TLM screens when in MAVLink mode #3565
- Update devBLE.cpp -disable hat on BLE HID device #3561
- Add domain info to Lua Version string #3556
- Add MSP functions to get/set binding information #3554
- Fix ESP32 RGB: Prevent I2S MCLK Defaulting to GPIO0 #3552
- Reduce frequency of "Telemetry Lost" callout #3550
- Disable autoupload by default in PIO builds #3545
- RGB LED Fixes #3536
- Remove unused hardware settings #3535
- Misreporting FHSS in DEBUG_RCVR_LINKSTATS for LR1121 2G4 #3533
- Fix CI build so uploads for tags are not overwritten #3530
- WebUI / Add scripts to allow building WebUI artefacts under Windows VSCode/Pio #3529
- HoTT Telemetry / Add Aspd sensor for airspeed capable Vario and GPS devices #3528
- Add wifi signal information to webui #3526
- Refactor waveform_8266 for possibly tighter timings #3504
- Add support for int16/int32 to CRSF parameters #3491
- Allow vite to proxy requests to a real target #3487
- Don't write every byte of log messages individually #3479
- elrs.lua: Improvement to Folders/Sub-Folders #3474
- Save last UnifiedConfiguration as default for target #3449
- Mavlink dynamic sysIDv3 #3032
ExpressLRS 4.1.0-RC1
Compatibility
Compatible with all hardware running any ExpressLRS 4.x version
Highlights
Dynamic Power Goes Down
#3577 The statistical dynamic power algorithm introduced in 4.0 had a tendency to keep the power level high once it raised it, this change allows it to be a little less cautious. The power down threshold has been lowered from +1.5 SD to +0.5 SD, resulting in more opportunities to lower the power when the signal is good enough. A bug was also fixed where the output would get wonky if you lowered the config power while armed and dynpower also was changing the power (#3639)
Set Bindphrase From Handset
#3554 You can now set a bindphrase on a transmitter or receiver directly from a Lua script. For users that share models by swapping bind phrases, this can be managed directly from the handset without going to wifi now. Lua tool in ZIP in first post
Less "Telemetry Lost"
#3550 How do you know when someone is flying ExpressLRS? Their handset keeps calling out "Telemetry Lost" while they are flying! 🫣 Our behavior of immediately reporting downlink signal instability to the handset upsets a lot of new users, who believe this means they've failsafed, however it only means that we've missed a few telemetry packets. We've switch to a linearly-scaled grace period which will substantially decrease this callout.
Tighter PWM timings for 8285
#3504 The ESP8285 servos twitch and jitter a little, since it has got a lot going on, and all 6 PWM outputs all have to run from a single timer multiplexed in software. This made the timings less accurate than they could be if developers just spent a full week refactoring and hand-tuning the code. 8285 will also stop outputting pulses if the main loop locks up, or the ESP32 brows out (#3681). There should now be less servo jitter on these devices, although they can never be as good as the ESP32-based receivers which run the PWM output in hardware.
WebUI VBAT Calibration and Features
#3644 For receivers with built-in VBAT measurements, a calibration interface has been added to the webui to let you fix that 0.05V error that's been driving you nuts. Many receivers also get updated calibration values, and support was added for multiple simultaneous VBAT sensors.
Screen.Recording.2026-05-11.at.1.20.45.PM.mp4
The wifi signal strength is also shown now on the main information page (#3526), and the wifi password box got a revealer so all the friends you have gathered behind you can see your password as you type (#3590). And don't look now, there's also a favicon (#3606).
New Telemetry
- All VBAT-measuring receivers will also report millivolt-precision voltage as a new sensor e.g. 11.987V vs 12.0V.
- GPS Time sync using the new CRSF sensor type to set the handset time from a flight controller (e.g Betaflight 2026.06) (#3642) or a serial-connected GPS (#3662)
- HoTT protocol gets new Aspd sensor (#3528)
Core Refactoring for LR2021
Semtech's new 4th generation LoRa chip is now in production and much work has been done to better generalize our RF paths to support it. The new chip supports LoRa, FLRC, and FSK on both sub-Ghz and 2.4GHz bands, making it the first chip to support all current ExpressLRS modes. Full LR2021 support coming soon.
Minor Changes
- VTX Admin's "Band" field renamed to "Band/Enabled" and Off is renamed to Disabled, which will hide all the other VTX Admin fields
- Receiver will now refuse to change modes if the TX requests it to switch to a mode that it does not support. Previously, it would soft lock the connection because the two would be in incompatible modes #3610
- Wait until all channels have been received at least once before sending them to the flight controller. Previously a value of 0 was sent, which was ignored by all major flight controller softwares #3645
- Fix
Antenna Mode: Switchfavoring one antenna in 1:2 telemetry mode #3675 - For local builds, the last hardware config is saved per-target to save remembering the number #3449, 8225 firmwares are built with the file suffix the webui expects #3634, and vite testing can proxy data to a real piece of hardware #3487
- elrs.lua supports nesting folder more than 1 deep if needed #3474, 16/32 bit integer editing #3491, hiding irrelevant fields when in MAVLink mode #3565
- Support for "output only" buffered PWM pins #3624, OLED screen mirrored mode #3649
** Complete List **
- PWM ISR watchdog and ESP32 PWM stop on brownout #3681
- Remove isElrs distinction from CRSF parameter read/write #3680
- Only process/forward MAVLink messages which pass frame check #3679
- Fix: Antenna Mode Switch not working properly #3675
- Inhibit VBat telemetry in Mavlink mode #3670
- Load proper default product with mixed case #3665
- Add CRSF GPS Date/Time from Serial connected GPS #3662
- Remove unused small OLED hardware support #3661
- Fix verbose logging build #3660
- Implement screen mirror feature for OLED screens #3649
- Wait for all channels to have data before marking channel data available #3645
- Multiple Voltage Sources and Calibration UI #3644
- Add GPS Time (0x03), MAVLink parsing for GPS Time, Temp #3642
- Fix dynamic power headroom underflow when config power lowered while armed #3639
- Fix regression in band/modulation consolidation #3637
- VSCode: create compressed .bin.gz firmware file #3634
- MAVLink Capa Fix #3632
- Merge 4.x to master #3627
- Option in
hardware.jsonto set PWM pins as output-only #3624 - Separate FIFO locations for TX & RX on SX1280 #3620
- Fixes the joystick which broke in #3554 #3614
- Do not switch RX rate if RX cant do rate from SYNC packet #3610
- Hide VTXAdmin lua fields if disabled #3608
- Add favicons and improve feature flag handling and cleanup #3606
- Housekeeping: get rid of some magic numbers #3605
- Add logging when DCDC is enabled to the LR1121 and SX1280 drivers. #3598
- Add password revealer to WebUI WiFi page #3590
- Modulation/Band consolidation #3587
- PIO ini file cleanup/simplification #3586
- Simplify the flasher to only use the PIO env for target selection #3585
- Fix github build deprecation warnings #3584
- Reduce dynpower SNR down threshold #3577
- Fix web UI display of band information #3566
- Hide Switch & TLM screens when in MAVLink mode #3565
- Update devBLE.cpp -disable hat on BLE HID device #3561
- Add domain info to Lua Version string #3556
- Add MSP functions to get/set binding information #3554
- Fix ESP32 RGB: Prevent I2S MCLK Defaulting to GPIO0 #3552
- Reduce frequency of "Telemetry Lost" callout #3550
- Disable autoupload by default in PIO builds #3545
- RGB LED Fixes #3536
- Remove unused hardware settings #3535
- Misreporting FHSS in DEBUG_RCVR_LINKSTATS for LR1121 2G4 #3533
- Fix CI build so uploads for tags are not overwritten #3530
- WebUI / Add scripts to allow building WebUI artefacts under Windows VSCode/Pio #3529
- HoTT Telemetry / Add Aspd sensor for airspeed capable Vario and GPS devices #3528
- Add wifi signal information to webui #3526
- Refactor waveform_8266 for possibly tighter timings #3504
- Add support for int16/int32 to CRSF parameters #3491
- Allow vite to proxy requests to a real target #3487
- Don't write every byte of log messages individually #3479
- elrs.lua: Improvement to Folders/Sub-Folders #3474
- Save last UnifiedConfiguration as default for target #3449
- Mavlink dynamic sysIDv3 #3032
ExpressLRS 4.0.1
Changes since 4.0.0
- Fix SubGHz radios not showing the option to choose regulatory domain by @pkendall64 in #3532
- Separate FIFO locations for TX & RX on SX1280 by @pkendall64 in #3623
- Fix PDET ADC not starting by @CapnBry in #3626
- Fixes TX16S & Zorro having slightly higher output power than it should
- Fixes no-pulse failsafe not working on ESP32C3 by @frank26080115 in #3609
Full Changelog: 4.0.0...4.0.1
Who Should Update
All users on 4.0.0, especially those with SX1280 (2.4GHz) based receivers
ExpressLRS 3.6.4
Changes since 3.6.3
- ESP8285 PWM Refactor for v3 by @CapnBry in #3549
- More stable, less jittery servos
- Fix FM30 not enabling the DCDC due to use of an outdated/incorrect
#define. by @hydra in #3595 - Fix radios with PDET blasting output power by @CapnBry in #3625
- Fixes TX16S & Zorro having slightly higher output power than it should
Full Changelog: 3.6.3...3.6.4
Who Should Update
- Users experiencing servo jitter with ESP8285 PWM receivers
- Siyi FM30, HRS V16, RM TX16s MK1/2, RM Zorro users
ExpressLRS 4.0.0
Compatibility
Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Fullres packet modes users in 8ch and 12ch mode will find CH9 or CH13 missing, and Arm moved to CH14. See "Optional Arming Method" below.
Any custom hardware.json and options.json (set from the webui Options tab) will be lost due to the flash filesystem update, back them up before updating. See "Flash Filesystem Changed".
When installing the elrs.lua to your handset, be sure to delete the existing elrsV3.lua and elrsV3.luac to not have two tools show up as ExpressLRS. The newest elrs.lua works with all ExpressLRS versions back to 2.0.
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.

Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.

Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch or 13ch but now generate exactly the number of full resolution channels specified and CH5 is always a full channel. Users may shift CH6+ down by one or use a higher channel count to account for the change. CH14 now carries the 1 bit arming flag in 8ch and 12ch mode.
Expanded PWM receiver output offerings
- You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
- Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
- DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
- K1000 2.4 ➡️ 1000Hz FSK (module baud rate must be 921k or higher)
- DK250 2.4 ➡️ 250Hz DVDA FSK
- D50 LoRa 900 ➡️ 50Hz DVDA
- 25Hz LoRa 900 ➡️ 25Hz LoRa 900
Flash Filesystem Changed
The internal flash filesystem has been changed from the deprecated SPIFFS to LittleFS. There is no way to upgrade the filesystem in place. This means custom changes made on the old hardware.html page will be erased during the upgrade, along with items from the Options tab in the webui (receiver baud, airport, wifi and regulatory domain overrides, etc). The hardware.json can be downloaded from the webui before updating and then replaced after updating. PWM mappings and serial protocols are not affected.
Minor changes
- Backpack is now disabled in wifi and BLE modes
- Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
- TQly telemetry item now samples the last 100 telemetry receives, up from 25
- Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
- Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the future we hope this will allow EdgeTX to display more TX status information while disconnected.
- Lua r16 - Now labeled elrs.lua, contains bugfixes but old r15 or whatever is on your handset is probably fine.
Complete List
- Fix crash in CRSF parser with CRSF packet length 0 #3429
- Use invalid CRSF value to differentiate from an actual 0 ChannelData value #3405
- Extended pwm failsafe values #3394
- HoTT TLM / Support VSpeak turbine protocol #3382
- Upgraded Web UI #3381
- CRSF handling on the transmitter side #3378
- Remove redundant tlmConfirm bit in OTA, increasing tlm bandwidth #3377
- Allow arbitrary number of headtrack channels #3373
- Change TQly counter to 100 items #3370
- Fix DEBUG_INIT not working, unify logger name, simplify some log msgs #3369
- Always send LinkStats to handset #3367
- Allow secondary CRSF port to send RC data #3364
- Atomic channel data updates #3363
- Platform upgrade #3341
- Statistical Adaptive SNR Thresholds #3302
- Wide switch mode always 6 bit, boost to 1:2 #3295
- Add OtaNonce to OtaCrcInitializer #3294
- CRSF rewrite to be 'more' spec compliant #3198
- Dshot 3D mode, allowing for both forward and reverse rotation #3139
- Support directly-attached GPS inputs to RX #3086
- Mavlink to Ardupilot Custom Telemetry CRSF translation for Yaapu Telemetry Script #3077
- Pass HeadTracking Pan/Tilt/Roll back to EdgeTX #3076
- Backpack device...
ExpressLRS 4.0.0-RC4
Changes Since RC1
- Config upgrade from 3.3.x not properly upgrading PWM channels #3505
- Webui missing
RFO_HF enabledon LR1121 #3502 - Only show "RF Band" in Lua if hardware permits #3501
- Fix GPS Lat/Lon parser for coordinates <10° or >99° #3500
- Fix S3 USB passthrough flashing backpack #3497
- Handle broadcast routing in deliverMessageTo (fix VTXAdmin) #3483
- Add missing fields from model export/import file #3482
- Fix PPM/CRSF auto detect for RX-as-TX #3481
- Fix Gemini 2.4GHz K modes due to FEC buffer initialization #3473
- Unify code for setting link parameters, fixes no telemetry in X modes #3472
- Fix TFT/OLED displayed packet rates for single band LR1121 #3468
- RC3 ⬇️
- Fix for PWM receivers not showing the connection page in the Web UI #3467
- RC2 ⬇️
- Only use the low bit of the extended channels packet for arm status #3461
- Extend VTX Admin disconnect debounce #3459
- Prevent POWER_VALUES OOB array access #3458
- Ensmallen 8266 firmware binary, switch to LittleFS for all #3457
- Remove reference to 750us servo mode in webui #3452
- Can't bind RX after RX had connection #3450
- Set LQ=0 when handset disconnects #3447
- Dual band binding happening on wrong rate TX/RX #3446 #3448
- Only use the default UART0 for passthrough flashing #3442
- Fix broken I2C on 8285 based receivers #3440
- Extend TcpMspConnector idle timeout #3437
- Proper packet rate config migration for LR1121 #3439
- Move from version-labeled lua to just elrs.lua #3436
- Wrong feature flags names being used in webui hardware page #3434
- Add isArmed as CH14 #3433
Compatibility
Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Fullres packet modes users in 8ch and 12ch mode will find CH9 or CH13 missing, and Arm moved to CH14. See "Optional Arming Method" below.
Any custom hardware.json and options.json (set from the webui Options tab) will be lost due to the flash filesystem update, back them up before updating. See "Flash Filesystem Changed".
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.

Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.

Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch or 13ch but now generate exactly the number of full resolution channels specified and CH5 is always a full channel. Users may shift CH6+ down by one or use a higher channel count to account for the change. CH14 now carries the 1 bit arming flag in 8ch and 12ch mode.
Expanded PWM receiver output offerings
- You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
- Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
- DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
- K1000 2.4 ➡️ 1000Hz FSK (module baud rate must be 921k or higher)
- DK250 2.4 ➡️ 250Hz DVDA FSK
- D50 LoRa 900 ➡️ 50Hz DVDA
- 25Hz LoRa 900 ➡️ 25Hz LoRa 900
Flash Filesystem Changed
The internal flash filesystem has been changed from the deprecated SPIFFS to LittleFS. There is no way to upgrade the filesystem in place. This means custom changes made on the old hardware.html page will be erased during the upgrade, along with items from the Options tab in the webui (receiver baud, airport, wifi and regulatory domain overrides, etc). The hardware.json can be downloaded from the webui before updating and then replaced after updating. PWM mappings and serial protocols are not affected.
Minor changes
- Backpack is now disabled in wifi and BLE modes
- Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
- TQly telemetry item now samples the last 100 telemetry receives, up from 25
- Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
- Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the fu...
ExpressLRS V3.6.3
Changes since 3.6.2:
Bugfixes
- Allows updating backpack firmware via USB on S3 #3496
- Fix some STM32 builds because of PIO changes #3495
- Fix SPI clock rate for 80MHz STM32L432 devices #3493
- Disable PA when disabling TX & RX on ESP8285 #3485
- Extend VTX Admin disconnect debounce V3 #3460
- Extend tcpsocket idle timeout V3 #3444
- Only use the default UART0 for passthrough flashing #3441
- Fix LR1121 not committing power change when switching band V3 #3431
- Fix crash in CRSF parser with CRSF packet length 0 - V3 #3430
Other fixes and improvements
Compatibility
This is a bugfix/patch release and is compatible with earlier 3.x versions.
Who should update from V3.6.2?
These are all backports from bugs found during 4.0.0-RC1 testing and seek to improve stability and performance for users experiencing:
- Rotorflight Configurator over wifi frequently disconnects before the tab can load
- Poor wifi / bluetooth connection stability caused by backpack being active when in these modes
- Telemetry stops updating when used with external telemetry sensors that generate malformed packets connected to the receiver
- SPI receivers constant connect/disconnect cycles due to VTX Admin on connect
- Note! elrs.lua from V4.0.0-RC2 (r16) can be used with 3.x as well. The version number has been removed and is compatible with ExpressLRS 2.x, 3.x, and 4.x
ExpressLRS V4.0.0-RC3
Changes Since RC1
- Fix for PWM receivers not showing the connection page in the Web UI #3467
- Only use the low bit of the extended channels packet for arm status #3461
- Extend VTX Admin disconnect debounce #3459
- Prevent POWER_VALUES OOB array access #3458
- Ensmallen 8266 firmware binary, switch to LittleFS for all #3457
- Remove reference to 750us servo mode in webui #3452
- Can't bind RX after RX had connection #3450
- Set LQ=0 when handset disconnects #3447
- Dual band binding happening on wrong rate TX/RX #3446 #3448
- Only use the default UART0 for passthrough flashing #3442
- Fix broken I2C on 8285 based receivers #3440
- Extend TcpMspConnector idle timeout #3437
- Proper packet rate config migration for LR1121 #3439
- Move from version-labeled lua to just elrs.lua #3436
- Wrong feature flags names being used in webui hardware page #3434
- Add isArmed as CH14 #3433
Compatibility
Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Fullres packet modes users in 8ch and 12ch mode will find CH9 or CH13 missing, and Arm moved to CH14. See "Optional Arming Method" below.
Any custom hardware.json and options.json (set from the webui Options tab) will be lost due to the flash filesystem update, back them up before updating. See "Flash Filesystem Changed".
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.

Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.

Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch or 13ch but now generate exactly the number of full resolution channels specified and CH5 is always a full channel. Users may shift CH6+ down by one or use a higher channel count to account for the change. CH14 now carries the 1 bit arming flag in 8ch and 12ch mode.
Expanded PWM receiver output offerings
- You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
- Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
- DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
- K1000 2.4 - 1000Hz FSK (module baud rate must be 921k or higher)
- DK250 2.4 - 250Hz DVDA FSK
- D50 LoRa 900 - 50Hz DVDA
- 25Hz LoRa 900 - 25Hz LoRa 900
Flash Filesystem Changed
The internal flash filesystem has been changed from the deprecated SPIFFS to LittleFS. There is no way to upgrade the filesystem in place. This means custom changes made on the old hardware.html page will be erased during the upgrade, along with items from the Options tab in the webui (receiver baud, airport, wifi and regulatory domain overrides, etc). The hardware.json can be downloaded from the webui before updating and then replaced after updating. PWM mappings and serial protocols are not affected.
Minor changes
- Backpack is now disabled in wifi and BLE modes
- Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
- TQly telemetry item now samples the last 100 telemetry receives, up from 25
- Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
- Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the future we hope this will allow EdgeTX to display more TX status information while disconnected.
- Lua r16 - Still labeled elrsv3.lua for now, contains bugfixes but old r15 or whatever is on your handset is probably fine.
Complete List
- Fix crash in CRSF parser with CRSF packet length 0 #3429
- Use invalid CRSF value to differentiate from an actual 0 ChannelData value #3405
- Extended pwm failsafe values #3394
- HoTT TLM / Support VSpeak turbine protocol #3382
- Upgraded Web UI #3381
- CRSF handling on the transmitter side #3378
- Remove redundant tlmConfirm bit in OTA, increasing tlm bandwidth #3377
- Allow arbitrary number of headtrack channels #3373
- Change TQly counter to 100 items #3370
- Fix DEBUG_INIT not working, unify logger name, simplify ...
ExpressLRS 4.0.0-RC2
Changes Since RC1
- Only use the low bit of the extended channels packet for arm status #3461
- Extend VTX Admin disconnect debounce #3459
- Prevent POWER_VALUES OOB array access #3458
- Ensmallen 8266 firmware binary, switch to LittleFS for all #3457
- Remove reference to 750us servo mode in webui #3452
- Can't bind RX after RX had connection #3450
- Set LQ=0 when handset disconnects #3447
- Dual band binding happening on wrong rate TX/RX #3446 #3448
- Only use the default UART0 for passthrough flashing #3442
- Fix broken I2C on 8285 based receivers #3440
- Extend TcpMspConnector idle timeout #3437
- Proper packet rate config migration for LR1121 #3439
- Move from version-labeled lua to just elrs.lua #3436
- Wrong feature flags names being used in webui hardware page #3434
- Add isArmed as CH14 #3433
Compatibility
Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Fullres packet modes users in 8ch and 12ch mode will find CH9 or CH13 missing, and Arm moved to CH14. See "Optional Arming Method" below.
Any custom hardware.json and options.json (set from the webui Options tab) will be lost due to the flash filesystem update, back them up before updating. See "Flash Filesystem Changed".
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.

Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.

Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch or 13ch but now generate exactly the number of full resolution channels specified and CH5 is always a full channel. Users may shift CH6+ down by one or use a higher channel count to account for the change. CH14 now carries the 1 bit arming flag in 8ch and 12ch mode.
Expanded PWM receiver output offerings
- You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
- Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
- DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
- K1000 2.4 - 1000Hz FSK (module baud rate must be 921k or higher)
- DK250 2.4 - 250Hz DVDA FSK
- D50 LoRa 900 - 50Hz DVDA
- 25Hz LoRa 900 - 25Hz LoRa 900
Flash Filesystem Changed
The internal flash filesystem has been changed from the deprecated SPIFFS to LittleFS. There is no way to upgrade the filesystem in place. This means custom changes made on the old hardware.html page will be erased during the upgrade, along with items from the Options tab in the webui (receiver baud, airport, wifi and regulatory domain overrides, etc). The hardware.json can be downloaded from the webui before updating and then replaced after updating. PWM mappings and serial protocols are not affected.
Minor changes
- Backpack is now disabled in wifi and BLE modes
- Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
- TQly telemetry item now samples the last 100 telemetry receives, up from 25
- Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
- Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the future we hope this will allow EdgeTX to display more TX status information while disconnected.
- Lua r16 - Still labeled elrsv3.lua for now, contains bugfixes but old r15 or whatever is on your handset is probably fine.
Complete List
- Fix crash in CRSF parser with CRSF packet length 0 #3429
- Use invalid CRSF value to differentiate from an actual 0 ChannelData value #3405
- Extended pwm failsafe values #3394
- HoTT TLM / Support VSpeak turbine protocol #3382
- Upgraded Web UI #3381
- CRSF handling on the transmitter side #3378
- Remove redundant tlmConfirm bit in OTA, increasing tlm bandwidth #3377
- Allow arbitrary number of headtrack channels #3373
- Change TQly counter to 100 items #3370
- Fix DEBUG_INIT not working, unify logger name, simplify some log msgs #3369
- Always send LinkStats to handset #3367
- Allow seco...
ExpressLRS V4.0.0-RC1
Compatibility
Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.

Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.

Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch and 13ch respectively but now generate exactly the number of channels specified.
Expanded PWM receiver output offerings
- You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
- Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
- DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
- K1000 2.4 - 1000Hz FSK (module baud rate must be 921k or higher)
- DK250 2.4 - 250Hz DVDA FSK
- D50 LoRa 900 - 50Hz DVDA
- 25Hz LoRa 900 - 25Hz LoRa 900
Minor changes
- Backpack is now disabled in wifi and BLE modes
- Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
- TQly telemetry item now samples the last 100 telemetry receives, up from 25
- Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
- Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the future we hope this will allow EdgeTX to display more TX status information while disconnected.
- Lua r16 - Still labeled elrsv3.lua for now, contains bugfixes but old r15 or whatever is on your handset is probably fine.
Complete List
- Fix crash in CRSF parser with CRSF packet length 0 #3429
- Use invalid CRSF value to differentiate from an actual 0 ChannelData value #3405
- Extended pwm failsafe values #3394
- HoTT TLM / Support VSpeak turbine protocol #3382
- Upgraded Web UI #3381
- CRSF handling on the transmitter side #3378
- Remove redundant tlmConfirm bit in OTA, increasing tlm bandwidth #3377
- Allow arbitrary number of headtrack channels #3373
- Change TQly counter to 100 items #3370
- Fix DEBUG_INIT not working, unify logger name, simplify some log msgs #3369
- Always send LinkStats to handset #3367
- Allow secondary CRSF port to send RC data #3364
- Atomic channel data updates #3363
- Platform upgrade #3341
- Statistical Adaptive SNR Thresholds #3302
- Wide switch mode always 6 bit, boost to 1:2 #3295
- Add OtaNonce to OtaCrcInitializer #3294
- CRSF rewrite to be 'more' spec compliant #3198
- Dshot 3D mode, allowing for both forward and reverse rotation #3139
- Support directly-attached GPS inputs to RX #3086
- Mavlink to Ardupilot Custom Telemetry CRSF translation for Yaapu Telemetry Script #3077
- Pass HeadTracking Pan/Tilt/Roll back to EdgeTX #3076
- Backpack device refactor #3075
- Device/event framework optimisation #3049
- Communicate Rx available antenna mode to the Tx #3039
- Double MSP (TLM and MAVLink) throughput for Gemini hardware #3037
- STM32 removal #3033 #3027 #3016 #2960 #2956
- Permanently arm DJI (or other MSP displayport) air units using an RX #3028
- Adds optional arming method and provides contiguous proportional channels for all full-res modes #3008
- Auto configure Rx OTA protocol from the Tx #2994
- Auto set True Diversity Rx into Diversity or Gemini mode based on Tx antenna mode #2993
- Add tlmConfirm to tlm_dl ota packet-structure #2991
- set OtaCrcInitializer to OTA_VERSION_ID during binding #2983
- Reduce jitter for CRSF RC packets on the receiver #2943
- Disable backpack in wifi and BLE modes #2940
- Fix ESP32 based PWM receivers in debug mode #2939
- Update OTA_VERSION_ID to V4 #2933
- Send RF Mode Enum in place of RF Index in the Sync packet #2932
- Split RC data sending from polling and queued data sending V4.0 #2931
- Arm DJI O3 directly from an ELRS receiver #2926
- Servo stretch feature for wider range servo PWM pulses #2773
- D modes for Team900 #2089

