MyCustomerDisplay¶
MyCustomerDisplay turns a Raspberry Pi into a plug-and-display customer-facing screen, driven entirely by a host machine over a single USB cable.
Flash the image to an SD card, plug the Pi into your point-of-sale computer (or any host) and into a screen, and the host can display arbitrary web content, exchange messages with the display, and receive customer input — no network setup, no drivers to install, no authentication dance. Unplug it and it's just gone; plug it back in and it picks up where it left off.
The device shows up to the host as a normal composite USB device: a tiny Ethernet-like network link plus a serial port. There is nothing to install on the host beyond your own application logic (or a Go client library that does the discovery and protocol work for you).
Why¶
Retail and hospitality point-of-sale setups routinely need a second screen facing the customer — order recap, loyalty prompts, payment status, ads between transactions. Building that screen usually means a whole extra PC, a proprietary customer-display protocol, or both. MyCustomerDisplay replaces that with a single ~$20–70 Raspberry Pi board that boots straight into a fullscreen kiosk browser and takes orders from the host over USB.
Key features¶
- Zero-setup USB link. Composite USB gadget (network + serial) — no drivers on
Windows, Linux or macOS; the host talks to the device at a fixed address
(
10.99.0.1) the moment it's plugged in. - One API, two transports. The exact same REST + WebSocket JSON contract is also available as NDJSON over the serial port, for hosts that would rather not touch a network stack.
- Hardware-accelerated kiosk browser. Fullscreen WPE WebKit, GPU-accelerated on the Pi's VideoCore/V3D GPU, driving arbitrary HTML/CSS/JS content — remote URLs or self-contained content bundles uploaded by the host.
- Two-way page channel. The currently displayed page can exchange messages with the host application in real time (e.g. a touch on the screen driving the POS terminal).
- Fail-safe by design. The device always converges to something on screen: boot splash → waiting page → content, with automatic browser-crash recovery and a read-only root filesystem that a power loss can't corrupt.
- A/B OTA updates. The host pushes a signed update bundle; the device applies it to the inactive slot and automatically rolls back if the new system fails to boot.
- Optional NFC. Poll a USB or I2C/SPI NFC reader and surface tag events (UID, NDEF, loyalty cards) to both the displayed page and the host.
- Optional Odoo IoT Box emulation. An unmodified Odoo Point of Sale can drive the device as its customer display, no Odoo-side changes required.
- Optional Wi-Fi/Bluetooth. Off by default (USB stays the trusted, default transport); can be turned on when a project needs it.
- Runs on the whole Pi lineup. Zero 2 W, 4 and 5 — the agent detects the board at runtime and adapts its memory and rendering budget accordingly.
How it fits together¶
flowchart LR
subgraph HOST["Host (POS application)"]
APP["Application code"]
LIB["Go client library\n(discovery, REST+WS, serial NDJSON)"]
APP --> LIB
end
subgraph USB["USB composite gadget"]
NET["NCM network\n(usb0: 10.99.0.1)"]
SER["CDC-ACM serial\n(ttyGS0)"]
end
subgraph DEVICE["Device (Raspberry Pi)"]
direction TB
AGENT["displayd (Go agent)\nREST+WS API · NDJSON serial · content server\nconfig manager · browser controller · system control"]
KIOSK["Kiosk browser\nWPE WebKit + Cog, fullscreen, GPU-accelerated"]
DATA[("Data partition\nconfig, bundles, splash, certs")]
AGENT --> KIOSK
AGENT <--> DATA
end
SCREEN["Screen (HDMI)"]
LIB --> NET
LIB --> SER
NET --> AGENT
SER --> AGENT
KIOSK --> SCREEN
The host talks to displayd, the single on-device agent, over either transport. displayd
owns everything else: serving content, driving the kiosk browser, managing configuration on
the writable data partition, and controlling the rest of the system (rotation, audio,
screenshots, watchdog, OTA updates, factory reset).
Where to go next¶
- New to the project? Start with Hardware, then Flashing the image and First boot.
- Setting up your host machine? See Host setup (Windows) or Host setup (Linux).
- Building the integration? See Displaying content, the API overview and the Client library guide.
- Something not working? Check Troubleshooting and the FAQ.
Project status and scope¶
This site documents what ships on the project's main branch. Some capabilities (NFC,
Odoo IoT Box emulation, Wi-Fi/Bluetooth) are optional and disabled by default; each has its
own guide describing what enabling it changes about the device's behavior and trust model.
Experimental or roadmap-only features are called out explicitly where relevant and are not
otherwise documented here.