Plex Tuner is a 1980s Yamaha T-420 stereo tuner converted into a dedicated hardware controller for Plexamp. The eight preset buttons that originally recalled FM stations now recall artists, albums, playlists, or individual tracks from a Plex music library. The original LED display, once used for tuning frequency, now shows the currently playing song.
The unit runs independently on the local network. It does not require a phone, laptop, or screen to operate. Power on the tuner, and within a few seconds the display is live and the preset buttons are active.
How it works
A Raspberry Pi sits inside the original chassis. The front-panel buttons are wired to a TCA8418 I2C keypad matrix, which exposes the full button grid over two wires. A 1602A character LCD with a PCF8574 backpack sits behind the original display cutout. Both devices share a single I2C bus at distinct addresses.
A Python service on the Pi watches the keypad matrix, polls Plexamp for the current track, and serves a local web interface for assigning presets. Presets are stored as JSON. Each one is a Plex media key paired with a human-readable label. When a preset is activated, the display briefly shows the label (Preset: Michael Franks) before returning to the now-playing marquee.
The service is installed as a systemd unit and starts on boot.
The configuration interface
The web interface is reachable from any browser on the local network. It exposes a search field that queries the Plex library across artists, albums, tracks, and playlists, and assigns the selected result to one of the eight preset slots.
The UI is modeled after silverface audio equipment of the 1980s and 1990s: thin horizontal stripes, recessed buttons, a dot-matrix readout, and a faint sense that something inside is warming up. It is a software panel designed to feel like an extension of the hardware it controls.
Driving Plexamp
Plexamp exposes an HTTP server on port 32500. The endpoints are undocumented. To produce a usable reference, an instance of the Plexamp web client was operated while the browser network panel recorded every request. The captured log was processed by a language model into a focused API specification covering the actions the tuner needs: playback, transport, queue, volume, and now-playing state.
The Flask service is written against that derived specification. Endpoints outside the tuner's scope are intentionally absent.
Design intent
The Yamaha T-420 is a competent radio. It continues to receive FM and AM. This project is not a restoration, and it is not a tribute. The tuner was chosen for the qualities of its front panel: a fixed grid of mechanical buttons, a numeric display, and a chassis built for permanent placement on a shelf.
The system is intended to be used the way a tuner is used. A button is pressed, music begins, the display reports what is playing. The library is large; the interface is small. The complexity of the underlying catalog is deliberately hidden behind eight physical positions.
Plex Tuner sits between a media player and an instrument. The form is familiar, the role is current.