Sable: a front-panel OLED display for Volumio, now fully editable by AI agents

Sable is a front-panel display + controller for Volumio 4 (and moOde 9/10) on the Raspberry Pi. It drives an SSD1322 256x64 OLED over SPI via luma.oled, plus a rotary encoder, MCP23017 buttons/LEDs and IR remote support. Now-playing screens, spectrum visualisers (bars/dots/mirror/ribbon), an analog VU meter, clock and screensaver with burn-in protection.

It started life as Quadify a community project converting Quad FM4 tuners into streamers, keeping the original front panel and rotary in use. Sable is the ground-up successor, and it’s no longer tied to that: it works on any Pi with the right wiring, whatever the case.

The AI agent part

I’ve added a /docs/ai-repair/ folder documenting the whole codebase for AI coding agents. The point is that you shouldn’t need to read Python to change how your display looks.

Expose the Sable folder over Samba (Volumio already runs Samba, so it’s just an extra section in smb.conf), then open that folder in an AI-capable editor, Antigravity, VS Code with Copilot, Cursor, Claude Code. Tell the agent to read /docs/ai-repair/ first, then describe what you want in plain English:

  • “make the spectrum bars thicker”
  • “make the bars pure white instead of grey”
  • “remove the sample rate from the now-playing screen”
  • “add the date under the clock”
  • “my rotary stopped working since I fitted a HiFiBerry DAC HD”

DAC conflicts

That last one is worth expanding on. DAC HATs occupy GPIO pins, and some of them clash with the pins Sable uses for the rotary encoder or buttons. The docs include a procedure for the agent to inspect your actual running hardware, which overlay is loaded, what’s on the I2C bus, which pins are in use, work out what your HAT has claimed, and remap Sable’s pins around it in config/hardware.json.

It checks your specific board rather than guessing from a lookup table, which matters because third-party HAT pinouts vary and aren’t always documented.

Then sudo systemctl restart sable.service and you’re done.

Other screens

Everything is SSD1322-specific right now, 256x64, 16-grey, via luma.oled. Since luma.oled supports a range of controllers, there’s no reason it couldn’t be adapted to other panels. Layouts would need reworking for a different aspect ratio, but that’s exactly the sort of job an agent handles well. Nobody’s tried it yet as far as I know, if you do, I’d like to hear how it goes.

Links

Repo, install instructions and the full docs: GitHub - theshepherdmatt/sable · GitHub
Discord (build help, AI repair channel, general chat): Quadify

2 Likes

I have scucessfully installed the Sable Plugin on a Raspberry Pi 4 + HifiBerry DAC+ setup - inside a Quad FM4 tuner chassis.

Everything works rather nicely so far, but I have noticed that there is quite e bit of interference from the Sable plugin with my ordinary Quad FM4 tuner which I still use in parallel.

If I turn the Sable plugin off, the interference stops. It also stops when I switch to the menu screen. If I turn the “now playing” screen back on, the interference will occur as the text scrolls by on the screen, from right to left. The same occurs when bars or VU meters move in the second screen option.

So I was wondering whether there would be a possibility to disable the scrolling text or moving artwork and simply show the “frozen” screen. There is no such option in the Sable setu menu, so I wonder what I would need to change in the relevant configuration file(s).

I have managed to include an additional screen layout named Classic (static, no animations) which I included in the Web-UI and it can also be accessed from the settings menu on the display with the rotary selector. There were two additional settings I needed to make: (1) disable the scrolling text ribbon – which apparently isn’t considered a screen animation and (2) ensure that the horizontal menu on the display is accessible, also when the “Classic” screen is active. This now results in a completely “frozen” screen with the necessary information and graphics still on it. The interference with the FM radio signal has now disappeared as long as the screen remains frozen. Once the horizontal menu of the display is selected and the rotary selector is turned to select (sub)menus, there will be audible interference clicks on FM radio, but this is only temporary.

All other screen options of the Sable plugin remain available if so desired.

I have made a few more customizations to the menu structure of the Sable plugin to suit my particular wishes. All of these were done with the use of the AI-editing tool which is really remarkable.

As I mentioned briefly, using the AI agent works fine as long as you give it clear instructions. The menu structure is rather complex by nature and -for example- adding an extra menu item on the horizontal menu of the display requires this to be explicitly mentioned. Otherwise -like initially in my case- the extra menu item may end up in the Setup menu.

I further noticed that the Qobuz menu item on the display did not work at all. On the Web-UI the Qobuz My Playlists shows the content, but on the little display nothing was shown. So I chose to remove the Qobuz menu item altogether and instead created a new one called “Browse”, which now includes a direct link to Qobuz My Playlists, to the Web Radio stations and my local music library.

In general, it is nice to be able to reach the various streaming sources from the display menu (and see what is playing), but obviously this is done a lot easier through the Web-UI which can be used from any PC or portable device.