Skip to main content
Surfaces let your extension add UI content to predefined locations in the Aether interface without replacing built-in components. Each surface registration targets a named slot and contributes a declarative UI tree that Aether renders in that location alongside any other registered content.

API signature

registerSurface returns a cleanup function. Call it to remove the surface registration and trigger a re-render.

Available slots

SlotLocation
app.overlayFull application overlay
chat.topUnder the chat top bar
chat.emptyEmpty-conversation surface
chat.list.startBefore committed messages
chat.list.endAfter messages and pending work
chat.composer.topDirectly above the composer
settings.hubTop of the settings hub
drawerConversation drawer

SurfaceDefinition fields

id
string
required
Unique identifier for this surface registration. Aether uses this to track and de-duplicate registrations from the same extension.
order
number
Controls the rendering order when multiple extensions register the same slot. Lower values render first. Defaults to 0 when omitted.
render
function
required
A factory function that receives a render context and returns a ui node tree. The function may be synchronous or async.

Render context

Aether passes the following fields to your render function on every render cycle:
FieldTypeDescription
is_runningbooleanWhether the agent is currently generating a response
draft_inputstringThe current text in the composer input
storageobjectA snapshot of your extension’s persisted storage at render time

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.
Use order to ensure your surface renders in the right position when multiple extensions contribute to the same slot. Registrations with the same order value are sorted by their scoped ID as a stable tiebreaker.