A lightweight, cross-platform OPC UA client for the terminal.
Browse, monitor, and subscribe to industrial automation data right from your terminal. Keyboard-driven with mouse support. No bloated GUI, no complex setup, no license fees.
| Traditional OPC Clients | opcilloscope |
|---|---|
| Heavy desktop apps | Single portable binary |
| Minutes to install | curl | bash and you're running |
| Resource-hungry GUIs | ~40 MB RAM |
| Windows-only | Windows, Linux, macOS (x64 & ARM) |
| Click-heavy workflows | Keyboard-driven, mouse support |
Use cases: commissioning (verify PLC tags), troubleshooting (live values during fault diagnosis), integration testing (validate OPC UA server configs), recording (export to CSV for reports).
- Browse — Lazily explore the OPC UA address space. Expand only what you need.
- Monitor — Subscribe to variables with
Enter. Real-time updates via OPC UA pub/sub, not polling. - Inspect — Full node attributes: Description, DataType, AccessLevel, ValueRank.
- Scope — Real-time multi-signal oscilloscope (up to 5 signals, 30 s sliding window).
- Trend Plot — Single-signal trend view with auto-scaling.
- Record — Export monitored values to CSV. Zero data loss — every server-pushed sample is captured.
- Configure — Save/load connection and subscription configs (
.cfgJSON files). - Themes — Dark (default) and light.

Scope view — a soothing sine wave
How signal sampling works
opcilloscope does not poll your OPC UA server. The server pushes value updates using OPC UA's built-in publish/subscribe mechanism.
OPC UA Server
│ pushes values every 250ms (configurable 100ms–10s)
▼
opcilloscope receives value change events
├─→ Scope View — stores every sample (up to 2,000 per signal)
├─→ Trend Plot — stores last 200 samples in a ring buffer
└─→ CSV Recording — writes every sample to disk (zero data loss)
Data capture and screen rendering are decoupled:
| What | Rate | Details |
|---|---|---|
| Server → Client updates | ~4 Hz (250 ms) | Default publishing + sampling interval, adjustable in connect dialog |
| Scope / Trend Plot redraw | 10 FPS (100 ms) | Renders whatever samples arrived since last frame |
| CSV recording | Every update | Captures 100% of server-pushed values, flushes every 10 records |
The scope view holds a sliding 30-second window (zoomable 5 s – 300 s). Display resolution is limited by terminal width — each character cell is one data point.
| Key | Action |
|---|---|
Tab |
Cycle between panes |
Enter |
Subscribe to selected node |
Delete |
Unsubscribe from selected variable |
Space |
Toggle selection / pause scope |
S |
Open scope with selected variables |
T |
Show trend plot |
W |
Write value to node |
+ / - |
Zoom in / out (scope) |
Ctrl+O / Ctrl+S |
Open / save configuration |
Ctrl+R |
Toggle CSV recording |
? |
Help |
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.ps1 | iexOr grab a binary from GitHub Releases.
Then run:
opcilloscopeLinux dependency: ICU libraries
opcilloscope requires ICU libraries at runtime for globalization support.
# Debian 13 / Ubuntu 24.04+
sudo apt install libicu72 # or: sudo apt install libicu-dev
# Fedora / RHEL
sudo dnf install libicuUninstall
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.sh | bashOr manually:
rm ~/.local/bin/opcilloscope
rm -rf ~/.config/opcilloscope/ # optional: remove config files
rm -rf ~/.local/share/opcilloscope/ # optional: remove OPC UA certificatesWindows (PowerShell):
irm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.ps1 | iexOr manually:
Remove-Item "$env:LOCALAPPDATA\Opcilloscope" -Recurse -Force # binary
Remove-Item "$env:LOCALAPPDATA\opcilloscope" -Recurse -Force # OPC UA certificates
Remove-Item "$env:APPDATA\opcilloscope" -Recurse -Force # config filesIf you installed to a custom directory (OPCILLOSCOPE_INSTALL_DIR), replace the paths above with your custom install location.
Requires .NET 10 SDK.
git clone https://github.com/SquareWaveSystems/opcilloscope.git
cd opcilloscope
dotnet build
dotnet runRun tests:
dotnet testBuilt-in test server (Counter, SineWave, RandomValue, writable nodes):
dotnet run --project Tests/Opcilloscope.TestServer
# Starts at opc.tcp://localhost:4840Public servers (no setup required):
| Server | Endpoint URL |
|---|---|
| OPC UA Server | opc.tcp://opcuaserver.com:48010 |
| Eclipse Milo | opc.tcp://milo.digitalpetri.com:62541/milo |
Docker (Microsoft OPC PLC):
docker run -p 50000:50000 mcr.microsoft.com/iotedge/opc-plc:latest \
--autoaccept --unsecuretransport
# Connect to opc.tcp://localhost:50000Contributions welcome! Please submit an issue or a pull request.
MIT — see LICENSE.
Built by Square Wave Systems
Inspired by lazygit


