Feature Configuration
The Feature Configuration page controls modules that were compiled into the firmware. Settings are stored in LittleFS at /config/features.json and take effect after Save and Restart.
Activation Rules
compiled AND userEnabled AND budgetPassed AND NOT runtimeDisabled| Field | Meaning |
|---|---|
compiled | The firmware contains the feature code |
userEnabled | The user enabled the feature |
budgetPassed | The startup DRAM/PSRAM budget check passed |
runtimeDisabled | Runtime memory protection temporarily stopped the feature |
active | The feature and all dependencies are currently available |
locked | The build or partition cannot support the feature |
deferred | Initialization is waiting for the network |
If memory is insufficient, initialization is skipped, a [BUDGET] message is logged, and /api/system/status reports no-memory. The budget is evaluated again at restart.
Core management entries such as Device Config, Network Config, and Feature Configuration remain visible. An optional feature menu is visible only when the feature is compiled and active. A feature excluded from the build is locked and labeled Not compiled into firmware.
Memory Degradation
At SEVERE memory pressure, the system keeps network and Web management available first. MQTTS falls back to MQTT, while Modbus, Peripheral Exec workers and timers, scripts, and memory-heavy optional peripherals may pause. Their JSON configuration is not deleted. Services are rebuilt when memory recovers.
If pressure remains CRITICAL, MQTT may be persistently disabled. Save and enable it again from Protocol Configuration after resolving the memory shortage.
Release Defaults
Release environments share a common feature baseline, with hardware-specific overrides for capabilities such as OTA and IR.
| Group | Feature Keys | Default | Notes |
|---|---|---|---|
| Network | webServer, mdns | On | Keeps the management entry available |
| Peripherals | lcd, neopixel, sevenSegment, ds18b20 | Off | Enable only with matching hardware |
| Peripherals | lcdGb2312, i2cSensors, rfid, irRemote, rfLearn, ds1302, lcd1602 | Off | Depends on LCD, I2C, SPI, RMT, or three-wire hardware |
| Protocols | modbus, mqtts | Off | MQTTS depends on MQTT; Modbus needs UART/RS485 |
| Automation | ruleScript, commandScript | Off | commandScript depends on ruleScript |
| System | deviceControl, ota, logViewer, fileLogging, userAdmin | Off | OTA also requires an A/B partition |
| Network extensions | ethernet, cellular, ble | Off | Requires matching hardware; BLE is not a release path |
Use the page or /api/features/status as the source of truth for the current build. The 4MB environments lock OTA. esp32-F4R0, esp32c3-F4R0, esp32c6-F4R0, and esp32c6-F8R0 do not compile Ethernet or Cellular support.
Apply a Change
- Open Feature Configuration in the device Web console.
- Check the compile state and hardware dependency before enabling a feature.
- Save and restart the device.
- Confirm
activeand review Health Monitor after restart.
Runtime switches do not reduce the firmware image size. Flash-size reduction requires changing build flags in platformio.ini and rebuilding the firmware and Web assets.
features.json stores the complete requested state. A legacy sparse file keeps its existing choices and is expanded after the first successful load. Use configuration export/import for migration instead of editing a live filesystem.
API Summary
| Endpoint | Purpose |
|---|---|
GET /api/features/status | Return feature states and the resource summary |
POST /api/features/config | Save switches without restarting |
POST /api/features/estimate | Estimate Flash/RAM use without saving |
POST /api/features/apply | Save settings and schedule a restart |
Clients should wait for a successful apply response, then poll /api/health. A network-dependent feature may temporarily report deferred during startup. Low-memory Web requests may return 503; honor Retry-After before retrying.

