Skip to content

Plugins ​

Every backend is a plugin, Claude included. Plugins also add tools, ports and URI schemes.

PluginAdds
@ahpd/agent-claudeClaude Code
@ahpd/agent-cofoldcofold agents
@ahpd/agent-pipi
@ahpd/agent-acpCopilot, Codex, Gemini and other ACP agents
@ahpd/computerComputers and containers a session runs in
@ahpd/botBots
@ahpd/webhookWebhooks
@ahpd/pushPush notifications
@ahpd/tunnel-devtunnelA public URL through Dev Tunnels
@ahpd/webA web UI, at /plugins/web/

WARNING

A plugin runs in the daemon's process with its permissions. Install only plugins you trust.

Install and remove ​

bash
ahpd plugin install @ahpd/agent-pi
ahpd plugin list
ahpd restart

install runs npm install in the configuration directory (~/.config/ahpd) and adds the name to plugins in config.json. A change loads at the next restart.

CommandDoes
ahpd plugin install <name>Install and add to plugins
ahpd plugin install <name> --no-enableInstall only
ahpd plugin remove <name>Remove from plugins and uninstall
ahpd plugin remove <name> --keepRemove from plugins only
ahpd plugin enable <name>Turn on
ahpd plugin disable <name>Turn off, keep its options
ahpd plugin listShow each plugin and its state

A bare name installs the newest version that fits this daemon. @ahpd/agent-pi@1.2.0 or a tag goes to npm as written.

A plugin installed with npm i -g is not found

ahpd looks for a bare name in the configuration directory only. Use ahpd plugin install.

States ​

ahpd plugin list shows one of these per plugin:

StateMeans
readyLoads at the next start
disabledenabled: false in its entry
incompatibleNeeds another @ahpd/sdk than this daemon's
unconfiguredNeeds an option set first
missingNot installed
errorFails to import

Update ​

bash
ahpd plugin update all          # every plugin
ahpd plugin update @ahpd/agent-pi
ahpd plugin update all --force  # one npm call per plugin, so one failure does not stop the rest

Each plugin moves to its newest version whose @ahpd/sdk range fits this daemon. A plugin installed from a path, git or a URL is left as it is.

Options ​

bash
ahpd plugin config agent-claude                     # show
ahpd plugin config agent-claude workerStop session  # set
ahpd plugin config unset agent-claude workerStop    # remove

A value is JSON when it parses, and text otherwise. Quote a string that looks like a number: '"3"'. Each plugin's page lists its options.

The same in config.json:

json
{
  "plugins": [
    "@ahpd/agent-claude",
    { "name": "@ahpd/agent-pi", "options": { "model": "anthropic/claude-haiku-4-5" }, "enabled": false }
  ]
}

Credentials

Put a secret in the vault and name it, so it is not in config.json or your shell history:

bash
ahpd plugin config orders apiKey '{"$secret":"host:stripe"}'

For one run ​

FlagDoes
--plugin <spec>Load this plugin. Replaces the file's plugins list. Repeatable
--no-pluginsLoad none
--plugin-option <id>.<key>=<value>Set one option for this run. Repeatable
bash
ahpd --plugin @ahpd/agent-cofold --plugin ./my-plugin
ahpd --plugin-option agent-claude.presets.x.model=haiku

A spec is a package name or a path. A path is tried from the working directory, then from the configuration directory.

Where a plugin keeps its records ​

Each record is one Markdown file: ~/.config/ahpd/<collection>/<id>.md. You can edit, copy or delete it while the daemon runs, and the plugin sees the change.

Write one ​

See Writing a plugin.