Renode · Verilator · Docker

Hardware CI that actually understands your boards.

Describe a board in one .hector.yaml and Hector builds the platform, runs it in simulation, and tests the firmware — locally or in your pipeline. The CLI is free and open source. Hector CI adds the dashboard, runner pool, audit logs — and Live View, a browser window into the running simulation.

Open source CLI Commercial CI license Self-hosted panel
Free & open source

Hector CLI

The engine. Define hardware in YAML, generate the Renode platform, run firmware and tests — on your machine, in any CI.

  • One .hector.yaml → a complete Renode platform
  • Robot & shell tests, matrix jobs, build steps
  • Verilator co-simulation & custom peripherals
  • Runs anywhere Docker runs — zero lock-in
pip install hector-cli

Linux only for now (macOS & Windows planned).

View on GitLub →

AGPL-3.0 · community supported

Commercial license

Hector CI

The team layer on top of the CLI: a dashboard, a runner pool, and the things you need to ship hardware as a team.

  • Live View new — open the running simulation in the browser
  • Runner pool — isolated, scalable build runners
  • Designer — build the platform visually, YAML in sync
  • Playground — run any pipeline with no repo
  • Audit logs — every action, filterable
  • Multi-user — accounts, roles, private repos
  • Webhooks — GitLub / GitLab triggers
New in Hector CI

See inside the machine your CI is testing.

Simulated hardware is normally a black box: a pass/fail and a wall of logs. Live View opens it. Boot your platform on a runner — the same simulation hector run executes, real firmware and custom peripherals included — then explore the resolved hardware, watch properties change as the firmware runs, call peripheral methods, and drop into the real Renode console.

Live View — mcu on runner-1
Live View showing an STM32F103 machine as a block diagram with peripherals and wiring, a Renode output panel streaming firmware logs, and a watch on led.State.
The resolved platform, live firmware output and a property watch updating as it runs.
Tree view of 14 peripherals with address ranges; the button peripheral expanded showing Press, Release and OnGPIO methods.
Call methods from the UI. Every peripheral Renode actually built, with its reflected methods and signatures. Press a button, toggle a line — with a click.
Renode Monitor terminal showing firmware boot output followed by typed monitor commands.
The real Renode console. Attach for a full Monitor terminal — input plus live output, not a log viewer. Watches keep updating while you're attached.
Snapshot menu listing saved snapshots with restore, download and delete actions.
Whole-machine snapshots. Capture the emulation at any point, restore it later, download it or share it. A session can boot straight from a .save.
Live View source picker on the Repository tab with repository, branch and matrix-job fields.
Repo, YAML or snapshot. A connected repo checks out on the runner and builds the real thing. Or paste a .hector.yaml for a quick look.

The resolved platform, not your config

Every peripheral Renode instantiated, with type, address range and GPIO/IRQ wiring — as a diagram or a tree. Not what the YAML said; what the emulator built.

Event-driven watches

Subscribe to any property and values arrive on change. No polling, no sampling gaps.

Runs on your runners

Each session is a job on your own runner pool, isolated per user and released when idle. Firmware and source never leave your network.

And it works on a phone.

Full layout down to 390px — the peripheral tree, the controls, and firmware output as a bottom sheet.

Live View on a phone showing the session controls and the peripheral tree. Live View on a phone with the Renode output panel open as a bottom sheet.

The rest of the dashboard

Live View is the new part. Everything around it is a complete CI system.

Run detail showing two matrix jobs over two boards, four build/simulate/test steps with durations, and tabs for tests, topology and artifacts.
Run detail. Matrix jobs fanned out across boards, per-step timings, test results, topology and artifacts.
Repositories grid showing three firmware repos with running, passed and failed status badges.
Repositories. Every connected repo with the state of its last run. Trigger on push, PR, tag or cron.
Agents page showing three runners with capacity, running jobs, free slots and labels.
Agents. Your runner pool — capacity, what's in flight, and labels for targeting specific hardware.
Designer with a machine on the canvas, a configuration panel and the generated .hector.yaml alongside.
Designer. Build the platform visually on a canvas — the .hector.yaml stays in sync both ways.

Built for teams

User management table listing users with admin flags.
Multi-user with admin roles
Audit log table of actions with user, method, path, status and IP, plus filters.
A full, filterable audit log
Settings page with the job timeout configuration.
Global settings and job timeouts

Screenshots are the shipping interface, captured from the current build. The data in them — repos, runs and timings — is illustrative sample data, not benchmarks.

Everything in Hector CI

Live View new

Open a running simulation in the browser: resolved platform, live watches, callable peripheral methods, the real Renode console and whole-machine snapshots.

Topology viewer

Renode parses your platform; the dashboard renders the real peripherals, GPIO and wiring — not a guess.

Matrix jobs

Fan out across parameters and run them in parallel on the runner pool.

Live logs & tests

Stream step output and Robot/shell results as they happen.

Artifacts

Collect ELFs, logs, traces and reports from every run.

Audit trail

Who did what, when — filterable by user, action and time.

Self-hosted

Runs entirely on your infrastructure. Your firmware never leaves your network.

Designer

Build the platform visually on a canvas — the .hector.yaml stays in sync both ways.

Playground

Run a .hector.yaml with no repo connected at all — paste it and go.

Interactive

See your hardware, not vague boxes

This is the platform diagram from Live View, running right here — built from the stm32f103-full example that ships with the CLI. Click the machine to open it, drag the blocks, drag the background to pan. ×N on a wire means that many individual pin or IRQ lines aggregated into one.

.hector.yamlthe source this diagram is built from — read only
version: "0.1"
renode_version: "1.16.1"

arguments:
  BIN: "https://dl.antmicro.com/projects/renode/zephyr-stm32f103-button.elf-..."

machines:
  blackpill:
    firmware: ${BIN}

    peripherals:
      # mcu — the complete STM32F103. An inert CombinedInput registered @ none:
      # it groups the MCU peripherals without touching the bus.
      mcu:
        type: Miscellaneous.CombinedInput
        at: none
        numberOfInputs: 1
        peripherals:
          flash:     { type: Memory.MappedMemory,        at: sysbus 0x00000000, size: "0x20000000" }
          sram:      { type: Memory.MappedMemory,        at: sysbus 0x20000000, size: "0x10000000" }
          nvic:      { type: IRQControllers.NVIC,        at: sysbus 0xE000E000, priorityMask: "0xF0" }
          cpu:       { type: CPU.CortexM,                at: sysbus, cpuType: cortex-m3, nvic: nvic }
          exti:      { type: IRQControllers.STM32F4_EXTI, at: sysbus 0x40010400, numberOfOutputLines: 19 }
          gpioPortA: { type: GPIOPort.STM32F1GPIOPort,   at: sysbus <0x40010800, +0x400> }
          gpioPortC: { type: GPIOPort.STM32F1GPIOPort,   at: sysbus <0x40011000, +0x400> }
          usart1:    { type: UART.STM32_UART,            at: sysbus <0x40013800, +0x100> }
          usart2:    { type: UART.STM32_UART,            at: sysbus <0x40004400, +0x100> }
          i2c1:      { type: I2C.STM32F4_I2C,            at: sysbus 0x40005400 }
          timer1:    { type: Timers.STM32_Timer,         at: sysbus 0x40012c00, frequency: 10000000 }
          # … usart3-5, i2c2, timer2-14, gpioPortB/D/E/F/G, afio, nvicInput23/40

        connections: |
          nvic.IRQ -> cpu@0

          usart1 -> nvic@37
          usart2 -> nvic@38
          i2c1.EventInterrupt -> nvic@31
          i2c1.ErrorInterrupt -> nvic@32

          # EXTI fan-out: lines 0-4 direct, 5-9 and 10-15 via combiners
          exti[0-4]   -> nvic@[6-10]
          exti[5-9]   -> nvicInput23@[0-4]
          exti[10-15] -> nvicInput40@[0-5]
          nvicInput23 -> nvic@23
          nvicInput40 -> nvic@40

          # every GPIO line into EXTI — this is where the ×16 wires come from
          gpioPortA[0-15] -> exti@[0-15]
          gpioPortC[0-15] -> exti@[0-15]
          # … timer interrupts and alternate-function pin routing

      # the board's user button, on PC13
      button:
        type: Miscellaneous.Button
        at: gpioPortC 13

    connections: |
      button -> gpioPortC@13

    init: |
      ApplySVD @https://dl.antmicro.com/projects/renode/svd/STM32F103.svd.gz
      Tag <0x40021000, 0x40021003> "RCC_CR" 0x0A020083

    commands: |
      showAnalyzer usart2

This is a reproduction, not a live session. It's a faithful copy of the real component — same layout, same wiring, same resolved address ranges Renode reports — but the peripheral list is trimmed for legibility (the full board also carries usart3-5, timer4-14 and gpioPortF/G), and nothing here is connected to a backend. The real Live View does considerably more: it boots your firmware on a runner, then lets you watch properties update as it runs, call peripheral methods, attach a Renode console and snapshot the whole machine.

Pricing

The CLI is free forever. Hector CI is licensed per deployment — talk to us and we'll size it to your team.

CLI

Free

open source

  • Full simulation toolchain
  • All test types
  • Community support
Get started

Enterprise

Custom

SSO · SLA · on-site

  • Dedicated support
  • Custom integrations
  • Training & onboarding
Contact sales

Request a license or a demo

Tell us a little about your team and we'll get you set up — including a live walkthrough of the dashboard and a hands-on look at Live View.

We'll reply by email. Your details are stored only for us to get back to you.