Would have been nice to hear how specifically it was made to work in the end.
> Turns out, cross-fading two 4MP images at 60 frames per second on a moderately powerful single board computer is not so easy.
Yeah, at first it feels stupid that every pretty LCD screen for bus or train stops, ads or whatnot has a full computer behind it, but then you ballpark the memory bandwidth and realize you need a ~ 1 GHz device anyway just to be able to chew through the pixels fast enough. (1920² px × 24 bpp × 60 Hz = 620 MB/s.) You also realize why “fill rate” used to be such a buzzword 20 years ago and why it took a while until true color became ubiquitous.
On the flip side of the O(n²), you can easily drive a watch-sized display with pretty good ppi using a 32-bit MCU, which is why the Apple/Google/Samsung battery-guzzling approach to smartwatches seems wrongheaded to me compared to Pebble/Zepp/etc.
I've finally finished my dream music streamer featuring a vinyl-sleeve-sized square display, a custom carrier PCB for a compute module and a 3D printed case, running a custom-compiled kernel, Alpine mini rootfs and a small C app driving the display.
I did not think that this was doable by a hobbyist at all, let alone using free/open source software only (KiCAD, FreeCAD, VSCode). Turns out I was wrong!
Doesn't Airplay switch you to other media on your device (e.g. Reddit, Youtube, etc) while browsing while streaming?
Can you speak to how you're sourcing these, and from where? (And would you sell me one?)
How did you learn this?
As a hobbyist I found hardware to be quite impenetrable, given the hard mathematics and physics requirements. My attempts to learn this essentially degenerate to taking an informal engineering course. It quickly becomes clear that I'm years away from making something, and I eventually run out of both free time and executive function. AI's been helping... But I don't have the ability to tell when the output is wrong.
I wonder how that works.
Do you have plans to make the project open source?
I've spend around a month on the PCB as a hobby, next to a full time job.
And train stop displays certainly don't need 60 fps.
The main constraint for high-resolution displays is memory, not CPU clock speed. Your (odd) 1920x1920x24bpp frame buffer takes up more than 10 MB.
The sad answer is that yes, it is that low.
The better answer is that as PCB manufacturing gets more hands-off, we can look forward to some "PCB totem" somewhere in your city, like those self-service photo printers that exist now.
IMO there aren't any. It's mostly about reading datasheets, and connecting pins to each other IOC those datasheets.
Maybe the physics and mathematics are more important for analog electronics or designing ASICS?
Do you have any specific projects you'd like to build? Post here and we can talk through it. And/or start by downloading KiCAD and clicking around until you understand the UI.
The programming side is mainly also reading datasheets. Instead of connecting the right pins together, you are writing a certain value to a register, as described in tables.
I'd previously had a barebones interest in electronics (think: kits with LEDs and buzzers in like 3rd grade), but listening to his discussions and explanations of how these things worked gave me a fairly decent understanding of how some basic electrical principles work.
I also recently watched a video series[1] that explained how microcontrollers (specifically the ATMega328, the one powering the Arduino) work, from a very low level that I've always wondered about. The key part of that series, for me anyway, was getting the chip off of the Arduino PCB and onto a bare breadboard. From there I went and read/skimmed the ATTiny85 datasheet[2] (a very popular "baby brother" chip to the ATMega328) which also helped me understand how these chips do things like PWM on a low level.
I've built one project (a simple PWM dimmer based on a potentiometer) and am working on another (designing a PCB with KiCAD[3] to replace the circuit board for a battery-powered LED lantern, so I can design my own sequencing interface for what happens when you press the singular button), and it has been quite the learning experience, but one I've greatly enjoyed!
[0] https://www.youtube.com/@bigclivedotcom, also at https://odysee.com/@bigclivedotcom:0d
[1] https://www.youtube.com/watch?v=tBq3sO1Z-7o&list=PLNyfXcjhOA...
[2] https://ww1.microchip.com/downloads/en/devicedoc/atmel-2586-...
[3] This comment is long enough already, but KiCAD is a fantastic piece of FOSS software. It's a full schematic/PCB design suite, and there are plenty of tutorials all across the Internet for it.
In embedded SoCs the memory bandwidth is often shared between the CPU and the GPU. There is not a separate pool of memory and bandwidth for the GPU.
> The actual bus to the display controller may be a parallel dot-clock RGB bus, or an ultra-speed differential multi-lane serial (MIPI DSI, HDMI, etc).
That’s not what the parent comment is talking about. To get the data into the framebuffer you need to write it first. You also need to read the source images. For blending two images and writing the output, the floor is 3X the total image size every single frame. (Two reads, one write). There are tricks that can be played with frame buffers and scan out blending, but you get the idea.
> And train stop displays certainly don't need 60 fps.
We’re talking about the product in the link, which is trying to blend seamlessly between two images at 60fps.
> The main constraint for high-resolution displays is memory, not CPU clock speed.
I don’t think you understood the problem space.
If you’re doing software blending of 10MB image buffers at 60fps, the CPU can be easily be a bottleneck. You have to ensure the CPU can do enough load operations, math on the loaded data, and store operations to get it done in 16.7ms. Ideally you have a GPU, but if you don’t then you need to pay close attention to optimizations and special instructions to get it done within the frame budget and also allow some cycles for all of the other work the app has to do.
> Your (odd) 1920x1920x24bpp frame buffer takes up more than 10 MB.
The 1920x1920 size came from the article. Parent commenter wasn’t making up odd sizes, they were responding to the article.
You can learn something practical like "embedded DisplayPort should be impedance controlled to 100 Ohms" without fully understanding the physics behind it.
AI can be very convincing. It told me to put the ESD protection as close the Ethernet connector as possible, so I put it between the port and the magnetics. This worked, but resulted in around 1% packet loss. When I moved it after the magnetics, I got 0% packet loss. This cost me a full revision, but I'd say this is the price to pay for not learning everything by the book.
North America: OSH Park
Europe: AISLER
For GP: this is something you would learn from a PHY manufacturer's EVK schematics and layouts. TI (especially), NXP, Microchip show correct magnetics/ESD part numbers and placement - the trickier thing here is finding an EVK that doesn't just use an integrated MagJack.
I've seen KiCAD running in the browser, so it's not like this isn't completely doable. It's just a question of resource allocation.
Marton @ Jul 12, 2026
I always liked to see and touch the cover artwork of the CDs and LPs I bought in the past, but in the end the convenience of digital streaming won me over and I accepted no (or stamp-sized) artwork. Lately I’ve been missing this more and more and ultimately decided to try to do something about it. So I built a streamer.
I wanted a device that looks and feels like a vinyl sleeve put on display. Around 12”x 12”, and as thin as possible. I sourced the only display matching my needs: a 17” industrial IPS LCD with a 1920x1920 resolution. This came with an embedded DisplayPort connector and I needed to find a single-board computer in a compute module form that has this connector. Not a lot to choose from, but I managed to find the Radxa CM3.

Since I wanted the device to be thin, I needed to design a carrier board for the CM3 with as little height-above-the-board as possible. I never did this before so there was plenty to learn, from basic electronics and magnetics to high-speed signal routing. Took me four revisions to get to state where everything works as expected.
The board is powered via USB-C PD, has another USB-C for an external DAC, a Gigabit Ethernet port and a 12V trigger in the shape of a 3.5mm jack. The compute module also has Wifi and Bluetooth.

I designed an enclosure in FreeCAD which was also new to me. Turns out parametric CAD and smooth, curved surfaces don’t work well together. I had to write a custom macro to generate the shape I was after. Once I had the design, I tried to 3D print it on my brand new 3D printer, which turned out to be a disaster. Took me some time to learn more about designing for manufacturing, especially for 3D printing.
In the end, I had a small computer looking like an LP sleeve.
I use AirPlay in my home exclusively, so I needed this streamer to support that. I went for the most popular open-source implementation called shairport-sync and made it work on a very scaled down Alpine linux image. I had to learn quite some things about booting single-board computers, device-trees, compiling kernels, controlling display backlight, power management and more.
This gave me a good base but no artwork just yet. So I made a small application that powers the display based on the metadata that is coming from the AirPlay client. It only shows the artwork and nothing more. This was surprisingly challenging, even though this is the area I am most familiar with. Turns out, cross-fading two 4MP images at 60 frames per second on a moderately powerful single board computer is not so easy. I needed to use GPU acceleration to make it happen and look smooth.
Funnily enough, AirPlay itself only transmits low-resolution artwork (around 500x500 pixels), no wonder why large-display streamers don’t exist. Thankfully, I was able build an out-of-band protocol extension into my audio player app, so that full resolution artwork can be sent and displayed in all its glory.
The device is always on. When the screen is off, it consumes less than 2 watts. It wakes up automatically when streaming starts and turns on the screen and my amplifier via the 12V trigger. At full brightness it needs about 24 watts. I power it using a generic USB-C charger and have my Pro-Ject Amp Box SE connected via a FiiO KA17 DAC. AirPlay does CD quality lossless which is plenty of quality for me.
I am considering creating a Kickstarter for Pentaton LP if there is enough interest. If you don’t want to miss it, sign up for updates here: https://pentaton.app/lp/