Create package.json
Create a The
package.json that points Aether to your entry file:package.json
aether.extensions array tells Aether which files to load as Script Mods. You can list multiple entry files if needed, but one is enough here.Create the extension entry file
Create
index.ts with a surface registration and an action handler:index.ts
defineAetherExtension wraps your factory and provides full TypeScript types for the aether API. registerAction binds the string "insert-prompt" to a handler that writes to the draft_input state path. registerSurface injects your button into the chat.composer.top slot — directly above the message input field.Zip the extension
Package the directory as a zip archive:The zip must contain
package.json and your entry file at the root level (not inside a subdirectory).Install in Aether
Open Aether → Settings → Extensions → Import. Select
my-first-extension.zip. Aether extracts the package into ~/.aether/extensions and hot-loads the extension immediately — no restart required.Test the extension
Navigate to the chat screen. You should see the Insert summary prompt button rendered above the composer input. Tap it — Aether calls your
insert-prompt action handler, which patches draft_input with the preset text. The composer field fills instantly.If the button does not appear, open Settings → Extensions and confirm your extension is listed and enabled. Check the error log on that screen for any load-time issues.Next steps
Extend your mod further with the full Script Mod API:UI Surfaces
Register content in additional chat and settings slots, or replace built-in Compose components entirely.
State API
Read and write app state paths including
draft_input, selected_skill_ids, agent_mode_enabled, and more.Pages
Add full-screen drawer pages with native Compose layouts driven entirely from TypeScript.
Native Mods
Unlock full Android and Compose access by writing Kotlin DEX mods that load at process startup.