Skip to main content
Native Compose components give you full Jetpack Compose access when replacing or wrapping Aether’s built-in UI. They surround the Script component pipeline — a Native Replace is decisive over Script-level replacements, and Native Wrap components sit on the outside of all Script component wrappers.

API

Call context.registerComponent() inside onLoad:
ParameterDescription
targetThe built-in component target to modify (see target table below).
idA stable string identifier for this registration.
modeHow this renderer interacts with the target (see mode table below).
priorityWithin a mode, higher-priority registrations are evaluated last — the last Replace or Hide wins.
rendererAn AetherNativeComponentRenderer implementation. May be null for Hide mode.

AetherNativeComponentMode values

ModeBehaviour
BeforeRenders immediately before the target content.
AfterRenders immediately after the target content.
ReplaceReplaces the target content. The last Replace registration (by priority, then registration order) is decisive.
WrapSurrounds the resolved center content. Multiple Wrap registrations compose outward.
HideSuppresses the target entirely. The last Hide registration wins.

Built-in component targets

TargetBuilt-in UI
app.contentEntire routed Aether application content.
chat.screenComplete chat screen.
settings.screenComplete settings screen.
chat.composer.actionTraySelected Skill / MCP / Agent Mode tray.
chat.composer.skillPickerSkill rows in the composer plus menu.

AetherNativeComponentRenderer interface

The context parameter provides:
PropertyTypeDescription
targetStringThe target string this renderer was registered for.
uiStateAetherUiStateAether’s full internal UI state.
publicStateJSONObjectA JSON snapshot of the public app state.
hostAetherNativeHostAn async bridge for invoking host methods.
The next parameter is a @Composable () -> Unit representing the downstream content — either the built-in Compose implementation, Script component replacements, or the next Native component. Call next() inside Wrap mode renderers to render the wrapped content.

Example — Replace mode

Replace the action tray with custom Compose content:
MyNativeMod.kt

Example — Wrap mode

Surround the existing action tray with additional content:

Example — Hide mode

Suppress the skill picker entirely (no renderer required):
Compose renderers must be compiled with the Compose compiler version matching the Aether build they target. A version mismatch can cause crashes at class loading time. See the Safe Mode page for recovery options.