This project is the latest step in something I’ve been tinkering with for a while: getting a live view of my computer screen onto a small embedded display over the wireless LAN. Earlier versions used a breadboard ESP32 + TFT with WebSockets and UDP (first write-up, improved streamer). ScreenStreamWatch goes further: a watch-style ESP32-S3 board with a round AMOLED, touch, proper JPEG decode on chip, mDNS discovery so you don’t hard-code IPs, and a 4-digit pairing step so random devices on the network can’t latch onto your stream.

I made a video that walks through the hardware, the big-picture software story, and a full setup demo:

Watch on YouTube → I Put My Entire PC Screen on a Watch (And It Actually Works)


Hardware

The firmware targets a specific kit: the Waveshare ESP32-S3 Touch AMOLED 2.06″. We also pull the Waveshare BSP from Espressif’s component manager so the round AMOLED, touch controller, and audio path match the board.

At a high level the board gives you:

  • ESP32-S3 : dual-core MCU, Wi‑Fi, enough headroom to decode JPEG and run LVGL for the UI
  • AMOLED : full-color, high-contrast; the “entire PC screen” is really your desktop resized and compressed into video frames
  • Capacitive touch : navigate Wi‑Fi setup, discovery, pairing, and stream controls
  • I²S codec + speaker : PCM audio from the PC when you run the AV desktop script (muxed on the same TCP session)

You’ll also want the watch and PC on the same LAN. Guest Wi‑Fi or AP isolation on the router often blocks mDNS or device-to-device traffic, if discovery fails, that’s the first place I check.


Software architecture (bird’s-eye view)

There are two halves:

On the PC (Python, in tools/): capture the desktop (DXCam on Windows when available, mss otherwise), resize and JPEG-encode frames (TurboJPEG or OpenCV), run a small TCP server (default port 8765), and advertise _screenstream._tcp with Zeroconf so the watch can find the host without typing an IP.

On the watch (ESP-IDF, main/): connect to Wi‑Fi (captive portal on first boot), query mDNS for that service, open a TCP connection, complete pairing (challenge/ACK), then receive either:

  • Legacy video: repeated 32-bit little-endian length + JPEG per frame, or
  • AV mode: a multiplexed SSAV packet stream with video, PCM audio, and format metadata—see stream_app_config.h and screen_stream_server_av.py for the details.

Decoded frames go to RGB565 buffers and LVGL draws them to the display.

The project is pinned to ESP-IDF v5.5.1 in the README; other IDF versions aren’t validated and may break configuration or build.


Getting started (short version)

  1. Install the Espressif IDF extension (VS Code / Cursor), run the setup wizard, select ESP-IDF 5.5.1, open the repo root (CMakeLists.txt), set target esp32s3, build, flash.
  2. First Wi‑Fi: join the device AP, open http://192.168.4.1, enter home network credentials.
  3. On the PC: cd tools, Python venv, pip install -r requirements_screen_stream.txt, run screen_stream_gui.py or screen_stream_server.py.
  4. Start the server, use the watch to find the desktop, confirm the matching 4-digit code, stream.

Full step-by-step text lives in the repository README and tools/README.md.


Source code and license

  • Repository: github.com/Nischay2312/ScreenStreamWatch
  • Application code under main/ and tools/ is AGPL-3.0 (see LICENSE in the repo). ESP-IDF, LVGL, Waveshare BSP, and other pulled components keep their own licenses.

If you build this or extend it (UI, audio, protocols), I’m curious what you come up with—leave a comment here or on the YouTube video.