[Plugin] PeppyMeter/Spectrum Screensaver for VOLUMIO Bookworm

Hey @Lee.Yan,

I need to untangle something here because two very different things have been knotted together.

What you are showing in that screenshot is the Volumio Web UI. That is Volumio’s own interface, their own code, their own icon loading logic, located at /volumio/http/www4/app/assets-common/format-icons. I did not write it. I do not maintain it. I cannot change it. I have no keys to that building.

PeppyMeter Screensaver has its own format icon system. Completely separate code, separate folder, separate loading logic. As you yourself confirmed - it displays the APE icon correctly. That is our building. The lights are on and working.

So the situation is:

  • PeppyMeter Screensaver: displays APE icon - WORKS (peppy plugin code)
  • Volumio Web UI: displays “ape” text - DOES NOT WORK (Volumio’s UI code)

This is like calling the electrician because the plumber left the tap dripping. I appreciate the confidence, but I am the wrong tradesman for this job.

Dropping an SVG file into Volumio’s icon folder is not enough. Their frontend has its own logic for which formats get icons and which get plain text. Adding a file does not register it. That requires changes to Volumio’s frontend code, which is maintained by the Volumio team.

I would suggest opening a feature request on the Volumio GitHub or community forum asking for APE format icon support in the web UI. That is the correct door to knock on.

@Wheaten was telling you the same thing, but I think something got lost in translation when the conversation detoured into what APE stands for. He already knew.

Kind Regards,

I understand everything you’re saying. I’ve looked at the JavaScript of Volumio WebUI and found that support for music formats isn’t at this level, but at a lower level.

I’m a perfectionist and want everything to be perfect.

Actually, Remote Client doesn’t support APE icons either. I modified the code to add ape.svg to make it work (because I have a lot of APE format music on my NAS).

maybe a dumb question, but which of the 1280x400 meters is animated for like a tape reel or rotating record?

Take a look here:

If it shows a reel or vinyl it rotates. Only a few as 1280x400 is not a useful format for rotating templates.

thanks!

1920x1080 Tape Recorder


1920x1080 Tape

4 Likes

I’m unsure how to make suggestions or requests to volumio. Could you please provide a brief explanation?

Hey @Lee.Yan,

Two steps:

  1. Open a GitHub issue at GitHub - volumio/Volumio2-UI: Volumio2 Web Based User Interface · GitHub - this is where Volumio’s developers track frontend work. Create a new issue there.

  2. Create a post in the Volumio community bug reports section at Bug reports - Volumio Community - reference the GitHub issue link so the two are connected.

Now, the important part. Both the GitHub issue and the forum post need to contain actual detail. Developers cannot fix what they cannot understand, and they cannot understand what is not explained. Your report should include:

  • What is the issue: Volumio Web UI does not display a format icon for APE audio files, even when ape.svg is placed in /volumio/http/www4/app/assets-common/format-icons
  • What is observed: The UI displays the plain text “ape” instead of rendering the SVG icon
  • What is expected: The UI should display the APE icon the same way it displays icons for FLAC, MP3, WAV and other supported formats
  • Why this matters: APE (Monkey’s Audio) is a widely used lossless format, particularly in Chinese music libraries

Include the screenshot you posted here showing the Web UI with the text “ape” displayed.

I say this with kindness and respect - please do not submit a one-line report like “ape icon not working.” The Volumio developers are not mind readers. They receive hundreds of reports. The ones that get fixed are the ones that explain the problem clearly and completely. Give them everything they need in the first message so nobody has to play twenty questions.

Kind Regards,

@volumio - FYI

Dear Volumionauts,

Somebody recently suggested via PM I should write a timeline of how PeppyMeter got from “dead plugin” to whatever it is now. I agreed, mostly because the alternative was coding another feature request from @Gelo5 and I needed a break.

So here it is. Three months, five repositories, one increasingly sleep-deprived (an odd scribble here and there…) nerd, and a community that apparently never stops dreaming.

Timeline

The Sleep Clinic Opens (December 12, 2025)

It started with a simple question. @Wheaten and I looked at the old 2.2.1 plugin - built for Volumio 3, Python 3.7, Node 14, held together with optimism and Buster-era dependencies - and asked each other: “How about we see what we can do about it?”

Famous last words. I have not slept properly since.

The original plugin was dead. The author had gone quiet - we do not know why and it is not our place to speculate. The community had tried workarounds involving end-of-life Python versions and manual package juggling. Results were inconsistent, instructions were incomplete, and forum threads were full of polite frustration.

Two days later, version 3.0.0 existed. A ground-up rebuild for Volumio 4’s Bookworm stack. Node 20. Python 3.11. Proper socket.io v4. No patches on top of patches. Clean slate.

That should have been the end of it. “Here is a working concept, take it or leave it, we are not providing support.”

It was not the end of it.

Dreaming in Rapid Release (December 14-31, 2025)

What followed was a sprint I can only describe as caffeinated insanity. Twelve versions in nineteen days. Each one prompted by somebody dreaming out loud in the forum.

3.0.0 - “It works.” First functional port. Pi 5 only at this point.
3.0.1 - “It works on x64 too.” After discovering that ALSA’s meter plugin has opinions about mmap transfers.
3.0.2 - “Audio does not disappear anymore.” A feature I felt should have been implicit.
3.0.3 - “Skins no longer turn white.” @Gelo5’s 120+ skins exposed a PNG transparency handling issue. He was the first to dream.
3.0.4 - “Spectrum bars stay in their lane.”
3.0.5 - “Performance is now a consideration.”
3.0.6 - “The album art rotates.” Because someone dreamed of spinning vinyl.

Then @naimnatnod looked at a cassette template and said: “Is it possible to make the two holes spin?”

I looked at that message. I looked at the codebase. I looked at my calendar. December 24th. Christmas Eve.

3.0.7 - Tape reels arrive. Merry Christmas.

3.0.8 - Fade transitions. Pre-computed rotation frames. 48% CPU reduction. Because nothing says “holiday spirit” like optimizing pygame transforms at midnight.
3.0.9 - UI reorganized into five logical sections. Debug logging made configurable. Rotation quality presets.
3.1.0 - Meter window positioning restored. SDL2 detection fixed.
3.1.1 - Configurable text scrolling speeds. Per-field control.

The year ended. The community said thank you. I thought it was over.

It was not over. People kept dreaming.

The Tonearm Dream (January 2026)

@ClaesM dreamed of a tonearm. A proper one - lifts off the rest, drops onto the record, tracks across as the song plays, lifts off again at the end. Like a real turntable.

@Wheaten said it was not realistic. I said it was technically possible but complex. Then I went quiet for a few days and came back with a working tonearm renderer.

3.1.2 brought the tonearm, per-template reel direction control, and the beginning of what would become a much larger problem: when you have a spinning vinyl, a moving tonearm, animated VU meter needles, scrolling text, and album art all occupying the same screen, things start fighting over pixels.

I call these “collisions”. The technical term is “backing buffer conflicts”. The practical term is “my meters keep disappearing”.

This led to the anti-collision architecture - a complete rethinking of how components draw on screen. Layer composition instead of backing capture. bgr_surface as single source of truth. visual_rect instead of backing_rect for clearing. Three handover documents written. Two months of ongoing work.

The unglamorous part that nobody dreams about but everything depends on.

The Clarity Engine (February 2026)

By February, the codebase had been refactored into three independent handlers - basic, cassette, turntable - each responsible for its own render pipeline. The coordinator became a thin dispatcher. Changing one skin type could no longer break another.

Then came the remote display client. Because apparently running PeppyMeter on the same device as Volumio was not enough. People dreamed of seeing their meters on a different screen. Across the network. In real-time.

3.2.6 - “Clarity Engine Goes Remote.” UDP broadcast for audio levels and spectrum data. Auto-discovery. SMB template mounting. Format icon fetching.

Then the Windows users showed up. They had dreams too - specifically, dreams of running the remote client on their Windows machines. I do not own a Windows machine. I had to install one. Not much has changed since 3.11 - same 8-bit core, 32-bit overlay, 2.14 Linux kernel doing the actual work, and a 64-bit userspace bolted on top.

The PowerShell installer worked. Then it did not. Then it worked again. @Lee.Yan reported an infinite relaunch loop caused by winget installing Python to a location that Windows itself could not find. Industrial-grade engineering from Redmond, as always.

3.2.9 brought smooth time-based rotation, the FusionDSP bridge fix (four iterations to resolve the 48kHz DAC lock), theme preservation, and enough remote client improvements to justify their own changelog.

Gelo5 Had a Dream (March 2026)

You know how it goes. You are quietly tidying up after a release. Then @Gelo5 opens a thread. “What if templates could show elapsed time?” Then another. “What about next track info?” Then “Can I put a ticker across the bottom?” Then “What if the progress bar had markers and a moving head icon?”

Somewhere around the fourth request in a week, or in a day, details are hazy now, this became 3.3.0.

PeppyMeter 3.3.0 - codename “Gelo5 Had a Dream”. Because he did. And then he kept dreaming. And I kept coding.

Elapsed and total time display. Next track metadata. Ticker with configurable separator and loop. Progress bar with markers and animated head. Per-field font style control. Vinyl dimension support. Remote vinyl loading.

I told @Gelo5 to touch grass. He did. It lasted less than two days. Then he came back with four more feature requests and 30 new templates.

dewen Had a Dream (March 2026)

@dewen reported CJK characters displaying as empty squares. The default Lato font covers Latin scripts. If your music library ventures east of Vienna, you get decorative rectangles.

The sensible fix would have been “here, use this other font file.” Instead, I built an automated font pipeline. Because that is apparently what I do now. Someone reports a font issue and I create an entire repository with GitHub Actions, pyftmerge assembly, cu2qu cubic-to-quadratic conversion, and OS/2 metric normalization.

PeppyFont - three weights, 58,642 glyphs each, 38,100 characters. Latin, Cyrillic, Greek, CJK, Japanese, Korean, Arabic, Hebrew, Devanagari, Bengali, Tamil, Thai, Georgian, Armenian. If your language has been invented, there is a reasonable chance it is covered.

3.3.1 - “dewen Had a Dream” - shipped. The dream is real. No more rectangles where song titles should be. PeppyFont is the default in both the server plugin and the remote client. Lato stays for those who prefer it. No manual font path editing. No hunting for ukai.ttc. It just works.

@dewen can finally sleep. One of us should.

The Numbers

Since December 12, here is what the sleep deprivation produced:

  • 5 repositories: peppy_build, peppy_screensaver, peppy_remote, peppy_templates, peppy_fonts
  • 30+ tagged releases
  • 3 independent render handlers (basic, cassette, turntable)
  • 1 remote display client (Linux and Windows)
  • 1 automated font pipeline covering 15 writing systems
  • 1 automated template gallery with preview generation
  • Thousands of repository pulls and clones
  • More theme downloads than I can count, though a healthy portion of those are @Gelo5 testing his own creations

About 3% of the original 2.2.1 code survives in recognisable form. 1% is the community wanting things. The remaining 96% is new - written from scratch across the handlers, coordinator, config parser, indicator system, remote broadcast, font pipeline, Windows compatibility layer, and everything in between.

Credits

I would be remiss not to acknowledge:

@2aCD - the original author whose work started the PeppyMeter journey
@project-owner - upstream PeppyMeter and PeppySpectrum libraries
@balbuze - maintains the Plugin Store alternative, which remains available and supported

@Wheaten - tests everything, posts changelogs faster than I can tag releases, creates templates when nobody is looking, and will deny all of the above

@Gelo5 - over 1,200 skins, drives features by sheer force of imagination, first person told to touch grass, first person to throw it back at me. The cheapest champagne I have ever been gifted in spirit.

@dewen - CJK bug report so thorough it spawned an entire repository. This is how you report a problem. Take notes. Now resting peacefully with full character rendering.

@pjorgenunes - comprehensive tester who finds things others miss
@Lee.Yan - Windows installer crash tester (perfectionist with gratitude)
@naimnatnod - first community member to build a spinning cassette template on his own. Proof the tools work.
@ClaesM - dreamed the tonearm into existence by asking a polite question
The Thai Volumio community - for the holiday greetings and the modified builds

And everyone else who tested, reported, stayed quiet, or simply enjoyed the results.

The Dream Goes On (Or Does It?)

(for Team A: fast scrollers)

Three months ago this plugin was dead. Now it has anti-collision rendering, cross-platform support, spectrum analysis, cassette physics, turntable tonearm animation, a remote display client, a universal font family, and a community of template creators who produce new skins faster than I can review pull requests.

But spring is here. The grass @Gelo5 was told to touch is actually growing now. I can see it from my window. It looks nice out there. Quiet. No feature requests.

My coffee grinder broke last week. Three months of continuous service and it gave up. I need a replacement - industrial grade this time, something rated for the throughput this project demands. That means leaving the house. Possibly even sleeping.

So here is the part where I remind you - again - that this plugin is provided as-is. No maintenance guarantees. No roadmap. No commitment. The code is open source. The repositories are public. The wiki is documented. The architecture handover documents exist for exactly this reason.

If you want this to continue, if you want it to improve, if you have dreamed of something it does not yet do - the tools are in your hands. Fork it. Fix it. Build it. Own it.

I have been running this sleep clinic for three months. The patients keep dreaming and the sole doctor keeps writing prescriptions in Python. At some point the patients need to start helping run the ward.

I am going to go touch some grass. Find a coffee grinder. Maybe get some sleep. If I dream of anything, I will keep it to myself.

Sweet dreams.

Kind Regards,

5 Likes

Thanks!

Thank you so much for your guidance!

I’d like to share my experience installing Remote Client here, hoping it will be helpful to others who like this plugin.

The installation process kept getting pop-up windows, and I finally discovered that the problem was an unstable network environment, preventing the components from being installed.

Solution: Download python-3.12.0rc3-amd64.exe and Git-2.53.0-64-bit.exe beforehand, and complete their installation. Then run

Install.ps1 or

irm https://raw.githubusercontent.com/foonerd/peppy_remote/main/install.ps1 | iex

The Remote Client installation went smoothly.

@nerd

Hi @nerd
Thanks for keep improve the works,
I re-install Peppy_Remote,
there is no “red color” warning, but still got message :

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa8 in position 13: invalid start byte

But it seems works without problem.

Should I install the “prototype code” of remote client instead of “main branch” ?

Thank you !

I just wanna give a huge THANK YOU for this project.

I was more or less resigned with the fact there will be no more Peppymeter on Volumio, but then it came to life, borned from some people’s dreams, other people’s work (and some both of it LOL).

Not only you put it to work but make it into a new galactic dimension :slight_smile:

Nowadays my interface is Volumio’s manifest for the base stuff and search, but I consider this Peppymeter as My Volumio’s Visual interface while playing.

It only misses the artist info (the description of the band and album) but, from where I listen it would be useless in my 22" monitor.

AWESOME ^ :infinity: and beyond!

PS - in my knowledge there is no other device in the market that even reach the toes of this PeppyMeter!

2 Likes

I reinstalled Remote Client completely, and as mentioned by the friend in this section, although Remote Client seems to be running normally (the interface, actions, and timings are all normal), the process error messages are still there.

Sorry, I might have to interrupt your coffee time again.

@nerd

Hey @dewen, @Lee.Yan,

The caffeine has finally reached the correct part of the brain and I found the actual culprit.

The encoding fix I pushed to peppy_remote was correct but incomplete - like fixing the leak in the kitchen while the bathroom tap is still running. The tracebacks you are seeing come from volumio_peppymeter.py (which peppy_remote downloads from the peppy_screensaver repo at install time), not from peppy_remote.py itself.

The problem: three places in volumio_peppymeter.py call hostname -I, which is a Linux-only command. On Windows it does not understand that flag, outputs an error message in your system encoding (GBK/CP936), and Python’s background reader thread chokes on the non-UTF-8 bytes. The application continues because it is wrapped in a try/except, but the traceback still prints because the error fires in a background thread before the catch can swallow it.

The fix: those three calls are now guarded with an os.name check (skip entirely on Windows - the local IP is already obtained by other means on the lines above) and hardened with errors=‘replace’ as belt-and-suspenders for non-UTF-8 Linux systems.

This is on the experimental branch for now. To test, reinstall peppy_remote with the experimental screensaver branch:

Download and run install.ps1 with the -b flag (powershell -ExecutionPolicy Bypass -File if needed):

irm https://raw.githubusercontent.com/foonerd/peppy_remote/main/install.ps1 -OutFile install.ps1
.\install.ps1 -b experimental

This tells the installer to pull volumio_peppymeter.py from peppy_screensaver experimental instead of main.

Please confirm the tracebacks are gone and I will merge to main.

Kind Regards,

As you expected, the problem has been solved and the program is working perfectly.

Hi @nerd
Confirmed, now it’s clean and nice ! thanks a lot !

On all my Rpi4,5 installations, the Windows 10 remote client works perfectly. I haven’t noticed any errors (installation, operation, maintenance). Now I understand why you needed that coffee, @nerd! But… as usual… here’s a small suggestion: those with more than one installation encounter the following problems:

  • you can’t save and then select, for example, 1920x1080, 1920x520, etc. You can save one setting, but the next Rpi requires a new one. It would be nice if you could save multiple settings for different installations.
  • the Windows client does not display the logo (streaming services) of e.g. Tidal
  • It would be nice to be able to insert the DAB station own logo (I don’t have it).

1920x1080 Cassette

cassete

4 Likes

1920x1080 CD


1920x1080 CD

2 Likes