Hardware-in-the-loop testing for engineers and their AI agents.
Your team and its coding agents write the firmware. Stout tests every pull request on your real hardware, reports pass or fail on the PR, and shows you which failures are real firmware bugs.
Welcome back, Alex
Acme Firmware · Admin
Jump into any part of your control plane.
Boxes
| Name | Groups | IP Address | Lager Version | Lock | Health | ||
|---|---|---|---|---|---|---|---|
| 100.96.12.41 | 0.49.0 | Online | |||||
Main bring-up bench. nRF5340 target on a J-Link, UART console on an FT232H, rails on the LabJack. Heartbeat 35 seconds ago · Stout Online · bench-01.local · linux/arm64 | |||||||
| 100.96.12.58 | 0.49.0 | Online | |||||
| 100.96.13.7 | 0.48.0 | Online | |||||
GPIO and rail checks for the sensor node. The LabJack moves between this bench and bench-04. Heartbeat 41 seconds ago · Stout Online · bench-03.local · linux/amd64 | |||||||
| 100.96.13.22 | 0.49.0 | Online | |||||
| 100.96.15.30 | 0.45.1 | Offline | |||||
| 100.96.13.61 | 0.47.1 | Degraded | |||||
| 100.96.14.9 | 0.49.0 | Degraded | |||||
CI Metrics
Merges exercised on real hardware, firmware bugs caught, and per-test flake rates for each product, reported by the connected CI pipeline.
Merges checked on hardware
67 / 69
97% of announced merges
Real FW bugs caught
3
2 bench or harness, 1 ambiguous
Flaky failures
16
Reds explained by a retry or same-commit rerun
Infra runs
5 / 259
Runs where the connectivity pre-check failed
Merges not checked on hardware
A merge counts as checked when this product's suite ran tests on that exact commit after passing the connection pre-check, or on a push that included it. In All products, a merge that touches shared code is counted once for each product it triggers. Two pull requests merged in separate pushes seconds apart can show the first as not checked even though its code ran in the second's run.
| Merged | Product | Repo | Branch | Commit |
|---|---|---|---|---|
| Sep 20, 2026, 02:14 PM | Gateway | fleet/firmware | main | d4e0b71826 |
| Sep 11, 2026, 04:52 PM | Sensor node | fleet/firmware | release/1.4 | 8f1a2c9ed0 |
Real FW bugs caught
Failures that were resolved by a newer commit, where the test harness blamed the device, the failing commit changed firmware, and the fix changed firmware and not the test harness.
| First failed | Product | Test | Box | Broke | Fixed by | Harness verdict | Status | Actions |
|---|---|---|---|---|---|---|---|---|
| 2026-09-19 | Gateway | power/brownout_recovery | bench-02 | a3f81c2761 Debounce brown-out detector IRQ | 9d02e4f553 Widen the brown-out debounce window | Device | Automatic | |
| 2026-09-12 | Gateway | boot/banner_timeout | bench-01 | 51b7aa00e5 Move the boot banner after clock init | 07adf1931b Print the banner before the PLL settles | Device | Automatic | |
| 2026-09-04 | Sensor node | radio/link_reconnect | bench-04 | 7d3e5b8b89 Retune the PLL after each channel hop | 90c1f3ae9d Wait for PLL lock before the first hop | Device | Automatic |
| First failed | Product | Test | Box | Commit | Why it is not counted | Status | Actions |
|---|---|---|---|---|---|---|---|
| 2026-09-17 | Gateway | io/gpio_loopback | bench-03 | c81d203718 | Harness verdict: bench or infrastructure | Automatic | |
| 2026-09-09 | Sensor node | sensor/imu_selftest | bench-04 | b62f0c491e | Fix touched harness paths | Automatic | |
| 2026-08-28 | Sensor node | power/sleep_current | bench-01 | 6a8b0e5c6e | AmbiguousCommit under test did not touch firmware | Automatic |
Flakiest tests
| Product | Test | Boxes | Runs | Attempts | Failed | Pass on retry | Flake rate |
|---|---|---|---|---|---|---|---|
| Gateway | boot/banner_timeout | 2 | 58 | 66 | 11 | 8 | 16.7% |
| Gateway | io/gpio_loopback | 1 | 58 | 61 | 4 | 3 | 6.6% |
| Sensor node | radio/link_reconnect | 2 | 40 | 44 | 5 | 4 | 11.4% |
| Sensor node | sensor/imu_selftest | 1 | 40 | 41 | 2 | 1 | 4.9% |
PR Reviewers
AI-generated hardware tests on every pull request. Configure one reviewer per repo, or several scoped by path prefix for a monorepo.
| Repository | PR | Plan | Status | Waiting | |
|---|---|---|---|---|---|
| fleet/firmware | #482 | Inject a 2 ms sag and a 40 us glitch on vbat-sense and expect exactly one latched brown-out event. | Needs approval | 18 minutes ago |
| Repository | Status | AI provider | Rate limit | Approval | Last run | Awaiting | |
|---|---|---|---|---|---|---|---|
| fleet/firmware | Enabled | Anthropic · claude-opus-5-5 | 10/hr | Required | Needs approval18 minutes ago | 1 | |
| fleet/bootloader | Enabled | Anthropic · claude-sonnet-5 | 20/hr | Auto | Waiting for buildjust now | 0 | |
| sensors/driver | Enabled | OpenAI-compatible · gpt-4.1 | 5/hr | Required | Skipped4 days ago | 0 | |
| power/bms | Enabled | Anthropic · claude-sonnet-5 | 15/hr | Auto | Generatingjust now | 0 | |
| radio/phy | Enabled | Anthropic · claude-opus-5-5 | 8/hr | Required | Passed5 hours ago | 0 | |
| display/panel | Disabled | Anthropic · claude-haiku-4-5-20251001 | 30/hr | Auto | Passed5 days ago | 0 |
Workbench
Drive a box's instruments directly from the dashboard.
Range 0 to 30 V
Range 0 to 3 A
- 0usb1ON
- 1usb2ON
- 2usb3ON
- 3usb4ON
- 4usb5ON
- 5usb6ON
- 6usb7ON
- 7usb8ON
Target MCU: nRF5340_xxAA_APP
Firmware file (.hex, .elf, .bin)
Connect to start the serial console.- AIN0adc1vbat sense--
- AIN1adc23V3 rail--
- AIN2adc31V8 rail--
- DAC0dac1Sensor stimulus
- DIO4boot-strapBoot mode strapLOW
- DIO5reset-nLOW
Tests from the connected repository, at the branch or commit you pick.
Import Testtest_brownout_recovery
tests/power
test_banner_timeout
tests/boot
test_gpio_loopback
tests/io
Run a test to see its output here.
Factory
Automated hardware test suites
Manage every test bench in the fleet: health, updates, access, groups, and locks.
See which merges ran on hardware, which failures were real firmware bugs, and which tests are flaky.
An AI reviewer plans a hardware test for every pull request, runs it on a real box, and posts the check on the PR.
Drive the supply, e-load, GPIO, thermocouple, J-Link, and UART console on a box from the browser, with a command log.
Run your saved production test suites on any box and keep the results.
Built for firmware teams and the AI agents they work with. Every pull request runs on real hardware before it merges, and every red result gets sorted into firmware bug, bench problem, or flake.
01 Loop
Every pull request runs on real hardware
Three steps on every change, and nobody has to walk over to the bench.
01.1 Write
Engineers and agents write firmware
Your team writes the code. So do your AI coding agents. Either way the change lands as a pull request on GitHub.
00How it works01.2 Test
A PR Reviewer tests it on a real box
Stout reads the diff, plans a hardware test, picks a box in your fleet, runs the test on real hardware, and posts the check on the pull request. A person approves the plan first unless you turn that off.
P3PR Reviewers01.3 Learn
CI Metrics sorts the failures
Every red result is sorted into a real firmware bug, a bench or harness problem, or a flake, so you fix the right thing and trust the ones that pass.
P2CI Metrics02 Fleet
One place for every test bench
Boxes, Workbench, and Factory look after the benches the loop runs on.
02.1 Boxes
Fleet management
See every box in the lab, its health, its Lager version, and who holds the lock. Update boxes on a schedule, group them by line or site, and control who can reach each one.
P1Boxes02.2 Workbench
Bench controls in the browser
Set a supply, load a rail, toggle a GPIO, read a thermocouple, flash a target over J-Link, and open the UART console. Every control is a named net and every command is logged.
P4Workbench02.3 Factory
Production test suites
Import a Python test suite, run it on any box, and keep the step results and logs for every run.
P5Factory03 Capabilities
Everything your hardware test fleet needs
Fleet management, job orchestration, firmware CI, and access control. This is what you get by running Stout, across every box in the fleet.
03.1
Fleet Management
See every Lager box in one list with its health, instruments, nets, and webcams. Import the boxes you already have in one step.
Learn more03.2
Job Orchestration
Submit test jobs from the dashboard or the API. Stout queues them, streams the logs live, and stores the output files.
Learn more03.3
Workflows & CI
Hardware tests on every pull request, posted as GitHub check runs. Your own CI reports its hardware runs to Stout for CI Metrics.
Learn more03.4
Team & Access Control
Organizations with role-based access, sessions, and API keys for boxes. Sign in with your identity provider over OIDC or SAML.
Learn more04 Lager
Built on Lager
Lager is fully open-source (Apache 2.0), with no private fork, no patched binaries, and no paywalled core, so if Stout ever stops fitting, your boxes, scripts, and tests keep running on vanilla Lager.
05 FAQ
Frequently asked questions
Common questions from engineering teams evaluating Stout.
What is Stout?
Stout is a control plane for hardware-in-the-loop testing. It runs hardware tests on your pull requests, sorts the failures into firmware bugs, bench problems, and flakes, and manages the fleet of Lager test boxes the tests run on. Under it all is the open-source Lager runtime.
What does the PR Reviewer do?
When a pull request opens or updates, the reviewer reads the diff, plans a hardware test with tool access to the Lager runtime, picks a box, runs the test, and posts pass or fail on the PR. By default a person approves the plan before it runs. You bring your own AI provider key, either Anthropic or any OpenAI-compatible endpoint.
What is CI Metrics?
CI Metrics tells you what your hardware CI is really finding. It reports which merges were checked on hardware, which failures were real firmware bugs, which were caused by a bench or harness change, and which tests are flaky. An admin can confirm or dismiss any row.
Can our AI coding agents use Stout?
Yes. Agents open pull requests like anyone else, and the PR Reviewer tests them the same way, on the same hardware. Nothing in your agent setup has to change.
What is Lager?
Lager is an open-source (Apache 2.0) hardware test automation platform. A Lager box is a Linux machine that runs the Lager runtime in Docker and drives the instruments on a test bench, such as oscilloscopes, power supplies, debuggers, and the devices under test, through a Python API and CLI. Stout manages fleets of these boxes.
Does Stout replace Lager?
No. Lager is the open-source runtime that controls your hardware; Stout is the control plane that governs and scales it across teams. It connects to your existing Lager boxes unchanged, and Lager stays Apache 2.0, so if you ever stop using Stout, your boxes, scripts, and tests keep running on vanilla Lager.
How is Stout different from generic CI tools like Jenkins or GitHub Actions?
Generic CI runners assume interchangeable compute. A test bench is the opposite: each box has specific instruments wired to a specific board, and two jobs cannot share a power supply. Stout adds the hardware layer. It picks a box, locks it, runs the test, streams the log, and posts the result to GitHub as a check. It plugs into the CI you already have instead of replacing it.
Can we trigger hardware-in-the-loop tests from CI?
Yes. A PR Reviewer runs on every pull request through the Stout GitHub App and posts a check run, so branch protection can require a hardware pass before merge. Your own CI can also report its hardware runs to Stout, and CI Metrics shows which merges were checked on real hardware.
How do SSO and access control work?
Users sign in through your identity provider over SSO (OIDC or SAML), with just-in-time provisioning on first login. Role-based access control scopes exactly who can view and run what across organizations, teams, and individual boxes, and removing a user in your IdP immediately revokes their access.
How does Stout keep our hardware and data secure?
Every action is recorded in an immutable audit log (who did what, on which box, and when), and accounts can require MFA. Stout runs as a managed cloud service: your boxes open an authenticated outbound connection to it, so there are no inbound ports to expose on your test network.
What does pricing look like?
Pricing scales with your team and fleet size. Book a demo and we'll put together a quote that fits.
06 Demo
See Stout in Action
In a 20-minute call we'll open a pull request, watch a PR Reviewer test it on a real box, and walk through the fleet.
What to Expect
- A 20-minute walkthrough on real Lager boxes, not slides
- Watch a PR Reviewer plan and run a hardware test
- No commitment required