{"id":45902560,"url":"https://github.com/SquareWaveSystems/opcilloscope","last_synced_at":"2026-03-01T16:00:41.205Z","repository":{"id":334672479,"uuid":"1127986830","full_name":"SquareWaveSystems/opcilloscope","owner":"SquareWaveSystems","description":"Browse and monitor OPC UA servers from your terminal. Lightweight, cross-platform, keyboard and mouse friendly.","archived":false,"fork":false,"pushed_at":"2026-02-14T09:27:29.000Z","size":4484,"stargazers_count":97,"open_issues_count":0,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-02-14T16:59:00.010Z","etag":null,"topics":["dotnet","iiot","industrial-automation","opc","opc-client","opc-ua","opcua","opcua-client","terminal","tui"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SquareWaveSystems.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-05T00:57:01.000Z","updated_at":"2026-02-14T14:05:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/SquareWaveSystems/opcilloscope","commit_stats":null,"previous_names":["squarewavesystems/opcilloscope"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/SquareWaveSystems/opcilloscope","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SquareWaveSystems%2Fopcilloscope","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SquareWaveSystems%2Fopcilloscope/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SquareWaveSystems%2Fopcilloscope/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SquareWaveSystems%2Fopcilloscope/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SquareWaveSystems","download_url":"https://codeload.github.com/SquareWaveSystems/opcilloscope/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SquareWaveSystems%2Fopcilloscope/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29974315,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T15:41:30.362Z","status":"ssl_error","status_checked_at":"2026-03-01T15:37:07.343Z","response_time":124,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotnet","iiot","industrial-automation","opc","opc-client","opc-ua","opcua","opcua-client","terminal","tui"],"created_at":"2026-02-28T00:01:23.926Z","updated_at":"2026-03-01T16:00:41.198Z","avatar_url":"https://github.com/SquareWaveSystems.png","language":"C#","funding_links":[],"categories":["Table of Contents"],"sub_categories":[],"readme":"# opcilloscope\n\n**A lightweight, cross-platform OPC UA client for the terminal.**\n\nBrowse, 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.\n\n[![.NET 10](https://img.shields.io/badge/.NET-10.0-purple)](https://dotnet.microsoft.com/download/dotnet/10.0)\n[![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n[![Terminal.Gui](https://img.shields.io/badge/UI-Terminal.Gui-blue)](https://github.com/gui-cs/Terminal.Gui)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/opcilloscope-hero.webp\" alt=\"opcilloscope demo: install, connect, browse, subscribe, scope view\" width=\"600\"\u003e\n\u003c/p\u003e\n\n## Why opcilloscope?\n\n| Traditional OPC Clients | opcilloscope |\n|------------------------|--------------|\n| Heavy desktop apps | Single portable binary |\n| Minutes to install | `curl \\| bash` and you're running |\n| Resource-hungry GUIs | ~40 MB RAM |\n| Windows-only | Windows, Linux, macOS (x64 \u0026 ARM) |\n| Click-heavy workflows | Keyboard-driven, mouse support |\n\n**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).\n\n## Features\n\n- **Browse** — Lazily explore the OPC UA address space. Expand only what you need.\n- **Monitor** — Subscribe to variables with `Enter`. Real-time updates via OPC UA pub/sub, not polling.\n- **Inspect** — Full node attributes: Description, DataType, AccessLevel, ValueRank.\n- **Scope** — Real-time multi-signal oscilloscope (up to 5 signals, 30 s sliding window).\n- **Trend Plot** — Single-signal trend view with auto-scaling.\n- **Record** — Export monitored values to CSV. Zero data loss — every server-pushed sample is captured.\n- **Configure** — Save/load connection and subscription configs (`.cfg` JSON files).\n- **Themes** — Dark (default) and light.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/theme-dark.png\" alt=\"Dark theme\" width=\"49%\"\u003e\n  \u003cimg src=\"docs/theme-light.png\" alt=\"Light theme\" width=\"49%\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/opcilloscope-demo2.webp\" alt=\"opcilloscope scope view with live sine wave\" width=\"600\"\u003e\u003cbr\u003e\n  \u003cem\u003eScope view — a soothing sine wave\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow signal sampling works\u003c/strong\u003e\u003c/summary\u003e\n\nopcilloscope does **not** poll your OPC UA server. The server *pushes* value updates using OPC UA's built-in publish/subscribe mechanism.\n\n```\nOPC UA Server\n  │  pushes values every 250ms (configurable 100ms–10s)\n  ▼\nopcilloscope receives value change events\n  ├─→ Scope View     — stores every sample (up to 2,000 per signal)\n  ├─→ Trend Plot     — stores last 200 samples in a ring buffer\n  └─→ CSV Recording  — writes every sample to disk (zero data loss)\n```\n\nData capture and screen rendering are decoupled:\n\n| What | Rate | Details |\n|------|------|---------|\n| Server → Client updates | ~4 Hz (250 ms) | Default publishing + sampling interval, adjustable in connect dialog |\n| Scope / Trend Plot redraw | 10 FPS (100 ms) | Renders whatever samples arrived since last frame |\n| CSV recording | Every update | Captures 100% of server-pushed values, flushes every 10 records |\n\nThe 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.\n\n\u003c/details\u003e\n\n## Keyboard Shortcuts\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Cycle between panes |\n| `Enter` | Subscribe to selected node |\n| `Delete` | Unsubscribe from selected variable |\n| `Space` | Toggle selection / pause scope |\n| `S` | Open scope with selected variables |\n| `T` | Show trend plot |\n| `W` | Write value to node |\n| `+` / `-` | Zoom in / out (scope) |\n| `Ctrl+O` / `Ctrl+S` | Open / save configuration |\n| `Ctrl+R` | Toggle CSV recording |\n| `?` | Help |\n\n## Install\n\n**Linux / macOS:**\n```bash\ncurl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.sh | bash\n```\n\n**Windows (PowerShell):**\n```powershell\nirm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/install.ps1 | iex\n```\n\nOr grab a binary from [GitHub Releases](https://github.com/SquareWaveSystems/opcilloscope/releases).\n\nThen run:\n```bash\nopcilloscope\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eLinux dependency: ICU libraries\u003c/summary\u003e\n\nopcilloscope requires ICU libraries at runtime for globalization support.\n\n```bash\n# Debian 13 / Ubuntu 24.04+\nsudo apt install libicu72       # or: sudo apt install libicu-dev\n\n# Fedora / RHEL\nsudo dnf install libicu\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eUninstall\u003c/summary\u003e\n\n**Linux / macOS:**\n```bash\ncurl -fsSL https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.sh | bash\n```\n\nOr manually:\n```bash\nrm ~/.local/bin/opcilloscope\nrm -rf ~/.config/opcilloscope/       # optional: remove config files\nrm -rf ~/.local/share/opcilloscope/  # optional: remove OPC UA certificates\n```\n\n**Windows (PowerShell):**\n```powershell\nirm https://raw.githubusercontent.com/SquareWaveSystems/opcilloscope/main/uninstall.ps1 | iex\n```\n\nOr manually:\n```powershell\nRemove-Item \"$env:LOCALAPPDATA\\Opcilloscope\" -Recurse -Force   # binary\nRemove-Item \"$env:LOCALAPPDATA\\opcilloscope\" -Recurse -Force   # OPC UA certificates\nRemove-Item \"$env:APPDATA\\opcilloscope\" -Recurse -Force        # config files\n```\n\nIf you installed to a custom directory (`OPCILLOSCOPE_INSTALL_DIR`), replace the paths above with your custom install location.\n\n\u003c/details\u003e\n\n## Quickstart (Developer)\n\nRequires [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0).\n\n```bash\ngit clone https://github.com/SquareWaveSystems/opcilloscope.git\ncd opcilloscope\ndotnet build\ndotnet run\n```\n\nRun tests:\n```bash\ndotnet test\n```\n\n## OPC UA Test Servers\n\n**Built-in test server** (Counter, SineWave, RandomValue, writable nodes):\n```bash\ndotnet run --project Tests/Opcilloscope.TestServer\n# Starts at opc.tcp://localhost:4840\n```\n\n**Public servers** (no setup required):\n\n| Server | Endpoint URL |\n|--------|--------------|\n| OPC UA Server | `opc.tcp://opcuaserver.com:48010` |\n| Eclipse Milo | `opc.tcp://milo.digitalpetri.com:62541/milo` |\n\n**Docker** ([Microsoft OPC PLC](https://github.com/Azure-Samples/iot-edge-opc-plc)):\n```bash\ndocker run -p 50000:50000 mcr.microsoft.com/iotedge/opc-plc:latest \\\n  --autoaccept --unsecuretransport\n# Connect to opc.tcp://localhost:50000\n```\n\n## Contributing\n\nContributions welcome! Please submit an issue or a pull request.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eBuilt by \u003ca href=\"https://squarewavesystems.com\"\u003eSquare Wave Systems\u003c/a\u003e\u003c/strong\u003e\u003cbr\u003e\n  \u003cem\u003eInspired by \u003ca href=\"https://github.com/jesseduffield/lazygit\"\u003elazygit\u003c/a\u003e\u003c/em\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSquareWaveSystems%2Fopcilloscope","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSquareWaveSystems%2Fopcilloscope","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSquareWaveSystems%2Fopcilloscope/lists"}