Contributing to Opcilloscope
July 11, 2026 · View on GitHub
Thank you for your interest in contributing to Opcilloscope!
Getting Started
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR-USERNAME/opcilloscope.git - Create a branch:
git checkout -b feature/your-feature-name - Make your changes
- Run the applicable test layers described in docs/TESTING.md
- Commit and push
- Open a Pull Request
Development Setup
Prerequisites
- .NET 10 SDK
- Linux only: ICU libraries (
sudo apt install libicu-devon Debian/Ubuntu,sudo dnf install libicu-develon Fedora/RHEL)
Building and Testing
dotnet restore Opcilloscope.sln
dotnet build Opcilloscope.sln
dotnet test Opcilloscope.sln
# Linux only: publish and test the real TUI through a PTY
dotnet test Tests/Opcilloscope.E2ETests/Opcilloscope.E2ETests.csproj
Code Style
- Follow C# conventions and .NET naming guidelines
- Enable nullable reference types
- Keep methods focused and small
- Use meaningful variable and method names
Pull Request Guidelines
- Keep PRs focused - One feature or fix per PR
- Write tests - Add tests for new functionality
- Update documentation - Update README if adding user-facing features
- Follow existing patterns - Look at existing code for style guidance
Reporting Issues
When reporting issues, please include:
- OS and version
- .NET SDK version (
dotnet --version) - Steps to reproduce
- Expected vs actual behavior
- Any error messages or logs
Architecture Overview
Opcilloscope/
├── App/ # UI (Terminal.Gui v2)
│ ├── Views/ # View panels
│ ├── Dialogs/ # Modal dialogs
│ ├── Keybindings/ # Key binding system
│ └── Themes/ # Theme system
├── Configuration/ # Config file load/save
├── OpcUa/ # OPC UA client logic
│ └── Models/ # Data models
├── Utilities/ # Helpers (logging, threading, CSV)
└── Tests/ # Unit and integration tests
├── Opcilloscope.TestServer/ # In-process OPC UA test server
├── Opcilloscope.Tests/ # Cross-platform xUnit tests
└── Opcilloscope.E2ETests/ # Linux published-binary PTY tests (outside the solution)
Key Patterns
- Thread marshalling: Use
UiThread.Run()for UI updates from background threads; the legacy staticApplicationAPI is obsolete - Lazy loading: Address space tree loads children on-demand
- Subscriptions: Uses OPC UA client/server subscriptions and monitored items (not repeated reads and not the OPC UA PubSub transport model)
- Integration tests: Run against an in-process OPC UA test server (no external dependencies needed)
- Security profiles: Automatic/omitted or partial profiles require the strongest matching
SignAndEncryptendpoint; explicitSignopts into signed-but-unencrypted traffic, explicit anonymousNoneopts into unsecured plaintext, and--insecurebypasses certificate validation only