Architecture overview
OpenEmber uses a five-layer model (dependencies flow downward):
- Application layer — apps, launches, demos, tools
- Module layer — pluggable features (transports, drivers, algorithms, bridges)
- Component layer — shared building blocks (logging, serialization, containers, config, …)
- Core layer — middleware runtime (node lifecycle, scheduling, topics, parameters, services)
- Platform layer — OS abstraction and HAL (threads, timers, sockets, UART, GPIO, I2C, …)
In the openember tree this maps roughly to apps/, modules/, components/, core/, platform/, plus helper dirs such as third_party/, configs/, tools/.
Dependency direction
apps
↓
modules
↓
components
↓
core
↓
platform
↓
Operating system (Linux, …)
Upper layers depend on lower layers, not the reverse—making tests and backend swaps (e.g. transport or HAL) easier.
Design goals (summary)
- Extensible: plugin-style modules and Kconfig trimming for different products.
- Dependency management: options such as
OPENEMBER_THIRD_PARTY_MODE(FETCH / VENDOR / SYSTEM) for CI and offline builds. - Stable APIs: pub/sub style interfaces with swappable implementations (NNG, LCM, ZeroMQ, …) depending on project configuration.
For the full layered specification, see the upstream design guide.