Start with the current SDK: Follow the Quickstart to install the tools and create your first application. Historical preview evidence and limits remain available for reference.

Meet Micros · architecture & tradeoffs

One greenhouse.
An application you can change.

A greenhouse needs to measure its climate, control a fan, and show what is happening. Later, you will want to change how it responds.

Micros makes those jobs native services that you compose into an application. The resident base provides the kernel, platform support, and management facilities that load and manage them. Application changes can follow their own update path.

Design example: three proposed greenhouse services, used to explain Micros. The greenhouse implementation and readings below are illustrative.

01
Give each job a home

Three services. One shared kernel.

Start with three jobs: Climate sensor measures conditions, Fan controller applies the ventilation policy, and Status display explains the result. Each service instance runs its lifecycle hooks and callbacks on one worker.

One service model, across different controllers

Shared kernel code · a separate native build for each target

Responsibilities
The kernel owns the service lifecycle and resources. A separate supervisor task within its runtime detects overdue work. The underlying platform schedules workers; ESP32 uses ESP-IDF and FreeRTOS.

The service ABI connects compiled code. The Application Binary Interface defines lifecycle hooks and the kernel functions a service can call. Services compile separately; admission checks their target and ABI compatibility. The current ABI is experimental.

The platform interface connects the kernel to hardware. Each adapter provides tasks, time, memory, and supported hardware operations. Shared kernel source gets a target-specific build. Service binaries and required peripherals must also match the target.

The tradeoff

Native services have no enforced memory isolation. A fault can affect other services or management, and a stalled hook can require whole-runtime recovery.

Follow a service call through the ABI and platform layer →

02
Let the jobs work together

The greenhouse warms. The services respond.

The workers now need to exchange information. Climate sensor publishes a reading. Fan controller decides whether to ventilate and publishes its own status. Status display brings both messages together.

Follow the information through the application

Three services · two typed channels

Message flow

Each reader advances independently. Reading a message does not remove it for another service. The display can read climate and fan status at its own pace.

This design uses latest channels: each retains the current value, so a slow display may skip intermediate states. The two messages can arrive at different times; the display should use timestamps to check their freshness.
The choice

Choose retention for the information. Current temperature suits a latest-value channel. A history of transitions needs a bounded stream and explicit handling of missed messages. Successful publication alone does not establish that another service acted.

03
Turn the design into an application

One TOML. Three services. One application.

Those connections are application choices. An application TOML selects reusable service definitions, supplies settings and budgets, and binds ports to channels. Here is how the greenhouse's three jobs fit together.

Read the file beside the application it describes

applications/greenhouse.toml · illustrative excerpt

Composition
[services.climate]
manifest = "../services/climate/service.toml"
memory = { arena = "RAM", stack_bytes = 2048 }
publications.reading = { channel = "climate" }
Climate sensor

Select the implementation and publish readings to the climate channel.

[services.fan]
manifest = "../services/fan/service.toml"
memory = { arena = "RAM", stack_bytes = 2048 }
config = { start_celsius = 28 }
subscriptions.reading = { channel = "climate" }
publications.status = { channel = "fan_status" }
Fan controller

Use the same reading channel, set the ventilation threshold, and publish fan status.

[services.display]
manifest = "../services/display/service.toml"
memory = { arena = "RAM", stack_bytes = 2048 }
subscriptions.reading = { channel = "climate" }
subscriptions.fan = { channel = "fan_status" }
Status display

Subscribe to both channels. The bindings match the two incoming arrows above.

The channel aliases climate and fan_status refer to declarations for climate.reading and fan.status. The full design includes those declarations and schemas. The shown budgets are illustrative; implementations must be sized and validated.

One file assembles existing services. Each service's manifest describes its implementation and setting schema. A board file owns wiring; a deployment selects the board, application, and device. The application file brings the software together.

Explore the complete TOML design and try offline composition →

04
Make one useful change

Start the fan earlier. Keep the resident base.

Now suppose the greenhouse should ventilate sooner. Change Fan controller's startup setting from 28°C to 26°C, then prepare a new application selection. The resident base stays in place; on the normal ESP32 service-update path, the application graph pauses for staging.

Fan controller · startup configurationstart_celsius = 28start_celsius = 26

Follow the changed application through deployment

ESP32 service update · equal-width phases, not elapsed time

Behavior

All three greenhouse workers pause for staging, then the candidate runs as a trial. The new selection becomes recorded good after confirmation. Resident management remains available during a normal service update.

Changing one service's setting still uses the application update boundary. Replacing the kernel or platform support is a separate base-firmware operation. Native faults can disrupt management too.
Close the loop

A running application is the start of verification.

After deployment, inspect service health and diagnostics. Then check the behavior you intended: with a fresh, valid reading of 27°C, a fan starting off should now turn on and the display should report it.

Test input27°CFresh, valid climate reading
Old threshold · 28°CFan stays offTemperature below threshold
New threshold · 26°CFan turns onDisplay reports the new status

Illustrative acceptance check for the proposed policy. Runtime trial confirmation establishes liveness; the fan response and display result establish application behavior.

Understand rejection, failed trials, and recovery →

Take this model into your own application.

Evaluate whether Micros fits your requirements, then follow the architecture or try an existing application.

Try composition locally Inspect a real sensor application without a device.Explore the service contract ABI, lifecycle, resource ownership, and platform support.Choose your hardware Follow the setup path for your target.

Contracts behind the story: worker ownership and supervision, bounded channels, composition, and updates and recovery.