Product

The gate that decides if your firmware ships.

Every pull request gets one pass/fail verdict — build, boot, behavior, footprint, stack and MISRA. Advisory by default, so you see whether it's safe to merge; on the Team plan it becomes a required check that blocks the merge when it fails. It compiles, boots the real binary in an emulator, and runs your tests, all on the PR. No hardware lab required.

How a check runs

1

Open a PR

2

Build firmware

3

Boot in emulator

4

Run tests

5

Apply the gate

6

Pass / block the merge

On every pull request

Everything a firmware check should tell you

The merge gate

One pass/fail verdict per PR. Set flash / RAM / stack / MISRA budgets in .embedci.yml. Advisory by default (Free): the verdict tells you whether the PR would merge but never blocks it. On Team it runs as a required check that actually stops the merge, showing the limit and the actual value. Fully opt-in.

Boot + behavioral tests

Boots the exact .elf you'd flash in Renode and runs your Robot Framework tests — assert UART output, GPIO pin state, and memory-mapped peripheral registers, all without hardware.

Firmware footprint

Flash and RAM usage with a per-section breakdown (text / rodata / data / bss) and the delta vs the previous build, so size creep shows up right in the PR.

Stack high-water mark

Worst-case stack frame from the build (via -fstack-usage), so stack growth surfaces before it overflows on a real device.

Static analysis

cppcheck with the MISRA C add-on, reported per finding with the rule number and file:line — cert-relevant signal, not a wall of noise.

Runs on every PR

Installed as a GitHub App. On each pull request EmbedCI clones, builds, emulates, tests, and posts a single pass/fail check — no manual flashing or test bench.

The gate

Turn metrics into merge rules.

Add a gates: block to your .embedci.yml and pick a mode. In advisory (Free) the verdict tells you whether the PR would merge but never blocks it; flip to blocking (Team) and, as a required check, a violation stops the merge — even if the build and tests otherwise pass. Fully opt-in: with no gates block, nothing is enforced.

See a failing gate →
.embedci.yml
board: stm32f4_disco
mode: blocking
gates:
  flash_max_pct: 95
  ram_max_pct: 90
  stack_max_bytes: 2048
  flash_growth_bytes: 512
  misra_max: 0
tests/gpio.robot
*** Settings ***
Resource    ${RENODEKEYWORDS}
Resource    ${EMBEDCI_KEYWORDS}

*** Test Cases ***
LED drives high
    Wait For Uart Line    LED on
    Pin Should Be High    0x40020C14    12
Behavioral testing

Assert what the firmware actually does.

Tests use Robot Framework with Renode. Beyond UART, EmbedCI ships a keyword library (${EMBEDCI_KEYWORDS}) for asserting registers, memory, and GPIO pin state against the emulated hardware — so you verify behavior, not just that it compiles.

Compliance

Build the evidence trail the CRA will ask for.

Every PR already records MISRA findings and firmware footprint — an audit trail that accrues automatically instead of being assembled by hand. Firmware SBOM generation and one-click evidence export are on the roadmap for the EU Cyber Resilience Act, whose vulnerability-reporting obligations land in September 2026.

Built on Renode — broad MCU coverage

Runs Zephyr firmware on the MCU families Renode emulates. stm32f4_disco is validated end-to-end today; more boards are being verified.

STM32 F-series

stm32f4_disconucleo_f401renucleo_f746zg

STM32 H/G/L-series

nucleo_h743zinucleo_g071rbnucleo_l073rz

Nordic

nrf52840dkarduino_nano_33_ble

NXP

mimxrt1064_evkfrdm_k64f

Renesas

ek_ra4m2ek_ra6m4ek_ra8m1

Microchip

sam4s_xplainedatsamd51_xpro

Will it work for your project?

EmbedCI runs today when all three are true:

  • Firmware built with Zephyr (uses west build)
  • A board Renode can emulate — the families above; stm32f4_disco is validated end-to-end today
  • Hosted on GitHub (EmbedCI installs as a GitHub App)

On a different RTOS or toolchain (FreeRTOS, bare-metal, ESP-IDF) or an unsupported board, it won't run yet — that's on the roadmap.

Add EmbedCI to your repo