Custom charging screen mod for the UC Remote 3 - It's also a screensaver cause I could

Hi everyone — first-time poster. Short pitch, and a little show-and-tell.

I think the Remote 3 is the best universal remote I’ve ever touched. Premium hardware, clean integration story, proper DPAD and touchbar feel — and critically, it’s open source. That last part is what actually convinced me to put my still-very-much-working Logitech Harmony 650 to rest and move over. I wanted a remote I could change, not just use.

One small itch though: the stock analog-clock charging screen is… fine, I guess, but a little boring. Since the source is right there on GitHub, I thought I’d take a crack at replacing it with a proper configurable screensaver system. Here’s what came out the other side.

:play_button: 30-second demo on YouTube Shorts (yes, I made that Dr. DOOM outfit in case you were wondering.)

What it does

Five themes:

  • Matrix Rain — GPU-accelerated (custom QSGGeometryNode + texture atlas, single draw call per frame), 108 tunable properties, full glitch engine (stutter / reverse / chaos / direction-trails), 9 color modes (green / blue / red / amber / white / purple / rainbow / rainbow-gradient / neon), 4 charsets including katakana, hidden message overlays, DPAD 8-way direction control with smooth gravity-lerp.
  • Starfield — warp-speed star tunnel with configurable depth, trail length and gradient colors.
  • TV Static — single-pass GLSL fragment shader composing analog snow + VHS chroma bleed + CRT scanlines + rolling tracking bar + channel-flash bursts. Chunky-pixel analog feel with a proper CRT-collapse shutdown animation.
  • Minimal — big digital clock with locale-aware date, Poppins or Space Mono, independent time/date gradient color pickers.
  • Analog — the UC stock analog clock promoted to a first-class theme (with its own sweep-and-fall shutdown animation).

One Matrix easter egg worth calling out: optional auto-rotate mode sweeps the rain direction through a continuous 360° arc with smooth curved trails (coprime-gravity spawn so every row and column gets visited on the way round — no dead zones). The rotation speed is a slider, so it’s as slow or as fast as you want: dial it down and it’s hypnotic on a docked remote, dial it up and it’s a blur.

Nine screen-off animations — Fade / Flash / Iris / Wipe / Wave / Genie / Pixels / Dissolve / TV-Static CRT collapse — play right before the display blanks. Event-driven off the core’s Normal → Idle transition with self-calibrating dim-phase measurement, so they always finish cleanly synchronized with the hardware display-off.

Per-theme overlays — clock (position, font, gradient color, docked-only), battery level (color-coded by charge, configurable text size).

Interactive (Matrix) — DPAD changes rain direction via gravity-lerp (no respawn), touchbar adjusts speed, tap zones change direction, long-press slows, triple-tap closes. Everything individually toggleable.

Install, revert, and the safety net

Caveats (please read)

  • Tested only on my own Remote 3 running firmware 1.9.x. Other firmware versions and hardware revisions are not validated. If the custom UI fails to start on your device, the revert command above is the backstop.
  • Voids warranty (the install endpoint literally requires ?void_warranty=yes). The revert endpoint restores stock and hands warranty state back to UC.
  • This is an independent hobby mod, not affiliated with or endorsed by Unfolded Circle. UC didn’t ask for it and they don’t have to support it. Blame me if it breaks.

How it was built (full disclosure)

Every line of code in this project was generated by Claude (Anthropic’s CLI coding agent, claude-code) through iterative conversation. I’m not a C++/QML developer — my background is elsewhere. The loop was: describe a feature or a bug in plain English, Claude wrote the implementation (usually spanning the C++ renderer, the config bridge, the QML wrapper, the settings sub-page, and the tests in one coherent change), then we rebuilt via the Docker ARM64 toolchain, deployed to my actual Remote 3 over the stock install API, and tested dock/undock/wake/thermal on real hardware. Anything that didn’t hold got another round. Every fix in every release was validated on the device before shipping.

All user-facing docs in the repo — READMEs, install guides, release notes, this post included — are human-reviewed and corrected before they go out. The AI writes the draft; I proof every claim, every screenshot reference, every curl command against the actual device, and rewrite anything that reads hallucinated or vague. If you spot a factual error in the docs, it’s a bug and I want to know.

The metaphor I keep coming back to: I’m the architect who can’t hold a hammer. I know what I want the building to look like, I can read blueprints, I can tell you when something’s wrong, but I’m not the one pouring the concrete. I didn’t want to hide that authorship story — if it changes how interesting the project is to you, fair enough. I thought the result was worth showing either way.

Feedback, bug reports, roasts, requests — all welcome

This is a love-letter to the Remote 3 and its open-source ethos, not a product. It runs happily on my device and I’d love to hear how it runs on yours — or if you think the Matrix defaults are too much, too weird, or not weird enough (the theme is deliberately tunable precisely so you can calm it down or push it into chaos, whichever). Reply here, open a GitHub issue, or just tell me the idea is dumb — all of it welcome.

Thanks to the UC team for making something worth modding in the first place.

4 Likes

hi, installation doesn’t work for me…
I used the curl… command but I get the error: {“code”:“BAD_REQUEST”,“message”:“Missing file: remote-ui”}

on the screen of the remote at the end of the process (before the error comes) appears for some seconds clapping hands, then the unfolded logo and then the normal screen

I have installed firmware 2.9.1

PS the fallback command doesn’t work also - there comes error {“code”:“NOT_FOUND”,“message”:“No data found”}

Hi,

Confirmed bug on my end — apologies for the broken install. Your device is fine; the visual sequence you saw (clapping → logo → normal screen) is the firmware cleanly reverting to stock when the install bundle didn’t match the expected layout. The “NOT_FOUND” on the fallback command is also expected — there’s no custom UI installed to disable, so the revert has nothing to do.

What went wrong: the GitHub release tarball (remote-ui-v1.4.19-UCR2-static.tar.gz) is missing the install-bundle wrapper that the firmware’s install endpoint requires.
The binary is in there, but the firmware looks for it at bin/remote-ui, not at the
root.

Fixing now, keep an eye on the repo and thanks for trying it! I’m running it happily on my remote. I also added more features so check out the read me later on.

Looks very interesting! Maybe you should also post this on Discord in community-projects to get more attention and potential feedback.

1 Like

thanks, will do!

Hi,

I just released v1.4.45 cause i noticed some broken features, then some other things I wasn’t happy about, mostly the ghost wake detection and suppression. I also tested the install myself and I can confirm it works. Haven’t tested with the new 2.9.2 beta release tho so if you wanna try my mods stay on 2.9.1. Please do let me know if you run into any issues or have any questions. Thanks again for giving this a try, I’m curious how it’ll feel for you.

Hi mmadalone,
with v1.4.26 it is working!
Thx a lot
PS I’m running 2.9.2 beta

1 Like

Good to hear! How does it run for you?

Btw, I recently released v1.4.39, it’s got new fixes. :slight_smile:

Hi again,
v1.4.39 installed - works pretty good.
One thing I want you to ask:
before I installed your screensaver: when I put the remote into the dock, there was a short acoustic signal that the remote was charging.
Now with this screensaver, the acoustic signal doesn’t come anymore…
Is there an option to activate it again?

thanks for the report, this was a real bug and a useful catch. here’s what I can confirm:

on fw 2.9.2, when my custom ui starts, the system environment variable pointing to the dock chime sound file isn’t set.
with no path to the file, none of the sound effects play, that includes the dock chime, button clicks, confirmation tones, and error tones.

why this is the case: whether the firmware never set this for custom UIs, set it previously and stopped, or something else, i haven’t been able to confirm. also haven’t tested the stock UC interface on 2.9.2 to compare, so i dunno whether stock users hit this too. what i CAN tell you with certainty is that the screensaver code doesn’t touch audio at all, verified against the upstream source, so it’s not something the screensaver is doing, even though the symptom showed up around the same time.

v1.4.41 fixes it for our build by shipping its own copies of the sound files inside the install bundle, so audio works regardless of what the system provides.
bonus: there’s a new Settings → Sound → Dock chime picker with 6 variants you can preview and choose from. sorry i couldn’t source the original fw sounds. the first one (warp) is closest to the original chime as i can recall but my memory isn’t very good. but heads up: these are cc0 substitutes i generated, not the exact originals. if a future firmware update restores the system path with the original sound, our build picks it up automatically and the bundled fallback only kicks in when the path is empty.

1 Like

Thanks for the quick answer!
I’ve installed 1.4.41 and the 6 variants of sounds are visible and I can choose them, but my remote makes still no sound…
I have also rebooted the remote - but same effect…

PS after reverting to stock, the sound is playing again - so it is not a problem of my remote or a problem of fw 2.9.2

can you please try this:

open Settings → Sound → Dock chime → tap the “Warp” tile (or any other variant). each tap is supposed to immediately play that chime as a preview. do you hear anything?

while the remote is awake and you’ve been using it for at least 30 seconds, undock it, wait 5 seconds, then put it back on the dock. did you hear the chime?

run this on a desktop with curl, replacing <UC3_HOST> with your remote’s IP and with your web-configurator PIN:
curl -s -u “web-configurator:”
“http://<UC3_HOST>/api/system/logs?s=custom-ui&q=UC_SOUND&limit=5”
curl -s -u “web-configurator:”
“http://<UC3_HOST>/api/system/logs?s=custom-ui&q=Default+audio&limit=5”
curl -s -u “web-configurator:”
“http://<UC3_HOST>/api/system/logs?s=custom-ui&q=Sound+effect+file&limit=5”

what do you get?

also, i’ve added more sounds to the picker, and fixed a few things so i’ve released v1.4.43.

  • Putting Remote in dock: nothing happens
  • 1st curl-cmd: nothing happens, no output to the cmd
  • 2nd curl-cmd: nothing happens and I get this:
    2026-05-06 03:56:40.790076 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-06 03:51:33.062732 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-06 03:45:06.826958 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
  • 3rd curl-cmd: nothing happens and I get this:
    2026-05-06 03:56:40.789769 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/zap_future.wav”
    2026-05-06 03:56:40.789677 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/error.wav”
    2026-05-06 03:56:40.789566 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/confirm.wav”
    2026-05-06 03:56:40.789387 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/click_lo.wav”
    2026-05-06 03:56:40.789011 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/click.wav”

the time seems strange too, because I have now 21:13 or 09:13 pm

thanks for the data, that pins it down. your logs prove your custom-ui v1.4.41 binary is doing the right thing (the audio path is initialized, the system sound device is “default”, and the fallback to /app/config/ for the wav files engaged correctly). what’s missing is the wav files themselves, they’re not on disk where the binary is looking for them.

most likely cause: the version you installed predates v1.4.41’s wav bundling (the audio fix was only complete in v1.4.41, earlier versions don’t ship the wavs at all), or your stock-ui revert + re-enable cycle didn’t re-extract the bundle.

fix: clean re-install v1.4.43. download from Release v1.4.43 · mmadalone/Madalones-Defolded-Circle-3 · GitHub (remote-ui-v1.4.43-UCR3-static.tar.gz) and install as usual. v1.4.43 also gives you a 12-variant chime picker in Settings → Sound → Dock chime (warp / ascend / bell / chord / pulse / zap + 6 power-on / star trek tos variants), plus a “Chime after screensaver” toggle so the dock chime doesn’t delay the screensaver appearing.

after installation, please run the same diagnostic queries. they should show no sound effect file missing lines. if they do appear after a clean v1.4.43 install, that’s a different bug and we’d dig in.

ps: log timestamps are in utc (the +00:00 suffix). your 21:13 local + 03:56:40 utc log = you’re 7 hours behind utc (us Pacific or similar). the clock on the remote is correct, the logs just display in utc. not a bug.

Sorry, same effect. Now I see the new entries in the settings, but the errors are the same:

  • 1st curl-cmd: no output
  • 2nd cur-cmd:
    2026-05-07 03:58:17.799564 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-07 03:57:22.476878 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-06 03:56:40.790076 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-06 03:51:33.062732 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
    2026-05-06 03:45:06.826958 +00:00 custom-ui WARN uc.core: Default audio output device: “default”
  • 3rd curl-cmd:
    2026-05-07 03:58:17.799438 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/zap_future.wav”
    2026-05-07 03:58:17.799270 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/error.wav”
    2026-05-07 03:58:17.798929 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/confirm.wav”
    2026-05-07 03:58:17.798739 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/click_lo.wav”
    2026-05-07 03:58:17.798424 +00:00 custom-ui WARN uc.core: Sound effect file missing, skipping: “/app/config/click.wav”