This is the path that turns the panel into a real extra display on macOS.
- ESP-IDF v5.5 at
~/esp/esp-idf-v5.5, orIDF_PATHset to its location - Swift toolchain
libusbinstalled with Homebrew:
brew install libusbPackage.swift declares a macOS 13 minimum.
make setupmake setup identifies the board on a serial port, suggests the matching
firmware profile, offers Wi-Fi configuration, builds, flashes, and starts a
display session.
Re-running it is safe: it keeps an existing configuration rather than overwriting it.
make # build firmware + macOS host
make flash # flash the panel over its UART port
make display # extended desktop on the panelIf more than one serial device is attached, choose the port explicitly:
make flash PORT=/dev/cu.usbmodemXXXXBoard-specific flashing details live in ../HARDWARE.md.
make display finds a panel on its own:
- USB when a cable is connected
- otherwise the first panel answering on the network
Wi-Fi is off by default on the SPI boards, so a freshly flashed board is
USB-only until Wi-Fi is enabled and given credentials. Each board advertises
_glint._tcp as glint-<id>.local.
USB is preferred when both are available because it is much faster.
make panels # every reachable panel
make display-wifi PANEL=glint-335b.local # wireless only
glint display --usb # USB only
glint display --serial glint-335b # specific board, either transport
glint display --portrait # upright panel
glint display --name "Studio Panel" # display name shown by macOS
glint display --touch --tp-swap --tp-flip-x
glint doctor
glint mirror --landscape
glint image photo.heic --fill
glint bars --seconds 10
glint touch --calibrate
glint stats
glint backlight 128
glint sleep 1make panels runs glint --list, which marks a panel already serving another
session as in use.
- Colour shaping:
--sat P --con P, or--flat - Desktop size:
--width W --height H --1x - Frame cap:
--fps N - Disable tiling:
--full
Streaming a 960x640 desktop to the 320x480 P4 panel:
| USB (high speed) | Wi-Fi | |
|---|---|---|
| Throughput | 7.4-7.9 MB/s | 0.95-1.9 MB/s |
| Frame rate | 24-26 fps full-screen | 3-6 fps full-screen |
The Wi-Fi range is not noise in the measurement: it halves when the 2.4 GHz band is busy, and this board reaches its radio over SDIO rather than having one on the die.
A typical desktop changes little between frames, so dirty-rect tiling sends
about 18 KB per frame rather than 300 KB, and an idle desktop sends nothing at
all. --full disables tiling, which is what the full-screen figures measure.
glint display needs Screen Recording permission, and the recording indicator
stays on for as long as the session runs.
If you use --touch, macOS Accessibility permission is needed too.
glint doctor checks:
- panel reachability
- Screen Recording permission
- Accessibility permission
- whether the private virtual-display path still works on your macOS build
make install-agentThis installs a LaunchAgent that starts glint display at login and restarts
it when the panel disappears.
Remove it with:
make uninstall-agent- macOS will not create a virtual display at the panel's native size, so glint uses a larger desktop and downscales it 2:1.
CGVirtualDisplayis private API and can change under macOS updates.- HiDPI is ignored for virtual displays.
- Screen Recording keeps the recording indicator active.
The deeper reasoning and platform-specific edge cases are documented in ../NOTES.md and ../DESIGN.md.