rtplot pushes live data from a Python script to a browser plot — locally or across a network — in a few lines of code. The plot page also hosts interactive widgets (buttons, sliders, dials, numeric / text displays) that feed values back to the sender in real time.
Typical use: a robot or data-acquisition script runs on a Raspberry Pi, and you watch signals and tweak gains from a laptop on the same Wi-Fi.
Two processes talking over ZMQ, plus a browser viewer:
flowchart TD
script["Your Python script<br/>send_array() · poll_controls()"]
subgraph server["rtplot-server"]
browser["browser tab<br/>localhost:8050"]
end
script -- "data :5555" --> server
server -- "controls :5556" --> script
Sender and server don't have to be on the same machine — see the networking guide.
Server — grab the prebuilt binary from the Releases page:
| Platform | Asset |
|---|---|
| Windows | rtplot-server-<version>-windows-x64.exe |
| Linux | rtplot-server-<version>-linux-x86_64.tar.gz |
| macOS (Apple Silicon) | rtplot-server-<version>-macos-arm64.tar.gz |
No Python needed on the viewing machine. On Windows the binary opens a small Tk status window showing the listening URL.
Client — pip install in the env that runs your script:
pip install better-rtplot(If you'd rather run the server from Python too, use
pip install "better-rtplot[browser]" — see the
API reference.)
flowchart TD
t1["terminal 1: start the server"]
t2["terminal 2: run your script"]
br["browser: open localhost:8050"]
t1 --> t2 --> br
Terminal 1 — start the server. Run the prebuilt rtplot-server
binary you downloaded above. Open http://localhost:8050 in a
browser — the page is blank until data arrives.
Terminal 2 — run your sender script. Save as my_plot.py:
from rtplot import client
import time
client.local_plot()
client.initialize_plots(["my signal"])
for i in range(1000):
client.send_array(i * 0.01)
time.sleep(0.01)python my_plot.pyA rising line now draws itself in the browser tab.
- Fast. Binary WebSocket deltas up to 1 kHz; the browser coalesces
samples into one repaint per
requestAnimationFrame, so rendering tracks your monitor refresh rate regardless of sample rate. - Browser-based. aiohttp + uPlot, no desktop GUI toolkit, works over SSH port forwarding.
- Remote-friendly. Sender or plot host can bind. Live Bind / Connect buttons retarget without restart.
- Config lives with the data. The sender declares plot layout.
- Interactive controls. Buttons, sliders, dials, displays — polled from your loop, no threads, no callbacks.
- Static HTML snapshots.
save_snapshot("out.html")writes a self-contained ~65 KB file with the current trace embedded.
- API reference — every
rtplot.clientfunction, the plot-layout schema, interactive controls, snapshots, browser UI, andrtplot-serverCLI flags. - Networking guide — Mode A vs. Mode B, viewing from a phone or second laptop, the WSL2 wrinkle, Cloudflare Tunnel, Tailscale.
- Examples — runnable scripts with embedded HTML snapshots you can open offline.
Issues and feature requests: github.com/jmontp/rtplot/issues.