How do I create my first extension?
The fastest way to create an extension is to describe it in chat. You don’t fill out forms — you tell Daemion what you want and the agent creates the extension record for you.
How do I create an extension through chat?
Open the Daemion app, start a new thread, and type:
Create a command called /hello that greets me by name.
Daemion will confirm what it’s about to create and then write the extension:
User: Create a command called /hello that greets me by name.
Daemion: I’ll create a /hello command that greets you by name.
[Creating extension…]
Done. I’ve created the /hello command. It’s enabled and ready to use. Try it in any thread — just type /hello.
The resulting extension record looks like this:
{ “id”: “ext_09def789”, “type”: “command”, “name”: “hello”, “description”: “Greet the user by name.”, “definition”: { “prefix”: ”/”, “handler”: “Greet the user warmly, using their name if you know it from context.” }, “source”: “agent”, “enabled”: true, “created_at”: “2026-03-31T09:00:00Z”, “updated_at”: “2026-03-31T09:00:00Z” }
How do I verify it works?
In any thread, type /hello and send it. The command routes to the agent, which runs the handler prompt and replies.
You can also confirm the extension exists via the API:
curl “http://localhost:3001/extensions?type=command&enabled=true”
-H “Authorization: Bearer $DAEMION_TOKEN”
Look for "name": "hello" in the response array.
How do I modify the extension?
Tell Daemion in chat what you want to change:
Update the /hello command to also ask how my day is going.
Or PATCH it directly via the API. The definition field is replaced wholesale — send the complete new definition:
curl -X PATCH http://localhost:3001/extensions/ext_09def789
-H “Authorization: Bearer $DAEMION_TOKEN”
-H “Content-Type: application/json”
-d ’{
“description”: “Greet the user and ask how their day is going.”,
“definition”: {
“prefix”: ”/”,
“handler”: “Greet the user warmly by name if known, then ask how their day is going.”
}
}’
definition is replaced wholesale on PATCH, not deep-merged. Always send the complete definition object — any keys you omit are removed.
How do I disable the extension?
Toggle it off without deleting it:
curl -X POST http://localhost:3001/extensions/ext_09def789/toggle
-H “Authorization: Bearer $DAEMION_TOKEN”
Response (full extension object):
{ “id”: “ext_09def789”, “type”: “command”, “name”: “hello”, “description”: “Greet the user by name.”, “definition”: { “prefix”: ”/”, “handler”: “Greet the user warmly, using their name if you know it from context.” }, “source”: “agent”, “enabled”: false, “created_at”: “2026-03-31T09:00:00Z”, “updated_at”: “2026-03-31T09:01:00Z” }
The /hello command disappears from the command palette in the app. Toggle again to re-enable it. The extension record is preserved.
How do I delete the extension?
curl -X DELETE http://localhost:3001/extensions/ext_09def789
-H “Authorization: Bearer $DAEMION_TOKEN”
Returns 204 No Content on success. This is permanent — prefer disabling via toggle if you might want to restore it.
Frequently asked questions
/extensions directly with a type, name, description, and definition. Chat is the primary path because the agent fills in the definition details for you — the API is for scripts and programmatic use.command, agent, job, app, theme, renderer, integration, action, widget, artifact, capability, control. Each type has its own definition shape. See the extension overview for the full table.definition fields validated by the gateway. If validation fails, it will retry with a corrected definition.GET /extensions/ext_09def789, copy the JSON, and POST it to the other gateway. Strip the id, created_at, and updated_at fields before posting — the new gateway will assign its own ID.What can go wrong
400 {"error": "validation failed", "details": [...]} — The definition object doesn’t match the required shape for the given type. For commands, prefix must be one of /, @, !, or # and handler must be a non-empty string. The details array shows exactly which fields failed.
403 {"error": "cannot disable essential extensions"} — Essential built-in extensions cannot be disabled. This won’t apply to your custom /hello command — only to core built-in extensions.
Extension created but /hello does nothing — The extension may have been created with enabled: false. Check with GET /extensions?type=command and toggle it on if needed.
What’s next?
- Extensions API — full CRUD reference for all 12 types
- Extension overview — the full type table and schema