Daemion docs

How do I create my first extension?

~3 minutes
Prerequisites: Running gateway

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:

text

Create a command called /hello that greets me by name.

Daemion will confirm what it’s about to create and then write the extension:

text

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:

json

{ “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:

bash
Verified

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:

text

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:

bash
Verified

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:

bash
Verified

curl -X POST http://localhost:3001/extensions/ext_09def789/toggle
-H “Authorization: Bearer $DAEMION_TOKEN”

Response (full extension object):

json

{ “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?

bash
Verified

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

Q Can I create an extension without chatting?
Yes. POST to /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.
Q What types can I create?
All 12: 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.
Q How does Daemion know what definition to write?
Daemion agents are Claude operating with knowledge of the extension schema. When you describe what you want, the agent maps your description to the correct type and fills in the definition fields validated by the gateway. If validation fails, it will retry with a corrected definition.
Q What if I want to create the same extension on another machine?
Export it with 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

Common creation errors

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?