// the take
libcanard is a compact C implementation of the Cyphal/CAN transport layer (plus legacy UAVCAN v0/DroneCAN support), aimed at firmware engineers building real-time CAN bus nodes for aerospace, robotics, or vehicle systems where MISRA compliance and tiny memory footprints matter. It handles transfer framing/reassembly and CAN acceptance filtering, not application-level message definitions.
Supports Classic CAN and CAN FD across redundant and non-redundant interfaces, with automatic CAN hardware acceptance filter generation derived from the current subscription set. The v5 rewrite swapped O(n) linked lists for AVL trees and introduced per-transfer TX queues with frame dedup across redundant interfaces, roughly halving heap usage. The platform interface is deliberately minimal (alloc/free, tx, now callbacks), so porting to a new MCU is small, and it runs on 32KB ROM/RAM targets. The RX pipeline keeps concurrent reassemblers per priority level, fixing a real bug class where a higher-priority multi-frame transfer arriving mid-transfer used to cause transfer loss.
Major versions (v2 through v5) have repeatedly changed core memory-management and TX APIs, so upgrading across more than one major version means working through several migration guides, not a drop-in bump. The library does no DSDL (de)serialization itself — it depends on an external generator (Nunavut) for actual message encoding, so this is only half of what you need to talk Cyphal. v5 is explicitly designed around being used with a separate node framework (Cy) rather than standalone, which makes the plain quick-start path a second-class use case. The user base is a narrow aerospace/robotics/CAN-bus niche, so edge-case bugs in the reassembly state machine (several of which show up in the changelog) take time to surface and land fixes for.
We read the README, the directory tree and a key source file in October 2026. Nobody pays to be listed. How we judge →