SDS-Remote is a remote control interface and help center for Siglent SDS 1000X-E series oscilloscopes. It provides a modern graphical user interface (GUI) for instrument control, waveform acquisition, screen capture, data logging, and interaction through an integrated AI-powered chat interface. SDS-Remote runs on Linux and Windows. For a quick overview, watch the introductory video.
Note: This application is not affiliated with Siglent or any other commercial entity.
SDS-Remote enables remote control and AI-enhanced operation of Siglent SDS1202X-E, SDS1104X-E, SDS1204X-E, and SDS1102X-E oscilloscopes from Linux and Windows.
- Remote Oscilloscope Control: Control supported oscilloscopes remotely over a network using the VXI-11 protocol or through USB connectivity (USB support is currently experimental).
- Waveform Acquisition & Data Export: Capture and display waveform data from enabled channels. Save screen captures as images and export waveform data as CSV files.
- Device Parameter Monitoring: View real-time parameters such as timebase, sample rate, and voltage settings. Cursor-based measurements are supported.
- Data Logging: Log key data points over a period of time. Generate PDF measurement reports containing charts and key metrics, or export all recorded measurement points as CSV files.
- Macro Recorder: Record, edit and play back SCPI command sequences. Supports variables, conditionals, loops, and both network and USB connections for automated test procedures.
Acquire and visualize waveform data. Perform advanced measurements using X/Y cursors and zoom controls for detailed waveform analysis. Export waveform data as image files or CSV datasets.
Acquire and display oscilloscope screenshots in real time. Control your oscilloscope remotely using a virtual front panel.
Send commands and query oscilloscope functionality using natural-language prompts.
The instrument sub-agent also exposes a deterministic measurement parser tool
(parse_measurement). It converts raw PAVA response strings such as
C1:PAVA PKPK,3.000000E+00V or C1:PAVA FREQ,9.998900E+02Hz into a structured
result (channel, measurement, value, unit) plus a human-readable form
(3 V, 1.5 kHz, ...). Parsing and unit conversion are pure code — no LLM is
involved — and invalid input is rejected with a structured error instead of
producing a wrong value.
Save and restore oscilloscope configurations using local .lss profile files.
Log key measurement data over configurable durations ranging from 1 minute to 24 hours. Measure frequency drift and peak-to-peak voltage variations and generate reports with a detailed diagram, start/end and min/max values. All data points can also be saved in a separate CSV file.
Record, edit and play back SCPI command sequences to automate repetitive measurement and configuration tasks. Supports variables, conditionals (if/else), loops (while), assertions, and both network (connect("IP")) and USB (connect(usb)) connections.
⚠️ USB connection support in macros is experimental.
To install the precompiled Debian .deb package on Debian-based Linux distributions (for example, Ubuntu 24.04 or newer), download the latest package from the Releases page and run the following command in your terminal:
sudo apt install ./sdsremote_[version]_amd64.debAlternatively, double-click the .deb file and follow the installation instructions.
Once installed, you can launch the application from your desktop environment's application menu.
For Windows installation, use the MSI installer: sdsremote_[version].exe
If you prefer to build SDS-Remote from source, you will need to install the Flutter SDK and its dependencies.
Choose the instructions for your target platform.
-
Install Dependencies: Ensure the required development tools are installed:
sudo apt install curl git unzip cmake ninja-build pkg-config libgtk-3-dev
-
Download Flutter: Download the Flutter SDK from the official Flutter Linux installation guide.
-
Extract and Add to PATH: Extract the archive and add the
flutter/bindirectory to your systemPATH. -
Verify Installation: Run
flutter doctorin your terminal to verify that all dependencies are installed and the environment is configured correctly.
-
Install Dependencies: Ensure the following components are installed:
- Git for Windows
- Visual Studio 2022 with the Desktop development with C++ workload
-
Download Flutter: Download the Flutter SDK from the official Flutter Windows installation guide.
-
Extract and Add to PATH: Extract the archive and add the
flutter\bindirectory to your systemPATH. -
Verify Installation: Run
flutter doctorin a command prompt to verify that all dependencies are installed and the environment is configured correctly.
-
Clone the Repository (if not already cloned):
git clone https://github.com/klumw/sdsremote.git cd sdsremote -
Install Packages:
flutter pub get
-
Build the Linux Application:
flutter build linux
The compiled executable will be located in the
build/linux/x64/release/bundle/directory. -
Build the Windows Application:
flutter build windows
The compiled executable will be located in the
build/windows/x64/runner/Release/directory.To run the executable, ensure that the associated DLLs and the data directory are located in the same folder.
For USB support on Windows, place libusb.dll from the libusb project in the same directory as the SDS-Remote executable.
Multiple DLL versions are available in the download package. Select the DLL located under /VS2025/MS64-hotplug.
Next, verify or install the WinUSB driver for your device:
- Download the Zadig driver tool.
- Connect your device.
- In Zadig, enable Options → List All Devices.
- Select your device and install the WinUSB driver if it is not already installed.
Note: If you are using a VISA-based application in parallel, it may no longer detect the device after switching to the WinUSB driver.
Some Siglent USB firmware versions are not fully USB compliant. Perform the following compatibility check:
-
Connect your device to a USB port.
-
Run the following command:
sudo dmesg
-
If you see messages similar to the following:
config 1 interface 0 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 64 usb 1-4: config 1 interface 0 altsetting 0 bulk endpoint 0x1 has invalid maxpacket 64
then the device's USB firmware is not fully compliant with the USB standard, and some SDS-Remote functionality, such as profile upload, may not work correctly under Linux.
You can run the built executable directly or start the application in debug/development mode.
flutter run -d linuxThe Linux window title bar and task bar show the bundled SDS-Remote icon
(assets/icons/sds-remote.png). The GTK header bar (top bar) uses a small 24x24
icon scaled from assets/icons/sds-remote-icon_128_128.png. Both icons are
loaded and applied by the GTK runner in
linux/runner/my_application.cc.
flutter run -d windowsRun the unit and widget tests from the project root:
flutter testThe AI search accuracy evaluation in test/ai_search_accuracy_test.dart performs
real API calls — one search-agent call plus one grader call per test case. The
LLM under test is configured in the test itself (currently
edenai:mistral-code-agent-latest, which also drives its knowledgebase search
sub-agent), while the grader LLM is currently deepseek:deepseek-v4-flash.
Both provider keys must therefore be exported. Run the test from the project
root so that the relative paths to test/ai_test_data.json and
docs/knowledgebase.md resolve:
export EDENAI_API_KEY="..."
export DEEPSEEK_API_KEY="sk-..."
flutter test -r expanded test/ai_search_accuracy_test.dartThe -r expanded reporter shows the per-case score and reasoning. A full run
evaluates 20 cases and can take several minutes; the averaged results are printed
and written to test/ai_search_accuracy_results.json.
The AI chat feature supports the following providers:
| Provider |
|---|
| DeepSeek |
| OpenAI |
| Anthropic |
| Mistral |
| Cohere |
| EdenAI |
| OpenRouter |
| xAI |
The following LLMs are known to work with the application:
- deepseek-flash
- gpt-6-luna
- gemini-flash
- claude-sonnet
- qwen-3.x-max
- mistral-code
For exact model names, refer to your provider's documentation.
The AI subsystem may generate inaccurate information or incorrect operating instructions. Use this functionality at your own risk.
The AI code is split into agents and tools:
lib/src/ai/agents/— agent classes and system prompts:frontend_agent.dart— user-facing agent that delegates to specialized sub-agents.instrument_agent.dart— SCPI/VXI-11 instrument control agent.search_agent.dart— knowledgebase search agent.max_tool_calls_handler.dart— shared max-tool-call mixin used by agents.systemprompts.dart— centralized system prompt strings for all agents.
lib/src/ai/tools/— all agent tools:vxi11_tool.dart— raw SCPI write/query tool for the instrument.measurement_tool.dart— deterministic PAVA measurement parser (parse_measurement).scpi_agent_tool.dart— wraps the instrument agent as ascpi_instrument_agenttool.search_agent_tool.dart— wraps the search agent as asearch_agenttool.knowledgebase_search_tool.dart— knowledgebase chunk search tool (knowledgebase_search).
All Flutter widget class files live under lib/src/widgets/:
- Panels:
data_logger_panel.dart,macro_editor_panel.dart,macro_recorder_panel.dart,osci_device_params_panel.dart,osci_physical_panel.dart,osci_profiles_panel.dart,osci_settings_panel.dart. - Windows/screens:
home_page.dart,osci_chat_window.dart,osci_help_window.dart. - Widgets & dialogs:
data_logger_dialog.dart,data_logger_plot.dart,osci_knob_widgets.dart,osci_news_notification.dart,osci_toolbar_button.dart,filename_prefix_dialog.dart,reference_file_picker_dialog.dart,unsaved_changes_dialog.dart.
Non-widget, domain-specific support code is grouped into subfolders under
lib/src/.
lib/src/ai/— AI agents (agents/), tools (tools/), and the chat service (ai_chat_service.dart).lib/src/app/— application configuration and environment:app_config.dart,app_paths.dart,app_preferences.dart,app_theme.dart.lib/src/core/— cross-cutting utilities:logger.dart.lib/src/data_logger/— Data Logger logic:data_logger_csv_writer.dart,data_logger_models.dart,data_logger_report.dart,data_logger_service.dart.lib/src/instrument/— instrument I/O and protocol:dart_vxi11.dart(VXI-11/USBTMC transport),scpi_parser.dart(SCPI response parsing),measurement.dart(PAVA measurement parsing/formatting).lib/src/macro/— Macro language and recorder logic:macro_ast.dart,macro_evaluator.dart,macro_grammar.dart,macro_lint_controller.dart,macro_lint_error.dart,macro_linter.dart,macro_recorder_models.dart.lib/src/waveform/— Waveform models, conversion, acquisition, and rendering:waveform_models.dart,waveform_converter.dart,waveform_acquisition.dart,waveform_painter.dart,cursor_geometry.dart, plus the CSV/processing helperswaveform_csv_parser.dart,waveform_csv_writer.dart,waveform_processing.dart(drops the first 8 acquisition samples, which contain a transient artifact visible as a left-edge offset in the plot). Voltage conversion usesV = code * vdiv / 25 - OFST(SiglentOFSTis the zero-level offset from screen center), and the painter centers the visible range at-OFST.lib/src/widgets/— all Flutter widget classes (see Widget Code Layout).
The application entry point main.dart stays at lib/.
This software is released under the terms and conditions of the Apache 2.0 License.
- Review the in-app help manual for troubleshooting guidance.
- Check the application logs at:
- Linux:
/tmp/sds/logging/sds.log - Windows:
%TEMP%\sds\logging\sds.log
- Linux:
- Submit issues or feature requests through the SDS-Remote GitHub Issues page.





