Get started
ClickClack
ClickClack connects OmeniaClaw to a self-hosted ClickClack workspace through first-class ClickClack bot tokens.
Use this when you want an OmeniaClaw agent to appear as a ClickClack bot user. ClickClack supports independent service bots and user-owned bots; user-owned bots keep an owner_user_id and receive only the token scopes you grant.
Quick setup
Create a bot token in ClickClack:
clickclack admin bot create \ --workspace <workspace_id_or_slug> \ --name "OmeniaClaw" \ --handle OmeniaClaw \ --scopes bot:write \ --plainFor a user-owned bot, add --owner <user_id>.
Configure OmeniaClaw:
{ plugins: { entries: { clickclack: { llm: { allowAgentIdOverride: true, }, }, }, }, channels: { clickclack: { enabled: true, baseUrl: "https://app.clickclack.chat", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", agentId: "clickclack-bot", replyMode: "model", }, },}Then run:
export CLICKCLACK_BOT_TOKEN="ccb_..."OmeniaClaw gatewayIf plugins.allow is a non-empty restrictive list, explicitly selecting
ClickClack in channel setup or running OmeniaClaw plugins enable clickclack
appends clickclack to that list. Onboarding installation uses the same
explicit-selection behavior. These paths do not override plugins.deny or a
global plugins.enabled: false setting. Direct OmeniaClaw plugins install clickclack follows the normal plugin-install policy and also records ClickClack
in an existing allowlist.
Multiple bots
Each account opens its own ClickClack realtime connection and uses its own bot token.
{ plugins: { entries: { clickclack: { llm: { allowAgentIdOverride: true, }, }, }, }, channels: { clickclack: { enabled: true, baseUrl: "https://app.clickclack.chat", defaultAccount: "service", accounts: { service: { token: { source: "env", provider: "default", id: "CLICKCLACK_SERVICE_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", agentId: "service-bot", replyMode: "model", }, peter: { token: { source: "env", provider: "default", id: "CLICKCLACK_PETER_BOT_TOKEN" }, workspace: "default", defaultTo: "dm:usr_...", agentId: "peter-bot", replyMode: "model", }, }, }, },}replyMode: "model" uses api.runtime.llm.complete directly for short bot replies.
When an account sets agentId, OmeniaClaw requires the explicit
plugins.entries.clickclack.llm.allowAgentIdOverride trust bit so the plugin
can run completions for that bot agent. Keep it off if you only use the default
agent route.
Targets
channel:<name-or-id>sends to a workspace channel. Bare targets default tochannel:.dm:<user_id>creates or reuses a direct conversation with that user.thread:<message_id>replies in an existing thread.
Examples:
OmeniaClaw message send --channel clickclack --target channel:general --message "hello"OmeniaClaw message send --channel clickclack --target dm:usr_123 --message "hello"OmeniaClaw message send --channel clickclack --target thread:msg_123 --message "following up"Permissions
ClickClack token scopes are enforced by the ClickClack API.
bot:read: read workspace/channel/message/thread/DM/realtime/profile data.bot:write:bot:readplus channel messages, thread replies, DMs, and uploads.bot:admin:bot:writeplus channel creation.
OmeniaClaw only needs bot:write for normal agent chat.
Troubleshooting
ClickClack is not configured: setchannels.clickclack.tokenorCLICKCLACK_BOT_TOKEN.workspace not found: setworkspaceto the workspace id or slug returned by ClickClack.- No inbound replies: confirm the token has realtime read access and the bot is not replying to its own messages.
- Channel sends fail: verify the bot is a member of the workspace and has
bot:write.