A modern, open-source diagnostic and flashing client that communicates exclusively via SOVD (Service-Oriented Vehicle Diagnostics, ISO 17978) APIs.
Part of the Eclipse OpenSOVD ecosystem. Replaces legacy monolithic tools like DTS Monaco with a clean, extensible, automation-ready architecture.
100% SOVD — to every ECU.
Whether the target is a native SOVD HPC or a classic UDS ECU behind a Classic Diagnostic Adapter (CDA) — the client uses the identical SOVD REST API. Protocol translation (SOVD↔UDS/DoIP) is handled server-side and fully transparent.
- 100% SOVD: Communicates exclusively via SOVD REST APIs — no UDS, DoIP, or CAN
- CDA-transparent: Classic UDS ECUs and native SOVD HPCs accessed through the same API
- Capability-driven: Discovers and adapts to server capabilities dynamically
- Plugin architecture: Open core with extensible plugin system for OEM differentiation
- Flashing as a Job: Full lifecycle management with pre-check, deployment, monitoring, verification, and reporting
- Automation-ready: CLI with JSON output, environment variable configuration, exit codes
- Observable: Structured logging, event recording, audit-ready reports
- No embedded secrets: Security handled by plugins or external token providers
- Eclipse OpenSOVD integration: Builds on CDA, Fault Library, ODX Converter
| Component | Repository | Role |
|---|---|---|
| This Client | OpenSOVD-flash-client | SOVD-native diagnostic & flash client (CLI + GUI) |
| CDA | classic-diagnostic-adapter | SOVD→UDS/DoIP for classic ECUs (Rust) |
| Fault Library | fault-lib | Framework-agnostic fault reporting (Rust) |
| ODX Converter | odx-converter | ODX→MDD converter (Kotlin) |
| UDS2SOVD Proxy | uds2sovd-proxy | UDS→SOVD for legacy testers |
- Rust 1.75+ (install via rustup)
- A running SOVD server (with CDA for classic ECU access)
cargo build --releaseThe binary is at target/release/sovd-flash.
# Check server health
sovd-flash --server http://localhost:8080 health
# Discover capabilities
sovd-flash --server http://localhost:8080 capabilities
# List ECU components
sovd-flash --server http://localhost:8080 components
# Read diagnostic data (DID)
sovd-flash diag read --component ECU_01 --data-id voltage
# Read DTCs
sovd-flash diag dtc --component ECU_01
# Clear DTCs
sovd-flash diag clear-dtc --component ECU_01
# Start a flash job
sovd-flash flash start --component ECU_01 --package MyUpdate --version 2.0.0
# Get flash status
sovd-flash flash status --job-id <UUID>
# JSON output (for automation)
sovd-flash --format json components| Variable | Description | Default |
|---|---|---|
SOVD_SERVER_URL |
SOVD server base URL | http://localhost:8080 |
SOVD_AUTH_TOKEN |
Bearer authentication token | — |
RUST_LOG |
Log level filter | info |
Optional: ~/.config/sovd-flash/config.toml
server_url = "http://sovd-server:8080"
plugin_dirs = ["/opt/sovd-plugins"]
output_format = "text"
timeout_seconds = 30See ARCHITECTURE.md for the full C4-model architecture documentation.
| Crate | Purpose |
|---|---|
sovd-core |
Types, models, error handling |
sovd-client |
SOVD REST client & capability discovery |
sovd-plugin |
Plugin SPI, registry, dynamic loading |
sovd-workflow |
Workflow engine, job controller, state machine |
sovd-observe |
Logging, tracing, event recording, reports |
sovd-cli |
CLI binary (sovd-flash) |
Plugins implement traits from sovd-plugin::spi:
use sovd_plugin::spi::{Plugin, BackendPlugin, PluginManifest};
pub struct MyPlugin { /* ... */ }
#[async_trait]
impl Plugin for MyPlugin {
fn manifest(&self) -> &PluginManifest { /* ... */ }
}
#[async_trait]
impl BackendPlugin for MyPlugin {
async fn pre_flash(&self, job: &Job) -> SovdResult<FlashDecision> {
// OEM-specific pre-flash logic
Ok(FlashDecision::Proceed)
}
// ...
}See plugins/example-plugin/ for a complete example.
Architecture Decision Records are in docs/adr/:
- ADR-0001: Open Core
- ADR-0002: Capability-Driven Workflows
- ADR-0003: Plugin Isolation
- ADR-0004: SOVD-Only Communication
- ADR-0005: Mandatory Test Coverage
Contributions are welcome! See CONTRIBUTION.md for guidelines.
Licensed under the Apache License, Version 2.0.
See NOTICE for third-party attribution.