Open-source hardware

A physical remote for
YouTube Music.

A polished AMOLED companion for the desk. It shows the track playing on your PC and sends every command — play, skip, like, seek, volume — over Wi‑Fi. The audio never leaves your computer.

480×480
AMOLED touch
ESP32‑S3
no audio on board
LVGL v9
ESP‑IDF firmware
How it works

Three parts, one signal chain

Your desktop plays the music. A tiny bridge translates its state. The board renders it and sends your taps back.

desktop_windows
Mac / Windows
Required
ytmdesktop

The free desktop app plays the audio and exposes live player state via its Companion Server. The board can't work without it.

arrow_forward
swap_horiz
Node.js
The bridge

Normalizes state into a source-agnostic view-model and pushes pre-resized cover art.

arrow_forward
developer_board
ESP32‑S3 board
The screen

Renders the track and emits your commands back over Wi‑Fi. A pure UI client.

wifi BLE-only board never touches audio, decoding, TLS, or auth — it all stays on your PC.
Built with intent

Every detail earns its place

memory
Pure UI client

The ESP32‑S3 is BLE-only, so playback and decoding stay on the host. The board just renders and controls.

image
Zero-decode cover art

The bridge sends pre-resized 172×172 RGB565 bitmaps the board blits straight to the panel — no JPEG decode.

tune
Source-agnostic view-model

A backend-neutral render layer. Every YouTube-Music-specific term lives in the bridge, not the firmware.

timeline
Seekable timeline

A finite position + duration model you can scrub, with a LIVE badge that kicks in for live streams.

dark_mode
Themeable by token swap

Dark AMOLED first, with a warm-cream variant that swaps the whole palette through one token table.

brightness_medium
Brightness & battery saving

Tune screen brightness to taste, and let it auto-dim then power off the panel when idle to sip battery.

Every state, designed

One screen, six moods

Playing
Live track & art blitted
Paused
Dimmed idle state
Offline
Graceful fallback banner
Hardware
Waveshare ESP32‑S3‑Touch‑AMOLED‑2.16
Tested on this board; other ESP32‑S3 targets may work
Firmware
ESP‑IDF + vendor BSP
LVGL v9.5.0, Inter ExtraBold
Bridge
Node.js, cross-platform
Runs on macOS or Windows
Backend
ytmdesktop Companion Server
Socket.IO + REST @ :9863
Get started

Two ways to run it

Try the whole UI in a desktop simulator with no hardware, or flash the real board and feed it live music.

priority_high
Prerequisite for live music: the ytmdesktop app must be running on your host PC with its Companion Server + authorization enabled (Settings → Integration). The board is a remote for it, not a standalone player. (The simulator needs no hardware, but still just previews the UI.)
terminal
Option A · no hardware
Desktop simulator

Runs the exact same ui/ code in an SDL window, cycling through all six player states.

$ brew install cmake sdl2 $ cd sim && cmake -B build $ cmake --build build && ./build/ytm_sim
developer_board
Option B · on the board
Flash & go live

Set your Wi‑Fi in menuconfig, flash the firmware, then run the bridge on your PC.

$ cd firmware && idf.py set-target esp32s3 $ idf.py menuconfig # set Wi-Fi $ idf.py -p <port> flash monitor

Build it on your desk.

Full specs, firmware, the simulator, and the bridge — all in the repo. Currently in the spec-and-first-slice phase.

codeView on GitHub