The Problem

Embedded developers and robotics teams need to visualize data from serial ports, BLE, MQTT, Modbus, and CAN in real time without writing custom dashboards. Serial Studio is a cross-platform desktop application that ingests telemetry from multiple transports and renders it as plots, gauges, and grids, with CSV logging built in.

What This Does

A Qt/C++ desktop app with a QML interface. Execution starts at app/src/main.cpp; the UI lives under app/qml/ with dashboard widgets (Plot.qml, Gauge.qml, FFTPlot.qml, GPS.qml, Terminal.qml) and per-transport setup panes in app/qml/MainWindow/Panes/SetupPanes/Drivers/ (UART, BLE, CANBus, Modbus, Network, Audio). A Project Editor (app/qml/ProjectEditor/) defines frame parsers, datasets, and groups without code. The repo bundles third-party libraries (QCodeEditor, QSimpleUpdater, KissFFT, OpenSSL, mdflib) under lib/, which accounts for most of the 2,631 files.

How It Is Wired

Static analysis resolved 215 internal modules with only 6 import edges, all in the Python test utilities (tests/utils/__init__, data_generator, device_simulator, validators, api_client) — no circular dependencies. tests/utils/data_generator is the hub with 3 importers. The C++/QML core's call graph has not been mapped by this pipeline; the traced paths cover only the test surface, so the internal wiring of app/src/main.cpp through the QML layer is undocumented here. The most connected modules are test utilities, which means the test suite is the only part with a resolvable dependency structure.

How To Use It

Build from source with CMake (root CMakeLists.txt):

git clone https://github.com/moses-y/Serial-Studio
cd Serial-Studio
cmake -S . -B build
cmake --build build

Prebuilt binaries are the documented path: AppImage for Linux, DMG for macOS, installer for Windows; brew install --cask serial-studio is community-maintained. No environment variables are required for a build. Runtime configuration happens through the QML Settings dialog, not config files. The README does not document a from-source build command verbatim, so the CMake commands above are inferred from the present CMakeLists.txt.

Real-World Use

A robotics team connects an ESP32 over UART streaming JSON telemetry. In the Project Editor they define a frame parser, map fields to datasets, and drop a Gauge and MultiPlot onto the Dashboard. Data logs to CSV while plots render live; the same project switches transports to MQTT or CAN without touching the dashboard.

Code Health & Issues

Static analysis found 578 issues (370 high, 208 medium) of one kind: deep nesting (max depth 8) in tests/utils/data_generator.py, app/src/API/CommandHandler.cpp, and app/src/API/CommandProtocol.h — fix with early returns and extraction.

The security audit found:

  • Critical — CLAUDE_CODE_OAUTH_TOKEN (publish/cloud scope) in .github/workflows/claude.yml; fork PRs could exfiltrate it. Move secret-using steps to a workflow_run job that never checks out PR code.
  • High — unpinned third-party actions (@v1, @latest tags) in .github/workflows; pin to commit SHAs.
  • Medium — no least-privilege GITHUB_TOKEN permissions in deploy.yml.
  • Medium — no Dependabot/Renovate configured.
  • Medium — no dependency vulnerability scan in CI.
  • Medium — four blobs over 5MB (libcrypto.lib at 48.9MB) under lib/OpenSSL; move to LFS.
  • Medium — checkout keeps persist-credentials; set false.
  • Low — no timeout-minutes on workflow jobs.

Tests, CI, and license are present.

The Bottom Line

A feature-complete telemetry dashboard for embedded work, inheriting a mature codebase from the upstream project. The CI security posture — particularly the exposed OAuth token — needs remediation before accepting contributions. Teams wanting a ready-made multi-transport telemetry UI should use the upstream releases rather than this fork.