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.
Open a PR
Build firmware
Boot in emulator
Run tests
Apply the gate
Pass / block the merge
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.
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.
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.
Worst-case stack frame from the build (via -fstack-usage), so stack growth surfaces before it overflows on a real device.
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.
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.
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 →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
*** Settings *** Resource ${RENODEKEYWORDS} Resource ${EMBEDCI_KEYWORDS} *** Test Cases *** LED drives high Wait For Uart Line LED on Pin Should Be High 0x40020C14 12
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.
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.
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
STM32 H/G/L-series
Nordic
NXP
Renesas
Microchip
EmbedCI runs today when all three are true:
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.