Skip to content

SquareWaveSystems/opcilloscope

Repository files navigation

opcilloscope

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.

.NET 10 License Terminal.Gui

opcilloscope demo: install, connect, browse, subscribe, scope view

Why opcilloscope?

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).

Features

  • 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).
  • Record — Export monitored values to CSV. Zero data loss — every server-pushed sample is captured at full precision in a locale-independent format (ISO 8601 timestamps, . decimal separator, arrays as semicolon-joined elements).
  • Configure — Save/load connection and subscription configs (.cfg JSON files).
  • Themes — Dark (default), light, and terminal (inherits your terminal's ANSI colour scheme).

Dark theme Light theme

opcilloscope scope view with live sine wave
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)
  └─→ 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 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.

Keyboard Shortcuts

Key Action
Tab Cycle between panes
Enter Subscribe to selected node
F5 Refresh address space tree
Delete Unsubscribe from selected variable
Space Toggle selection / pause scope
S Open scope with selected variables
W Write value to node
R Toggle CSV recording (monitored variables)
+ / - Zoom in / out (scope)
Ctrl+O / Ctrl+S Open / save configuration
Ctrl+R Toggle CSV recording
? Help

Install

Linux / macOS:

curl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.sh | bash

Windows (PowerShell):

irm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.ps1 | iex

Or grab a binary from GitHub Releases.

macOS note: the binaries are unsigned, so archives downloaded with a browser are quarantined by Gatekeeper. Either use the curl installer above, or clear the quarantine attribute after extracting: xattr -d com.apple.quarantine <binary>.

Then run:

opcilloscope
Uninstall

Linux / macOS:

curl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.sh | bash

Or manually:

rm ~/.local/bin/opcilloscope
rm -rf ~/.config/opcilloscope/       # optional: remove config files
rm -rf ~/.local/share/opcilloscope/  # optional: remove OPC UA certificates

Windows (PowerShell):

irm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.ps1 | iex

Or 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 files

If you installed to a custom directory (OPCILLOSCOPE_INSTALL_DIR), replace the paths above with your custom install location.

Quickstart (Developer)

Requires .NET 10 SDK.

git clone https://github.com/SquareWaveSystems/opcilloscope.git
cd opcilloscope
dotnet build
dotnet run

Run tests:

dotnet test

OPC UA Test Servers

Built-in test server (Counter, SineWave, RandomValue, writable nodes):

dotnet run --project Tests/Opcilloscope.TestServer
# Starts at opc.tcp://localhost:4840

Public 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:50000

Contributing

Contributions welcome! Please submit an issue or a pull request.

License

The opcilloscope source code is MIT-licensed — see LICENSE.

Official binary releases are self-contained builds that bundle the OPC Foundation UA .NET Standard stack and other third-party components. The bundled stack version (1.5.378.65) is distributed by the OPC Foundation under its MIT license; earlier versions of that stack were dual-licensed GPL-2.0/RCL. See THIRD-PARTY-NOTICES.md for the full list of bundled components and their licenses.

Built by Square Wave Systems
Inspired by lazygit

About

Browse and monitor OPC UA servers from your terminal. Lightweight, cross-platform, keyboard and mouse friendly.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors