Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
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
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).
65 changes: 65 additions & 0 deletions docs/features/custom-fonts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
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 `.wbs` files and can be created with the [WLED Font Factory](https://github.com/DedeHai/WLED-Tools/tree/main/WLED-FontFactory) tool.

---

## 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`.

| Name | Width × Height |
|------|---------------|
| 6×3 | variable × 3 px |
| 5×8 | variable × 8 px |
| 6×8 | variable × 8 px |
| 7×9 | variable × 9 px |
| 5×12 | variable × 12 px |

---

## Custom font files (`.wbs`)

Up to **5 custom font files** can be loaded from the filesystem at the same time. They appear alongside the built-in fonts in the Scrolling Text effect settings.

### File format

`.wbs` 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.

### UTF-8 support

Custom fonts can include Unicode characters beyond standard ASCII. The `.wbs` format supports 2-, 3-, and 4-byte UTF-8 code points, making it possible to use accented Latin characters, Cyrillic, CJK glyphs, and other scripts.

### Enabling custom fonts

1. Upload your `.wbs` file(s) to the WLED filesystem via the **File Manager** (`/edit`) or the OTA update page.
2. Open the **Scrolling Text** effect settings.
3. Enable the **Custom Font** checkbox.

If no `.wbs` files are found on the filesystem, WLED falls back to the built-in fonts automatically.

---

## 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 `.wbs` font files.

### Workflow

1. Load a source font — either a **TrueType (TTF)** or **BDF bitmap** font file.
2. Choose which Unicode range(s) to include (e.g. Basic Latin, Latin Extended, Cyrillic).
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.
5. Click **Export** to download the `.wbs` file.

### Showcase mode

Font Factory includes a **showcase** export that renders a PNG preview of all glyphs in the font — useful for checking readability before uploading to a device.

---

## Using custom fonts in PixelForge

The [PixelForge Scrolling Text tool](/features/pixelforge#scrolling-text-tool) also uses the Scrolling Text effect and will pick up any custom fonts you have loaded.
19 changes: 18 additions & 1 deletion 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
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
19 changes: 13 additions & 6 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,8 +88,11 @@ 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, and the JSON naming scheme has changed — palettes are no longer limited to `palette0.json` through `palette9.json`.
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


**v0.16 and later:** Use the built-in **Palette Editor** (accessible from the palette picker in the UI) to create and edit custom palettes directly in the browser without manual JSON editing. The editor lets you add colour stops, adjust positions, and preview the gradient in real time. Palettes are saved to the filesystem automatically.

**v0.14–0.15 (legacy):** Custom palettes can be uploaded by placing JSON files named `palette0.json` through `palette9.json` on the device via the `/edit` page. The format closely resembles that of the palettes defined in `palettes.h` with a position (0–255), red, green, blue for each colour stop. An example:
```
{"palette":[
0, 255, 33, 4,
Expand All @@ -101,6 +104,10 @@ 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`).
The controller must be rebooted (`/win&RB`) before newly uploaded palettes are available.
After reboot, custom palettes appear in the Palettes section of the UI.

### Additional Palettes (v0.16+)

v0.16 includes over **800 palettes** sourced from the [cpt-city](http://soliton.vm.bytemark.co.uk/pub/cpt-city/) collection. These are available directly in the palette picker — no upload needed.
70 changes: 70 additions & 0 deletions docs/features/particle-system.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
title: Particle System
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

---

The Particle System is a physics-based effects engine built into WLED. It simulates many independent particles — each with its own position, velocity, and size — and renders them onto your LED strip or matrix in real time.

WLED includes both a **1D Particle System** (for strips) and a **2D Particle System** (for matrices).

---

## How it works

Each frame, the engine:

1. Updates every particle's position based on its velocity.
2. Applies forces (gravity, drag, wind, etc.) depending on the active effect.
3. Handles collisions between particles where enabled.
4. Renders particles onto the LED output using brightness fall-off based on distance.

### Rendering (v0.16 improvement)

Large particles use **squared-distance ellipse rendering** instead of the blur-based method used in older versions. This is more accurate and can improve rendering speed by up to **30% FPS** on dense particle effects.

### Collisions

When particle collisions are enabled, the engine uses **mass-ratio based collision response**: a larger particle pushes a smaller one proportionally to the mass difference, rather than applying equal and opposite forces. This makes interactions feel more physically realistic.

---

## 1D Particle System

The 1D Particle System works on standard 1D LED segments. Effects include things like sparks, rain, fire, and bouncing balls along a single strip.

**2D mapping:** 1D particle effects support the `map1D2D` option, which maps the 1D output onto a 2D segment using various patterns (line, zigzag, circle, etc.). This lets you use 1D physics effects on a matrix.

---

## 2D Particle System

The 2D Particle System requires a **2D segment** configured in WLED. Effects render directly onto the X/Y grid of the matrix.

Available 2D particle effects include fireworks, sprinklers, waterfall, pinball, and more.

---

## Memory usage

The Particle System allocates memory **dynamically per segment** based on the number of active particles. On complex setups with many particles or multiple segments, **PSRAM is recommended** (and required on some configurations). Devices without enough free RAM will reduce the particle count automatically or skip the effect.

---

## Effect controls

Particle System effects expose standard WLED effect sliders and toggles (speed, intensity, palette), plus effect-specific controls such as:

- Gravity strength and direction
- Particle size
- Particle lifetime / spawn rate
- Collision on/off
- Wrap-around edges on/off

Controls vary by individual effect.

---

## Tips

- For best results on large matrices (32×32 and above), use an ESP32 with PSRAM.
- 1D Particle System effects run fine on ESP8266 for shorter strips.
- If an effect runs slowly, try reducing the segment size or lowering the particle count via the intensity slider.
69 changes: 69 additions & 0 deletions docs/features/pin-info.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Pin Info
---

The **Pin Info** page gives you a live overview of every GPIO pin on your controller — what it's doing right now, and what it's capable of. It's a handy diagnostic tool when troubleshooting hardware conflicts or checking whether a pin is free to use.

Open it from **Settings → Pin Info**, or navigate directly to `http://<wled-ip>/settings/pininfo`.

The table refreshes every 250 ms, so button presses and touch events show up in real time.

---

## Table Columns

| Column | What it shows |
|---|---|
| **Pin** | GPIO number (e.g. *GPIO4*) |
| **Used by** | Who or what currently owns the pin (see below) |
| **Pin Notes** | Hardware capabilities of that pin (see below) |

---

## "Used By" — Pin Owners

A pin can be in one of these states:

- **Available** — not allocated to anything; free to use.
- **System** — reserved by WLED internals (flash, USB-JTAG, strapping pins, etc.). These pins cannot be assigned.
- **LED Digital / LED PWM / LED On/Off** — driving an LED bus.
- **Button** — configured as a button input. The button type (Push, Switch, Touch, Analog, PIR, …) is shown in small text next to "Button".
- **IR Receiver** — infrared remote input.
- **Relay** — relay output.
- **Ethernet** — used by an Ethernet (LAN) interface.
- **I2C / SPI / SPI RAM** — bus lines claimed by a peripheral.
- **DMX Output / DMX Input** — serial DMX data lines.
- **HUB75** — RGB matrix panel interface.
- **Debug** — debug/logging output.
- **Usermod** — claimed by a usermod. The usermod slot number is shown (e.g. *UM #134*).

For button pins, a small coloured dot appears to the left of the owner label:

- **Green dot** — button is currently pressed / signal is HIGH.
- **Grey dot** — button is released / signal is LOW.

For touch-capable pins, the raw capacitive touch reading is shown in small grey text next to the dot.

---

## "Pin Notes" — Hardware Capabilities

This column lists the hardware capabilities of the pin itself (not its current use):

| Note | Meaning |
|---|---|
| **Analog** | Can be used as an ADC (analogue-to-digital) input |
| **Touch** | Has a built-in capacitive touch sensor |
| **Input Only** | Output driver not available; can only be read, not driven |
| **Flash Boot** | Connected to the SPI flash — avoid using during normal operation |
| **Bootstrap** | A strapping pin that affects boot mode; use with caution |

A dash (`-`) means no special notes apply.

---

## Tips

- Pins shown as **System** or with **Flash Boot** / **Bootstrap** notes are best left unassigned unless you know exactly what you're doing.
- If a pin shows as **Available** but you know something is connected to it, double-check your LED/button/usermod settings — the pin may not be configured yet.
- The page works in real time: press a button and watch the dot change colour without reloading.
Loading