dutctl stands for "Device-under-Test Control" and is an open-source command-line utility and service ecosystem for managing development and test devices in firmware environments. By providing a unified interface to interact with boards and test fixtures across platforms, dutctl eliminates the fragmentation of device management tools that has long plagued firmware workflows. The project features remote device control, command streaming, multi-architecture testing, and a flexible plugin architecture for extensibility.
dutctl is designed for firmware developers, QA teams, and CI/CD pipelines, simplifying complex device interactions through intuitive commands, easy configuration, and scalability. The platform supports both local and remote device management through its agent-server architecture, enabling efficient collaboration in distributed teams.
┌────────────┐ ┌────────────┐ ┌───────────┐
│ Client │ │ Agent │ │ Device- │
│ (e.g. │ Network│ (e.g. RPi4)│ Wired │ under- │
│ Laptop) │───────▶│ │───────▶│ Test │
└────────────┘ RPC └────────────┘ └───────────┘
Key features include:
- Unified command interface for diverse devices
- Remote device management and command streaming
- Multi-architecture and distributed testing
- Extensible plugin system for new hardware and protocols
For detailed information on the system architecture, see the Documentation.
Supported Client OS | Recommended DUT Agent Hardware |
---|---|
Linux | RaspberryPi 4 |
Download the latest release or use the
go toolchain to install the components: go install github.com/BlindspotSoftware/dutctl/cmds/dutctl@latest github.com/BlindspotSoftware/dutctl/cmds/dutagent@latest
-
Start the DUT Agent
dutagent -a localhost:1024 -c ./contrib/dutagent-cfg-example.yaml
Run the DUT Agent locally with an example configuration in a separate terminal session. This test configuration does not require a connected DUT.
-
Play around with the DUT Client
# dutctl connect to localhost:1024 by default. # Use 'list' to see the available devices that are managed be the agent: dutctl list # You can discover the available commands per device and run them. # Check out the usage information to learn how: dutctl -h
With the current pre-release state, we are working towards a stable and backwards compatible v1. Therefore, we identified the following public interfaces, which will become stable with the first major release:
-
Command-line interfaces for the project's applications:
- DUT Client - see
dutctl -h
- DUT Agent - see
dutagent -h
- DUT Server (in development, currently at proof-of-concept stage)
- DUT Client - see
-
DUT Agent configuration:
- See the YAML specification
-
RPC communication protocol for interacting with agents:
- See the Protobuf definitions
If you are ready to get your hands dirty, hook up your DUT to a single board computer (we recommend RPi4) and launch the DUT agent on it. Below you can find the currently supported modules with example configurations. Read on here, to learn how you can adapt the agent's configuration to your needs
Modules | Status |
---|---|
GPIO Button | ✅ |
GPIO Switch | ✅ |
IPMI Power Control | ✅ |
Power Distribution Unit (Intellinet) | ✅ |
Power Distribution Unit (Delock) | ⏳ |
SPI Flasher (flashrom) | ✅ |
SPI Flasher (flashprog) | ⏳ |
Serial Console | ✅ |
Shell Execution | ✅ |
Secure Shell (SSH) | ✅ |
If you have special needs, you can extend the system with your own modules. Read about the module plugin system.
If you have multiple devices hooked up to multiple agents at different locations, you may wonder if you can handle them without connecting to the respective agents every time. DUT server is there for the rescue: It is at proof-of-concept state right now, but you can already try it out.
Contributions are welcome! Please see our Contributing Guide for details on how to get involved.
This project is supported by the NLnet Foundation and the Next Generation Internet (NGI) Zero Commons Fund. The NGI0 Commons Fund is made possible with financial support from the European Commission's Next Generation Internet program.
![]() |
![]() |
![]() |