OPCilloscope is a terminal-based OPC UA client. It browses servers, subscribes to tags in real-time, and has an oscilloscope view for watching up to 5 signals. It uses about 40MB of RAM and starts instantly.
Why a Terminal App?
I've been wanting to build a proper TUI application for a while. Terminal UIs have this satisfying simplicity, and modern frameworks like Terminal.Gui make them genuinely practical.
OPC UA felt like a good fit. When you're on-site commissioning a machine, you often just need to quickly check if a signal is updating. A lightweight terminal tool you can fire up, poke around, and close seemed more useful than a full-featured desktop app.
The other motivation was .NET. I wanted to see how well a single codebase could work across Windows, Linux, and macOS without compromise. Turns out, pretty well.
The Stack
Built with .NET 10 and Terminal.Gui v2 for the UI. The OPC UA layer uses the official OPC Foundation .NET Standard library.
Cross-platform came almost for free. Same binary runs on Windows, Linux, and macOS with zero #if directives in the codebase.
Under the Hood
A few C# bits that made this fun to build:
Braille Characters as a Pixel Engine
The oscilloscope view renders waveforms using Unicode braille characters (U+2800–U+28FF). Each terminal cell becomes a 2×4 dot matrix, giving 8x the resolution of character-cell rendering.
A custom BrailleCanvas class handles coordinate mapping, Bresenham's line algorithm for connected traces, and layer compositing so signals always win over grid dots. About 270 lines of code, no graphics dependencies.
Terminal.Gui v2 for the UI
TreeViews for browsing the address space, TableViews for subscriptions, proper dialogs and menus, full mouse support. The oscilloscope is a custom View that overrides OnDrawingContent and talks directly to the ConsoleDriver for braille rendering.
OPC UA Subscriptions, Not Polling
Values are pushed via MonitoredItem.Notification events, marshalled to the UI thread with Application.Invoke(). Data arrives as fast as the server publishes, no polling loops burning CPU.
Features
- Browse the address space with a tree view
- Subscribe to nodes and watch values update in real-time
- Oscilloscope mode for up to 5 signals with ASCII waveforms
- CSV export for offline analysis
- Keyboard-first navigation (mouse works too)
A Quick Look
Browsing a server's address space:

Watching signals in oscilloscope mode:

Open Source
It's MIT licensed. Grab it from GitHub:
github.com/SquareWaveSystems/opcilloscope
This is v0.4. If you hit bugs or have feature requests, open an issue. I'm particularly interested in hearing from people who test it against real PLCs and industrial devices.
What's Next
We're working on a few things at Square Wave Systems, all aimed at making industrial automation less painful for engineers who are used to modern dev tools. If that sounds interesting, follow along:
- GitHub: github.com/SquareWaveSystems
- LinkedIn: Square Wave Systems
Or just check back here. We'll keep posting.
Want updates on posts and releases?
Square Wave Systems builds modern software tools for industrial automation. We're based on the Gold Coast, Australia.