API signature
registerSurface returns a cleanup function. Call it to remove the surface registration and trigger a re-render.
Available slots
Drawer slots and ordering
Thedrawer.header and drawer.footer slots remain fixed while the conversation list scrolls.
The legacy drawer slot remains supported and renders at the tail of the conversation list in this order:
drawerdrawer.list.end- Built-in extension page launchers
Drawer opened event
Listen todrawer.opened to trigger logic when the conversation drawer opens:
drawer.opened fires once for each closed-to-open transition, including swipe gestures. On tablet, it fires once when the permanent drawer enters composition (stable-open recompositions do not re-trigger it).
SurfaceDefinition fields
string
Unique identifier for this surface registration. Aether uses this to track and de-duplicate registrations from the same extension. If omitted, Aether generates one from the slot and registration order.
number
Controls the rendering order when multiple extensions register the same slot. Lower values render first. Defaults to
0 when omitted.function
A factory function that receives a render context and returns a
ui node tree. The function may be synchronous or async. Use either render or tree.object
A static
ui node tree used when render is omitted.Render context
Aether passes fields including the following to yourrender function on every render cycle:
Example
index.ts
Call
aether.invalidate() to force a re-render of all surfaces when your extension’s internal state changes. Aether does not automatically re-render surfaces on arbitrary extension-side mutations — only on storage writes, action invocations, and explicit invalidation.