-
Notifications
You must be signed in to change notification settings - Fork 1
troubleshooting
Common failure modes and how to diagnose them.
The default SignalRGBBridge.exe build is --noconsole — no stdout
visible. When something's misbehaving, run the bridge with stdout
visible instead:
Option A — run the Python source directly:
python wallpaper_bridge\bridge.pyYou'll see UDP packet counts, WS client connects, settings pushes, etc. Plus any Python exceptions.
Option B — run the .exe from cmd so its stdout/stderr inherit the
terminal (only works partially since --noconsole strips the handle —
prefer Option A for debugging).
For SignalRGB-side plugin issues, the plugin writes its service.log /
device.log calls to SignalRGB's plugin log file:
%LOCALAPPDATA%\WhirlwindFX\SignalRgb\Logs\SignalRGB_*.log
After copying SignalRGB_Desktop_Wallpaper.js and .qml to your
Plugins folder, SignalRGB should hot-load within seconds.
If the device doesn't show up:
-
Confirm the Plugins folder path. With OneDrive Documents
redirection, it's
%USERPROFILE%\OneDrive\Documents\WhirlwindFX\Plugins\(orOneDrive\Dokumente\…on German Windows). Without redirection, it's%USERPROFILE%\Documents\WhirlwindFX\Plugins\. SignalRGB only watches the redirected path. -
Restart SignalRGB. Right-click SignalRGB's tray icon → Quit, then
relaunch. Hot-reload sometimes doesn't trigger
DiscoveryService.Initializereliably; a full restart always does. -
Check the SignalRGB log (
SignalRGB_*.log, see above) — search forCustom Plugin File Loadedto confirm SignalRGB saw your file. If you seeError: Could not open module…that's a plugin runtime issue — please file an issue with the exact error.
Symptom: you double-click SignalRGBBridge.exe, no tray icon, nothing.
-
Open Task Manager → Details and search for
SignalRGBBridge.exe. If it's not there, the exe failed to start (likely an antivirus quarantine on the PyInstaller bundle — temporarily disable AV / add an exclusion and retry, or build from source). -
Port 17320 already in use — another bridge is already running (or a different program is using 17320). Check:
Get-NetUDPEndpoint -LocalPort 17320 -ErrorAction SilentlyContinue Get-NetTCPConnection -LocalPort 17320 -State Listen -ErrorAction SilentlyContinue
If something else is bound, kill it (or change
bridgePortin the plugin's settings — but you'd then also need to rebuild the zips with a matching port hardcoded… not great, prefer killing whatever's conflicting).
The Lively wallpaper opens but never receives frames.
- Enable the debug overlay for that screen: tray icon → Configurator… → pick the screen tab → Background → tick Show debug overlay (top-left status line on the wallpaper). The wallpaper now shows a tiny status line top-left.
-
Read the status:
-
connecting ws://127.0.0.1:17320/?screen=N…— bridge not running or wrong port. ConfirmSignalRGBBridge.exeis in your tray. -
disconnected — retrying…— bridge crashed or was killed. Start it again. -
screen N live WxH @ X fps— wallpaper is connected and getting frames. If you still see no glow, the issue is on the SignalRGB side: confirm the device is on the canvas and a colourful effect is active.
-
-
Confirm the plugin is sending UDP. In SignalRGB's log
(
SignalRGB_*.log) search for[DesktopWallpaper] screen N frame #. If you see these, the plugin is firing; if not, the device isn't being rendered by SignalRGB (not on canvas / not active).
You set up two monitors, but the colours from Screen 1 are showing on monitor 2 (or similar).
The mapping happens in Lively, not in our code. Each wallpaper zip
hardcodes a screen index in its HTML's <meta> tag:
| Zip | Subscribes to |
|---|---|
SignalRGB_Glow_Screen1.zip |
UDP frames tagged screen=0
|
SignalRGB_Glow_Screen2.zip |
UDP frames tagged screen=1
|
SignalRGB_Glow_Screen3.zip |
UDP frames tagged screen=2
|
And the SignalRGB devices match:
- "Desktop Wallpaper - Screen 1" device sends UDP with
screen=0byte - "Desktop Wallpaper - Screen 2" device sends with
screen=1 - "Desktop Wallpaper - Screen 3" device sends with
screen=2
So the chain is: SignalRGB device "Screen 1" → UDP screen=0 → bridge
routes to WS clients with ?screen=0 → wallpaper from Screen1.zip.
To fix wrong-monitor mapping, just swap which monitor each Lively wallpaper is activated on. Or rearrange the SignalRGB canvas placements.
Should be fixed in v0.2.0. If you see it pop up anyway after upgrading, do a hard refresh:
- In Lively, deactivate the wallpaper, then reactivate. That re-loads the HTML page with the current code.
- If still leaking, please file an issue.
Should be fixed in v0.2.0. If clicking Quit leaves SignalRGBBridge.exe
in Task Manager, kill it manually from Task Manager → End task. Then
file an issue with your Windows build (winver).
Symptom: the wallpaper renders the glow correctly but no background image appears (or it's broken).
- Path issue — confirm the file at the path you picked still exists. Browse to it from File Explorer.
-
Unsupported extension — the bridge's image proxy whitelists
.png .jpg .jpeg .gif .webp .svg .bmp .ico. Other formats are rejected. -
Bridge offline — without the bridge, the wallpaper can't fetch
absolute-path images via the
/imageproxy. - Open the wallpaper's dev tools by running Lively in debug mode and
inspect network requests. Or check the bridge's stdout (run from
Python source) for
[http] served …and any404 not foundlines.
Set Number of screens in the Configurator (top-right of the tab bar — Screens: 1 / 2 / 3 / 4). Plugin polls the bridge every ~2 seconds and adjusts. If it doesn't:
- Make sure the bridge is actually running (tray icon visible).
- Open
http://127.0.0.1:17320/configin a browser — should return{"screenCount": N}. If the page errors, the bridge isn't running or the endpoint is broken. - Restart SignalRGB if the plugin seems stuck.
The wallpaper page implements Lively's
window.livelyWallpaperPlaybackChanged(state) hook per the
wiki spec
and shows a red "⏸ PAUSED" badge in the top-right corner when the hook
fires. It also subscribes to document.visibilitychange as a defensive
fallback for hosts that suspend the surface without firing the Lively
event. We deliberately do not pass --pause-event true in
LivelyInfo.Arguments — newer Lively builds reject that as an unknown
option (Wallpaper plugin exception on import). The pause hook still
fires on builds that push it without the opt-in.
But whether either hook actually fires depends on the Lively build and the user's environment — some setups don't deliver the suspend IPC to the WebView2 player at all, in which case the visibilitychange fallback is the only signal the page gets.
Quick check: when you click "Pause wallpapers" in Lively's tray, do other Web-type wallpapers in your library actually pause (freeze)?
- No → Lively itself isn't pausing in your environment. This is a Lively-side issue; we can't work around it from a wallpaper page. File an issue at the Lively repo with your Lively version and Windows build.
-
Yes for others but not ours → file an issue against this project
with your Lively version (
Settings → Aboutin Lively).
Symptom: you rebuilt + reimported a wallpaper zip (or pulled a new release), but the wallpaper in Lively keeps rendering the old behaviour — old layout, no parallax, missing widgets.
Lively extracts each imported wallpaper zip once into a
random-hash folder under
%USERPROFILE%\AppData\Local\Lively Wallpaper\Library\wallpapers\<hash>\
(MSIX build path differs; both end in Library\wallpapers\<hash>\).
Re-zipping the source folder does not propagate — Lively never
re-reads the original zip.
To pick up new HTML / JS / LivelyInfo.json changes:
- In Lively's Library, right-click the wallpaper → Delete.
- Drag the new zip onto Lively (or re-run the installer with
Auto-import into Lively enabled — v0.7.0+ uses deterministic
folder names
signalrgb-glow-screen-{1,2,3}\, which the installer overwrites in place, so no manual delete needed for future updates). - Right-click each new tile → Set as wallpaper for the matching monitor.
The deterministic-folder auto-import is the v0.7.0 fix specifically for this footgun. Pre-v0.7.0 users coming from a manual drag-import still hit it once on the upgrade — after the installer takes over, subsequent updates are silent.
If Lively shows Error initializing — Unknown options are passed.
Exception: WallpaperPluginException when importing the wallpaper,
you're on the broken v0.7.0 Lively bundles —
LivelyInfo.Arguments carried an invalid --system-cursor true
value that Lively rejects on import. Fixed in v0.7.1 (Arguments
reverted to null).
To recover:
- Install v0.7.1 or newer (re-run the installer with Auto-import
into Lively enabled, or grab the fresh
SignalRGB_Glow_ScreenN.zipfrom the release page). - In Lively's Library, delete the broken tiles (the import error leaves a stub entry), then re-import the fresh zip.
The parallax + cursor-driven Pixelfx effects still work on v0.7.1 —
they receive the cursor through the DOM mousemove listener whenever
Lively's Wallpaper interaction setting is on, instead of through
the rejected argument.
The 3D parallax (Configurator → Effects → 3D parallax) and the
mouse-driven Pixelfx modes (Trail, Glow, Ripple — all) need
real-time cursor coordinates. v0.7.1 reads them from the wallpaper
page's DOM mousemove events, which only fire when the wallpaper
surface is reachable by real mouse events:
- Lively — toggle the wallpaper's Wallpaper interaction setting to on (right-click the active tile → Customise → top of the panel). Click-through mode delivers no DOM mousemove events to the page, so the parallax / Pixelfx stays still.
- Wallpaper Engine — set Mouse input to Allow. Same logic.
- Builder / Configurator preview / browser tab — works automatically; those surfaces are normal interactive web pages.
Click-driven Pixelfx (the Ripple mode) additionally needs real clicks to reach the wallpaper, which is the same requirement as interaction-on.
Symptom: in SignalRGB's plugin settings, you bump Glow Grid Base Size to 64, 96, or 128, hit Save, and SignalRGB's log shows:
udp.error - Buffer too large. Max size is 4096 bytes!
This is the SignalRGB plugin sandbox's hard 4 KB udp.send() cap.
The plugin and bridge do support larger grids — v0.6.0+ chunks
frames > 4 KB across multiple datagrams (SC wire format) and the
bridge reassembles them.
If you're seeing the error:
-
Check the bundle versions match. Both
SignalRGBBridge.exeandSignalRGB_Desktop_Wallpaper.jsmust be ≥ v0.6.0 — the chunked protocol is implemented in both halves. Old plugin file + new bridge (or vice versa) fall back to the single-packetSRformat and hit the limit. -
Re-run the installer with Install the SignalRGB Desktop
Wallpaper plugin enabled to drop the matching JS / QML in
Documents\WhirlwindFX\Plugins\. - Then re-pick 64 / 96 / 128 in the plugin settings.
The plugin's Auto mode reads the per-screen viewport from the
bridge's GET /config endpoint, and the bridge only knows the
viewport once a wallpaper page has connected via WebSocket and pushed
its {type:"viewport", w, h} frame. Before that's happened, Auto
falls back to 16:9.
Steps to check:
-
Is the wallpaper actually running? Set the wallpaper in Lively /
Wallpaper Engine for that screen index. The viewport is sent on
WS open + on
window.resize(debounced). -
Does the bridge see it? Open
http://127.0.0.1:17320/configin a browser — thescreens[]array should show{viewportW: …, viewportH: …}populated for each connected screen. -
Is the plugin reading it? Check SignalRGB's log
(
SignalRGB_*.log); on every Update tick the plugin XHRs/configand updates its internal viewport cache. A grid change is logged asscreen N grid CxR (aspect=Auto)— confirm the numbers match the monitor.
If the wallpaper has been running but the viewport is still 0, the
WS connect happened before this beta. Reload the wallpaper (Lively:
right-click → Unset + Set as wallpaper again; WE: similar) to
re-trigger the viewport push.
If you'd rather not rely on Auto, pick a fixed aspect (16:9 / 21:9 / 32:9 / 9:16) or Custom + type the cols × rows.
This is a false positive on the PyInstaller --onedir build. Wacatac.C!ml
is a machine-learning heuristic detection — it fires on lots of
PyInstaller-packed Python applications because the bootloader pattern
(small native EXE that unpacks a Python interpreter + bytecode into
_internal/ at startup) overlaps with common malware packers.
The bridge does nothing malicious. Source is at
github.com/Delido/signalrgb-wallpaper
and the build is reproducible (pwsh installer\build.ps1).
- Open Windows Security → Virus & threat protection → Protection history → click the Wacatac entry → Actions → Allow.
- If the file was quarantined: click Actions → Restore. If Restore is greyed out, re-run the installer — it'll drop a fresh copy at the original path.
- (Optional, only if it keeps re-flagging) Windows Security →
Virus & threat protection → Manage settings → Exclusions →
Add an exclusion → Folder, pick
C:\Program Files\SignalRGBWallpaper(the v2.2.1+ install location; older versions lived under%LOCALAPPDATA%\Programs\SignalRGBWallpaper).
The Microsoft Defender team accepts false-positive reports at
microsoft.com/wdsi/filesubmission.
A submission with the installer or SignalRGBBridge.exe typically
clears the specific build's hash within 24-72 hours and trains the
ML model away from this signature for future builds. Free, takes
~2 minutes, requires a free Microsoft account.
Port 17320 is occupied by an old bridge process that didn't exit cleanly. Either:
Get-Process -Name SignalRGBBridge -ErrorAction SilentlyContinue | Stop-Process -ForceOr Task Manager → End all SignalRGBBridge.exe entries. Then start fresh.
File an issue at github.com/Delido/signalrgb-wallpaper/issues with:
- Windows version (
winver) - SignalRGB version
- Lively version (and whether it's Store or GitHub build)
- What you did, what you expected, what happened
- Bridge stdout output (run
python wallpaper_bridge\bridge.py) - SignalRGB log snippet if relevant (lines mentioning
DesktopWallpaper)
Getting started
Using the app
Reference
Project