Now in early access · Open source core

Catch firmware bugs
before they reach the field

Write tests in Python. Run against simulation before hardware exists. Deploy to real hardware with zero test changes. Let AI tell you what broke.

Python 3.10+ · No proprietary tools Simulation to hardware in one file
crucihil run
Built for teams shipping
AV Startups Robotics Automotive Tier 2 Suppliers Firmware Teams
Features

Everything your firmware team needs

Built to replace expensive legacy dSPACE/NI toolchains for teams that move fast.

Python-first test authoring

Write tests you actually understand. No proprietary scripting languages. Full IDE support, type hints, and familiar async/await patterns.

async def test_engine_startup(rig: Rig)

Simulation to hardware parity

The exact same test file runs against a virtual simulation or real hardware. Switch from virtual.toml to orin.toml. Test unchanged.

--rig rigs/virtual.toml → rigs/orin.toml

CI/CD native

JUnit XML output works with every CI pipeline out of the box. GitHub Actions, GitLab CI, Jenkins — headless, no display required.

crucihil run --output results.xml

AI-powered failure analysis

11 MCP tools connect your AI client directly to test results, signal traces, and rig state. Ask what broke and why — get an answer in seconds.

describe_failure(run_id) → root cause
How it works

From zero to hardware test in minutes

Three steps. No MATLAB. No proprietary scripting. No $50K licenses.

1

Write a test in Python

Use the Rig fixture injected by the framework. Send CAN frames, assert signal values, inject faults — all in plain Python.

async def test_engine_startup(rig: Rig):
  await rig.can.send("EngineControl", {"throttle": 50})
  result = await rig.can.expect("EngineData.RPM", lambda v: v > 800)
  assert result.passed
2

Run against virtual simulation

The virtual rig runs in-process — no hardware, no CAN adapters, no network. Full test in milliseconds. Catches logic bugs before day one.

$ crucihil run \
  --suite engine_test.yaml \
  --rig rigs/virtual.toml

✓ 5 passed · 0 failed · 0.34s
3

Deploy to real hardware

Swap the TOML. The test is unchanged. CAN backend switches from virtual to SocketCAN or PEAK. Same assertions, same signals, real hardware.

$ crucihil run \
  --suite engine_test.yaml \
  --rig rigs/orin_bench.toml

✓ 5 passed · 0 failed · 3.84s
In practice

A real fault injection test

CAN dropout, assertion after recovery — 20 lines of Python, works on virtual and real hardware.

test_can_recovery.py Python
1import asyncio
2from crucihil.hal.rig import Rig
3
4async def test_can_dropout_recovery(rig: Rig):
5  # Inject a 1-second CAN dropout on engine messages
6  async with rig.fault.inject(
7    rig.fault.can_dropout(arb_id=0x100, duration=1.0)
8  ):
9    await asyncio.sleep(1.0)
10
11  # Bus restored — firmware should recover within 3s
12  result = await rig.can.expect(
13    signal="EngineData.RPM",
14    condition=lambda v: v > 0,
15    timeout=3.0,
16  )
17  assert result.passed, result.fail_msg
terminal output crucihil run
$ crucihil run \
  --suite recovery_tests.yaml \
  --rig rigs/bench.toml

Suite : Recovery Tests v1.2 (3 tests)
Rig : rigs/bench.toml

  ✓ [PASS ] test_engine_startup 0.023s
  ✓ [PASS ] test_can_dropout_recovery 1.234s
  ✓ [PASS ] test_firmware_resilience 2.891s

3 passed · 0 failed · 4.148s
Architecture

Six layers. Clean separation.

Test code only ever touches Layer 2. Hardware details live in TOML config, never in test code.

LAYER 6
Interfaces
Web Dashboard · CLI · CI/CD webhooks · REST API
LAYER 5
AI Interface
MCP Server (FastMCP) — 11 tools — vendor-agnostic
LAYER 4
Cloud Control
FastAPI + PostgreSQL — orchestration and test history
LAYER 3
Local Agent
Test runner · YAML executor · result reporter · SQLite cache
LAYER 2
Rig HAL
rig.can · rig.sim · rig.someip · rig.doip · rig.ecu — your tests live here
LAYER 1
Hardware
CAN · Ethernet · GPIO · Power · Qualcomm / Nvidia ECUs
Pricing

Start free. Scale with your team.

Open source core. Cloud-managed professional tier. Enterprise on your terms.

Open Source
$0 / forever

Self-hosted. Full feature set. Up to 2 rigs. Perfect for prototyping and small teams.

  • Up to 2 rigs
  • Full Python test authoring
  • Virtual + real hardware backends
  • MCP server (BYOK AI)
  • Docker Compose self-hosting
Get started free
Enterprise
Custom

On-premise control plane. SSO. Audit logs. Kubernetes. For teams with existing dSPACE or NI investment.

  • On-premise deployment
  • SSO / SAML / Active Directory
  • Audit logs + RBAC
  • dSPACE / NI adapters
  • Dedicated support engineer
Contact sales

Ready to modernize your HiL workflow?

Start free. No credit card. No dSPACE license. Just Python.