Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/about/contributors.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ This page is to honor the work of all the people who helped to make WLED what it
### Direct Contributors to WLED code

Everyone you see on the Contributors page and:
8bitbrett made the WiFi auto connect QR code with the Aircoookie/WLED logo!
8bitbrett made the WiFi auto connect QR code with the wled/WLED logo!
adamo made the animated Discord server logo!
[@blazoncek](https://github.com/blazoncek) makes countless new features and improvements to many parts of WLED!
[@debsahu](https://github.com/debsahu) provided the HomeAssistant autodiscovery and a lot of help with PIO!
Expand Down
5 changes: 4 additions & 1 deletion docs/about/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,8 @@ hide:
# - toc
---

Please check our [WLED milestone planning](https://github.com/wled/WLED/milestones) for upcoming features and releases.
**WLED v0.16.0** was released on 3 May 2026. See the [v16.0.0 release notes](https://github.com/wled/WLED/releases/tag/v16.0.0) for the full list of new features.

For features planned in upcoming versions, check the [WLED milestone planning](https://github.com/wled/WLED/milestones) on GitHub.
There is no guarantee if and when a new feature or bugfix will be available!

2 changes: 1 addition & 1 deletion docs/advanced/HUB75.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: HUB75 support
---

WLED now features support for LED matrix panels using the HUB75 format
WLED now features support for LED matrix panels using the HUB75 format. HUB75 support was added as an official mainline feature in **v0.16.0** — dedicated `_HUB75` build variants are included in the standard release downloads.

You can use either a regular ESP32 with a suitable adapter board such as Huidu HD-WF2, [ESP32 Trinity](https://esp32trinity.com/), [MoonHub75](https://github.com/MoonModules/Hardware/tree/main/MOONHUB75), [rorosaurus/esp32-hub75-driver](https://github.com/rorosaurus/esp32-hub75-driver) or the dedicated [Adafruit Matrix Portal S3](https://www.adafruit.com/product/5778)

Expand Down
178 changes: 137 additions & 41 deletions docs/advanced/audio-reactive.md

Large diffs are not rendered by default.

65 changes: 65 additions & 0 deletions docs/advanced/bootloop-recovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
title: Boot-loop Detection & Recovery
---

WLED can detect when your controller is stuck in a crash loop and automatically take steps to recover it — without you needing a USB cable or serial terminal. This feature is especially useful after a bad settings change, a corrupted config file, or a failed OTA update.

---

## What Counts as a Boot-loop?

WLED counts **crash resets** stored in RTC memory (which survives a soft reboot). A crash reset is any of these reset reasons:

- Exception / software exception
- Hardware watchdog timeout
- Software watchdog timeout
- Panic / abort
- Task watchdog timeout

Normal power-on resets and clean software restarts reset the counter to zero. Brownout resets are logged but **do not** increment the counter.

If **5 or more crashes** happen within a **2-minute rolling window**, WLED considers the device stuck in a boot-loop and triggers the recovery sequence.

---

## Recovery Sequence

Recovery actions are taken **one per boot**, in order. After each action WLED restarts immediately. If the device still crashes after that restart, the next action is taken on the following boot.

| Step | Action | What it does |
|---|---|---|
| **1** | Restore backup config | Copies `/bkp.cfg.json` back over `/cfg.json` — rolls back to the last known-good configuration. |
| **2** | Reset config | Renames `/cfg.json` to `/rst.cfg.json` and starts WLED with factory defaults. Your old config is preserved in `/rst.cfg.json` for manual recovery. |
| **3** | Firmware rollback *(ESP32 only)* | Swaps the OTA boot partition to the previous firmware image. Useful after a bad OTA update. On ESP8266 this step is skipped. |
| **4** | Emergency serial dump | Dumps all filesystem files to the serial port and then **loops indefinitely**. WLED will not start normally again until you power-cycle or hardware-reset the board. Connect a serial terminal at 115200 baud to retrieve the files. |

!!! warning
Step 4 is the last resort. WLED stops booting and only outputs to serial. A hardware reset (power cycle or the RST button) is required to exit this state.

---

## How the State Is Stored

The crash counter and recovery progress are stored in **RTC memory**, which persists across soft reboots but is cleared by a power cycle or hardware reset.

- **ESP32:** uses `RTC_NOINIT_ATTR` static variables (three values: last boot timestamp, crash count, recovery step).
- **ESP8266:** uses `RTC_USER_MEM` slots 32–34 (same three values).

This means:

- Pulling the power clears the counter — the device starts fresh on the next boot.
- A clean software restart from the WLED UI also clears the counter.

---

## Where This Runs

Boot-loop detection runs very early in startup (`WLED::setup()`), right after the filesystem is mounted and before any configuration is loaded. This ensures recovery can happen even if config loading itself is what causes the crash.

---

## Tips

- If your device lands in **Step 2** (reset config), check the serial log or the filesystem editor for `/rst.cfg.json` — your previous settings are still there.
- If you're on ESP32 and a firmware update went wrong, **Step 3** (rollback) may recover you automatically without needing to re-flash.
- To manually clear the crash counter without power-cycling, do a clean restart from the WLED web UI (reboot button in Settings → Security & Updates).
69 changes: 69 additions & 0 deletions docs/features/custom-fonts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Custom Fonts
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DedeHai - please review for accuracy

---

WLED supports loading custom bitmap fonts for use with the **Scrolling Text** effect. Custom fonts are stored on the device filesystem as `.wbf` files and can be created with the Font Factory tool, see below.
The source code of the tool as well as a collection free-to-use fonts are available [on github](https://github.com/DedeHai/WLED-Tools/tree/main/WLED-FontFactory).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct typos/capitalization in user-facing text.

Please fix small text issues like githubGitHub and extenstionextension.

Based on learnings: "ensure programming language names and API datatype names use consistent, correct capitalization ... Apply this check across all documentation markdown files under docs/."

Also applies to: 60-60

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/features/custom-fonts.md` at line 6, Fix user-facing
capitalization/typos in docs: in docs/features/custom-fonts.md update "github"
to "GitHub" in the sentence starting "The source code of the tool..." and
correct any occurrences of "extenstion" to "extension"; then scan all markdown
files under docs/ to normalize capitalization for programming language names
(e.g., "JavaScript", "TypeScript", "Python") and API/data-type names (e.g.,
"JSON", "HTTP", "UUID") so they use their standard, correct capitalization
consistently.


---

## Built-in fonts

WLED ships with five built-in fonts. In v0.16, four of them were redrawn for improved legibility while keeping the same pixel heights for backward compatibility. All built-in fonts now use **per-glyph variable width**, so narrow characters like `i` take less space than wide ones like `W`.

| "Font Size" | Height |
|------|---------------|
| 1 | 6 px |
| 2 | 8 px |
| 3 | 8 px |
| 4 | 9 px |
| 5 | 12 px |

**Note:** if you want the classic pre 16.0 fonts there is a button available in PixelForge Scrolling Text tab to download "Classic WLED Fonts" as custom fonts. Make sure you do not have any additional custom fonts installed. After downloading, enable the "Custom Font" checkmark.

---

## Custom font files

WLED uses a custom font format called **WBF** which stands for WLED Bitmap Font. Up to **5 custom font files** can be loaded from the filesystem. To use custom fonts enable the "Custom Font" checkmark in the scrolling text effect and choose the font using the "Size" slider. If less than 5 fonts are available, the smallest ones use custom fonts and larger sizes default to the built-in fonts. When more than 5 fonts are uploaded, only the first five are used (in alphabetical order).

### File format

`.wbf` files use a tightly bit-packed binary format with a 12-byte header. You don't need to create or edit them by hand — use the Font Factory tool instead that is available in PixelForge.

### UTF-8 support

Custom fonts can include Unicode characters beyond standard ASCII. The `.wbf` format supports 2-, 3-, and 4-byte UTF-8 code points, making it possible to use accented Latin characters, Cyrillic and other scripts. To add international characters please use the Font Factory tool - it has a user friendly drop-down menu to select from and even allows to specify custom UTF8 table offsets to add mathematical symbols for example.

### Enabling custom fonts

1. Upload your `.wbf` file(s) to the WLED filesystem via the **File Manager** (`/edit`) or create and upload a font using the Font Factory tool.
2. Open the **Scrolling Text** effect settings.
3. Enable the **Custom Font** checkbox.
4. Use the "Size" slider to select the font

If no `.wbf` files are found on the filesystem, WLED falls back to the built-in fonts automatically. You can see currently available fonts and also delete them using the PixelForge tool.

---

## Creating fonts with Font Factory

[WLED Font Factory](https://github.com/DedeHai/WLED-Tools/tree/main/WLED-FontFactory) is a web-based tool for creating `.wbf` font files. It is available in the PixelForge (button below the color picker)under "Other Tools".

**Note:** a single symbol or letter in a font is also referred to as a "glyph" - a typographical character.

### Workflow

1. Load a source font — supported formats are **TTF**, **OTF**, **WOFF** as well as pixel based **BDF** and native **WBF**
2. Choose whether to use variable or fixed glyph width
3. Adjust the three sliders until you get the desired font size - the sliders are not available when loading bitmap fonts
2. Choose which UTF-8 extenstion to include (e.g. Latin, Cyrillic, Greek etc.) - use preview example text to test
3. Set the pixel height. The tool renders each glyph at that height.
4. Edit individual glyphs pixel by pixel in the built-in glyph editor if needed or delete unwanted glyphs to save space
5. Click **Upload** to save the `.wbf` file to the controller directly or **Download** to store it on your phone/pc
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

### Showcase your font

The Font Factory source files include the [showcase tool](https://github.com/DedeHai/WLED-Tools/blob/main/WLED-FontFactory/source/wbfShowcaseGenerator.htm) available for download (click "Download raw file", then open the file).
It renders a `.wbf` file into a PNG image with all glyphs in the font. Use it to show a preview of your font if you want to share it on discord, reddit or any other place.

23 changes: 20 additions & 3 deletions docs/features/effects.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,26 @@ hide:
---

!!! info "Version Info"
Effects above 117 are only available 0.14+ or Sound Reactive forks.<br />
Effects above 117 are only available 0.14+ or Sound Reactive forks.
v0.16 adds 36 new effects — see [New in v0.16](#new-in-v016) below.
[Retired Effects](#retired-effects) - Can't find an old favorite? Look here.

## New in v0.16

v0.16 adds **36 new effects** across 1D, 2D, and the Particle System:

**1D Particle System effects** (requires [Particle System](/features/particle-system)):
PS DripDrop, PS Pinball, PS Dancing Shadows, PS Fireworks 1D, PS Sparkler, PS Hourglass, PS Spray 1D, PS 1D Balance, PS Chase, PS Starburst, PS GEQ 1D, PS Fire 1D, PS Sonic Stream, PS Sonic Boom, PS Spring

**2D Particle System effects** (requires a 2D segment):
PS Fire, PS Waterfall, PS Vortex, PS Fireworks, PS Volcano, PS Ballpit, PS Box, PS Fuzzy Noise, PS Impact, PS Attractor, PS Spray, PS GEQ Nova, PS Ghost Rider, PS Blobs, PS Galaxy, PS GEQ 2D

**Other new effects:**
PacMan, Shimmer, Color Clouds, Slow Transitions, Copy Segment

**user_fx usermod effects** (requires `user_fx` usermod build):
Diffusion Fire, Spinning Wheel, Lava Lamp, Magma, Ants, Morse Code, PS Comet

## Effect Overlay
Since 16.0 true segment & effect overlay is supported.

Expand Down Expand Up @@ -49,7 +66,7 @@ For 2D effects the background (secondary) color is set to black.
## Effects

| ID | Effect | Description | Flags | Colors | Parameters |
|----:|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|-----------------------------------------|-------------------------------------------------------------------------------|
|:----|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|-----------------------------------------|-------------------------------------------------------------------------------|
| 186 | Akemi | The WLED mascot rocking to your tunes. <br /> ![](https://raw.githubusercontent.com/scottrbailey/WLED-Utils/master/gifs/FX_186.gif) | ▦ ♫ | Head palette, Arms & Legs, Eyes & Mouth | Color speed, Dance |
| 27 | Android | Section of varying length running <br /> ![](https://raw.githubusercontent.com/scottrbailey/WLED-Utils/master/gifs/FX_027.gif) | ⋮ | 🎨 Fx, Bg | Speed, Width |
| 38 | Aurora | Simulation of the Aurora Borealis <br /> ![](https://raw.githubusercontent.com/scottrbailey/WLED-Utils/master/gifs/FX_038.gif) | ⋮ | 🎨 1, 2, 3 | Speed, Intensity |
Expand Down Expand Up @@ -233,7 +250,7 @@ For 2D effects the background (secondary) color is set to black.
All new effects support palettes except pacman. Effects with the prefix "PS" use the particle system.

| ID | Effect | Description | Flags | Colors | Parameters |
|---:|:---|:---|:---:|:---:|:---|
|:---|:---|:---|:---:|:---:|:---|
| 187 | **PS Volcano** | Erupting volcano. <br /> ![](../assets/images/content/effect_gifs/FX_187.gif) | ▦ | 🎨 | **Speed:** Particle speed <br> **Intensity:** Particles emitted <br> **Move:** Movement velocity <br> **Bounce:** Collision hardness <br> **Spread:** Emitter variation <br> **AgeColor:** Color by particle age <br> **Walls:** Enable side boundaries <br> **Collide:** Enable particle-particle collisions |
| 188 | **PS Fire** | Versatile and quite realistic fire effect. <br /> ![](../assets/images/content/effect_gifs/FX_188.gif) | ▦ | 🎨 | **Speed:** Flame speed <br> **Intensity:** Heat intensity <br> **Flame height:** Vertical reach <br> **Wind:** Wind speed <br> **Spread:** Fire width <br> **Smooth:** Enable Smoothing/Blurring <br> **Cylinder:** Wrap left & right <br> **Turbulence:** Add turbulence |
| 189 | **PS Fireworks** | Rockets shooting up and exploding in various ways and colors. <br /> ![](../assets/images/content/effect_gifs/FX_189.gif) | ▦ | 🎨 | **Launches:** Rocket launch frequency <br> **Explosion Size:** size of explosion <br> **Fuse:** Detonation timer <br> **Blur:** Trail softness <br> **Gravity:** Pull force <br> **Cylinder:** Wrap left & right <br> **Ground:** Enable floor <br> **Fast:** Doubles speed |
Expand Down
4 changes: 3 additions & 1 deletion docs/features/macros.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ For further buttons, the default action for short press is cycling effects, long

## Buttons

Multiple buttons are implemented since 0.13 and allow a few different types of buttons to be connected to the ESP:
Multiple buttons are implemented since 0.13. Starting in v0.16, up to **32 buttons** can be configured without any custom compilation — use the LED Settings page to add as many as you need.

The following button types are supported:

- momentary push-buttons that are normally open and short GPIO pin to ground (active low)
- momentary push-buttons that are normally closed and release the connection from GPIO pin to GND (inverted, active high)
Expand Down
22 changes: 14 additions & 8 deletions docs/features/palettes.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ hide:
---

!!! info "Version Info"
Beginning in 0.14 up to 10 [Custom Palettes](#custom-palettes) can be uploaded.
Beginning in 0.14 up to 10 [Custom Palettes](#custom-palettes) can be uploaded. Starting in v0.16, over 100 custom palettes are supported, a new palette editor is built into the UI, and over 800 additional palettes from the cpt-city collection are available.



Expand Down Expand Up @@ -88,11 +88,15 @@ hide:

### Custom Palettes

As of 0.14, up to 10 custom palettes can be uploaded by the user in JSON files named `palette0.json` through `palette9.json`
The format closely resembles that of the palettes defined in `palettes.h` with a position (0-255), red, green, blue for each color. An example of the content would be:
As of v0.14, up to 10 custom palettes can be uploaded in JSON files. Starting in **v0.16**, over **100 custom palettes** are supported but the palette numbering scheme has changed: custom palettes start at the number 200 downwards so you need to re-save your presets - palettes 255-201 are reserved for usermod palettes like Audio Reactive.

**v16.0** also introduces an improved **Palette Editor** (accessible from the palette icon below the color picker in the UI) to create and edit custom palettes directly in the UI. The editor lets you add colour stops, adjust positions - and can show what your work looks like on the LEDs in real time.

Custom palettes can also be uploaded by placing JSON files named `palette0.json` through `palette9.json` on the device via the file editor. The format closely resembles that of the palettes defined in `palettes.h` with a gradient position (0–255), red, green, blue for each colour stop. An example:

```
{"palette":[
0, 255, 33, 4,
{"palette":[
0, 255, 33, 4,
43, 255, 68, 25,
86, 255, 7, 25,
127, 255, 82, 103,
Expand All @@ -101,6 +105,8 @@ The format closely resembles that of the palettes defined in `palettes.h` with a
255, 87, 255, 65]}
```

Once a palette[0-9].json file has been created, it can be uploaded to the controller using the `/edit` page (http://[controller-ip]/edit).
The controller must be rebooted (`/win&RB`) before the newly uploaded palettes will be available.
After reboot, the custom palette(s) will be named `~ Custom [0-9] ~` in the Palettes section of the user interface.
Once a palette file has been created, it can be uploaded to the controller using the `/edit` page (`http://[controller-ip]/edit`). Since version 16.0 the editor is accessible through the file icon below the color picker.

### Additional Palettes (v16.0+)
Comment thread
softhack007 marked this conversation as resolved.
Outdated

v16.0 includes over **800 palettes** that were hand-picked from the [cpt-city](https://phillips.shef.ac.uk/pub/cpt-city/) collection. They are available directly in the palette editor.
Loading