WLED Error Codes: What Error 7, 8, 9, 12, 19 and 91 Mean and How to Fix Them
Every error code WLED defines, from 1 to 101: what the web UI message means, what triggers it in the firmware, and the fix. Plus 'issue loading your presets'.
Written by Jamie Conde, who builds WLED Max at MeowScript. WLED Max is an independent app and is not affiliated with or endorsed by the official WLED project.
WLED shows errors as a short red banner at the bottom of the web page, like Error 8: Effect RAM depleted! The number comes from a list in the firmware (wled00/const.h), and the text next to it is all the explanation you get. This page goes through every code that list defines, what really sets it off, and what to do about it.
The codes people search for most come first. The full table is further down.
The banner shows once. WLED hands the error to the first page or app that asks the light for its state, then clears it. If Home Assistant or a phone app is polling the light, it can pick the error up first, and your browser never shows it. Reload the page right after the problem happens if you want to see the code.
Error 7: No RAM for buffer
WLED 16 only. The light tried to reserve memory for a segment’s pixels and there wasn’t enough. WLED then switches that segment off, which is why people often report this as “my segment disappeared”.
What causes it:
- Too many LEDs for the chip, usually an ESP8266 or a large 2D matrix.
- Many segments, each with its own buffer.
- An image or GIF on a 2D matrix, on builds that can play them. Images need memory too.
The fix: lower the LED count, merge segments you don’t need, or move big setups to an ESP32. Boards with PSRAM (many ESP32-S3 boards, and ESP32 WROVER modules) have far more room, because WLED 16 puts pixel buffers in PSRAM when it can.
Error 8: Effect RAM depleted
WLED 0.15 and 16. An effect asked for working memory (the scratch space effects like Fire 2012 or the particle effects use) and didn’t get it. WLED caps the total effect memory across all segments (on 0.15 on every board, on 16 only on boards without PSRAM), so one heavy effect on each of several segments can hit the cap even when the light looks idle.
WLED 16 uses the same code for two more situations, and both are worth knowing:
- Memory stayed low for 15 seconds. WLED switches every segment to Solid to free memory and shows error 8. If memory stays low for 30 seconds it removes all but one segment, and at 45 seconds it rebuilds the LED strip from scratch and reconnects Wi-Fi.
- An LED output needs more memory than WLED allows. That output gets added as a placeholder, so the LEDs on it stay dark. You see error 8 after saving LED settings.
The fix: use lighter effects (Solid, Solid Pattern and Breathe need no effect memory at all), fewer segments running heavy effects at once, or fewer LEDs per output. If your segments keep turning into Solid by themselves, this is almost always why.
Error 9: JSON parsing error
All versions (the banner text appears from 0.15 on). Something sent the light JSON it couldn’t read, and the request was refused with HTTP 400. Nothing changed on the light.
The usual reasons:
- Curly quotes. You copied a command from a notes app or a chat, and
"became“and”. iPhones do this by default with Smart Punctuation. Paste into a plain text editor first, or retype the quotes. - A trailing comma, single quotes or a comment. JSON allows none of them.
- The request is too big. The JSON buffer is about 10 KB on ESP8266 and 24 to 32 KB on ESP32, and a preset with many segments or a long list of individual LED colors can go over and fail to parse.
- On WebSocket connections, a message that arrives split into several packets. WLED doesn’t put those back together and answers error 9.
If you’re typing a preset by hand in the web UI, the preset editor catches most of these before they reach the light: you get “Syntax error in custom JSON API command” instead of error 9.
Error 12: Preset not found
All versions. Something asked the light to load a preset slot that doesn’t exist. It happens all the time after you delete or renumber presets, because nothing in WLED updates the things that point at them:
- Apply preset at boot in Config›LED & Hardware (LED Preferences on 0.14 and 0.15).
- Timers, button actions and the Alexa presets in Config > Time & Macros.
- Entries inside a playlist.
- Home Assistant automations, scripts or a remote that send
{"ps":N}.
Check each of those for the slot number in the error. If the slot is there and you still get error 12, the presets file itself may be damaged; see “issue loading your presets” below.
More on boot presets and slots in WLED presets and the power-on preset.
Error 19: A filesystem error has occurred
All versions. A general file system failure. In the current source it comes from one place: WLED tries to create an empty presets.json (at startup, or when you save a preset and the file has gone missing), and the file couldn’t be written. On 0.14 and 0.15 builds compiled with EEPROM support it can also show up when old presets from a very early WLED (the EEPROM days) fail to convert.
So error 19 means the flash can’t be written. Usually it’s full, sometimes the file system is damaged after a power cut during a write.
What to try, in order:
- Back up what you can: Config > Security & Updates > Backup configuration, and Backup presets if it works.
- Free space by deleting presets or files you uploaded (ledmaps, images, custom palettes).
- If it keeps coming back, do a factory reset (same page, tick Factory reset and save, which erases all settings and presets) or reflash from install.wled.me, then restore your backups.
Error 91: Brownout Restart
WLED 16, ESP32 boards only. The chip restarted because its supply voltage dropped too low. WLED reads the reset reason at boot and shows 91 on the next page load. On an ESP8266 a brownout looks like any other power loss, so you’ll never see 91 there, and 0.14 and 0.15 don’t report it at all.
With LED strips, the cause is almost always power:
- The power supply is too small for the LEDs at the brightness you use. Full white is the worst case.
- Thin or long wires between the supply and the controller, so the voltage sags when the LEDs get bright.
- The controller runs from a laptop USB port or a weak phone charger.
- No brightness limit is set.
The fix: set Maximum PSU Current (Maximum Current on 0.14) on the LED settings page so WLED limits brightness to what your supply can deliver, inject power at both ends of long runs, and use a supply with some headroom (about 20% above what you calculate). Numbers and screenshots are in WLED settings from your phone. If your light also drops off the network now and then, read why WLED goes offline too.
Error 90: Unexpected Restart
WLED 16. The light crashed or its watchdog reset it, and it says so after rebooting. One 90 now and then isn’t worth chasing.
If it crashes again and again, WLED 16 (and 0.15.5) steps in by itself. After 5 crashes, each within two minutes of the last, it treats it as a boot loop and tries, one step per loop: restore the last good configuration backup, then reset the configuration, then (ESP32 only) boot the firmware that was installed before the last update. So if your settings look different after a run of restarts, that’s why.
Common triggers are an effect or usermod that’s too heavy for the board, wrong LED settings (pins, type or count) and power problems that don’t quite count as a brownout. If it started right after a firmware update, see updating WLED over the air.
“Sorry, there was an issue loading your presets!”
This one has no number. The web UI shows it in the Presets tab when it can’t read presets.json, either because the light didn’t answer or because the file isn’t valid JSON anymore (a power cut during a save can do that).
- Open
http://<your-light-ip>/presets.jsonin a browser. If you see your presets, the file is fine and it was a connection hiccup. Reload the page. - If the browser you normally use has seen your presets before, the message also shows “Here is a backup of the last known good state” with a Copy to clipboard button (and a Restore button from 0.15 on). That backup lives in the browser, not on the light. Copy it somewhere safe first, then restore.
- Otherwise restore a saved
presets.jsonunder Config > Security & Updates > Restore presets. That replaces everything in the file.
Making a habit of backing up the config and presets turns this from a bad evening into a two minute fix.
Every WLED error code
| Code | Web UI text | What it means | Versions |
|---|---|---|---|
| 1 | Denied! | A settings change was refused because a settings PIN is set and wasn’t entered | all (text from 0.15) |
| 2 | (none) | 0.14: an old EEPROM code, unused. 0.15 and 16: “concurrency”, defined but never raised | none in practice |
| 3 | Buffer locked! | The light was busy with another JSON request | all |
| 4 | (blank) | Not implemented: a /json/... address the light doesn’t know, or on 16 a 2D-only effect on a 1D strip or a 1D particle effect on a one-LED segment, or a broken font file for scrolling text | 0.15, 16 |
| 7 | No RAM for buffer! | Not enough memory for a segment’s pixels | 16 |
| 8 | Effect RAM depleted! | Not enough memory for an effect, or (16) low memory or an LED output too big | 0.15, 16 |
| 9 | JSON parsing error! | The light received JSON it couldn’t read | all |
| 10 | Could not mount filesystem! | The flash file system didn’t start | all |
| 11 | Not enough space to save preset! | The file system is full | all |
| 12 | Preset not found. | A preset slot was requested that doesn’t exist | all |
| 13 | Missing ir.json. | An IR remote set to JSON mode sent a code, but ir.json isn’t on the light | all |
| 14 | (none) | Missing remote.json; the check is commented out, so it never fires | none in practice |
| 19 | A filesystem error has occured. | General file system failure, usually creating presets.json | all |
| 30, 31, 32 | (none) | Over temperature, over current, under voltage. Marked “not implemented” in the source | none in practice |
| 33 to 37 | (none) | Low memory codes defined in 16 but not raised yet (their web UI text is commented out) | none in practice |
| 90 | Unexpected Restart. | The light rebooted after a crash or watchdog reset | 16 |
| 91 | Brownout Restart. | The light rebooted because its supply voltage dropped | 16, ESP32 |
| 100 | Note 100: Please reboot WLED to activate changed settings. | A hardware setting needs a restart (on 16.0.1: HUB75 panel changes on ESP32-S3) | 16 |
| 101 | Note 101: Please switch your device off and back on. | A hardware setting needs a power cycle; defined, not used yet in 16.0.1 | 16 |
The web UI on 0.14 only has text for 10, 11, 12, 13 and 19, so any other code shows as “Error N:” with nothing after it. The same happens with error 4 on newer versions. The typo in “occured” is in the firmware.
The rest, briefly
Error 1 (Denied). You set a PIN under Config > Security & Updates and something tried to change settings without it. Enter the PIN in the web UI, or in the app or script that’s writing.
Error 3 (Buffer locked). WLED handles one JSON request at a time. On 0.15 a second request that arrives meanwhile gets HTTP 503 with error 3 (on 0.14 only reads do; a write just gets no answer). WLED 16 makes HTTP requests wait instead, but WebSocket clients can still get error 3. If you see it often, something is polling hard: a Home Assistant integration, several open browser tabs and an app at the same time. Close what you don’t need.
Error 10 (Could not mount filesystem). Usually the firmware was flashed with the wrong flash layout for the board, or the flash chip is failing. Reflash with the web installer and let it erase the board first. You lose settings and presets, so restore them from a backup. In practice a failed mount usually shows as error 19, because WLED immediately tries to create presets.json and that fails too.
Error 11 (Not enough space). WLED only saves a preset if there’s room for a full copy of the file plus about 9 KB. An ESP8266 with lots of presets that store segment layouts runs out first. Delete presets you don’t use, or remove uploaded files you no longer need.
Error 13 (Missing ir.json). The IR receiver is set to the “JSON remote” type in Config > LED & Hardware (LED Preferences on 0.14 and 0.15), but no ir.json was uploaded. Upload one, or pick your remote’s model in the list.
Messages from apps
Apps don’t show WLED’s numbers. They have their own wording, and two messages in WLED Max (iOS and Android) come straight from firmware states:
- “The device is busy and didn’t accept the change.” The light kept answering with error 3, and the app gave up after retrying. Wait a few seconds and try again, and look for something else polling the light.
- “The device sent an unexpected response. It may be running an incompatible firmware version.” The light answered, but with an HTTP error or a reply the app couldn’t use. That can be a very old WLED, a different firmware entirely, or a light that restarted in the middle of the request.
The app also checks presets.json before it changes it. If the file is damaged it won’t overwrite it and offers to save a copy of the raw file instead (iOS: Save a Copy of the File; Android: Back up raw file in the warning, or Save a Copy of the File in the Presets tab).
If the light doesn’t answer at all, that’s a network problem rather than a WLED error, and WLED app can’t find your lights goes through the causes.
FAQ
Where is the list of WLED error codes? In wled00/const.h in the WLED source, next to the ERR_ names. The web UI’s text for each one is in wled00/data/index.js.
Does an error mean my board is broken? Rarely. Most codes are about memory (7, 8), presets (12) or power (91). Errors 10 and 19 that keep coming back after a reflash are the ones that point at the hardware.
Why does the error disappear when I reload? WLED clears the error after reporting it once. It only comes back if the problem happens again.