Building Channel Plugins
This guide walks through building a channel plugin that connects FluffBuzz to a messaging platform. By the end you will have a working channel with DM security, pairing, reply threading, and outbound messaging.If you have not built any FluffBuzz plugin before, read
Getting Started first for the basic package
structure and manifest setup.
How channel plugins work
Channel plugins do not need their own send/edit/react tools. FluffBuzz keeps one sharedmessage tool in core. Your plugin owns:
- Config — account resolution and setup wizard
- Security — DM policy and allowlists
- Pairing — DM approval flow
- Outbound — sending text, media, and polls to the platform
- Threading — how replies are threaded
Walkthrough
Package and manifest
Create the standard plugin files. The
channel field in package.json is
what makes this a channel plugin:Build the channel plugin object
The
ChannelPlugin interface has many optional adapter surfaces. Start with
the minimum — id and setup — and add adapters as you need them.Create src/channel.ts:src/channel.ts
What createChatChannelPlugin does for you
What createChatChannelPlugin does for you
Instead of implementing low-level adapter interfaces manually, you pass
declarative options and the builder composes them:
You can also pass raw adapter objects instead of the declarative options
if you need full control.
| Option | What it wires |
|---|---|
security.dm | Scoped DM security resolver from config fields |
pairing.text | Text-based DM pairing flow with code exchange |
threading | Reply-to-mode resolver (fixed, account-scoped, or custom) |
outbound.attachedResults | Send functions that return result metadata (message IDs) |
Wire the entry point
Create
index.ts:index.ts
defineChannelPluginEntry handles the setup/full registration split
automatically. See
Entry Points for all
options.Add a setup entry
Create FluffBuzz loads this instead of the full entry when the channel is disabled
or unconfigured. It avoids pulling in heavy runtime code during setup flows.
See Setup and Config for details.
setup-entry.ts for lightweight loading during onboarding:setup-entry.ts
Handle inbound messages
Your plugin needs to receive messages from the platform and forward them to
FluffBuzz. The typical pattern is a webhook that verifies the request and
dispatches it through your channel’s inbound handler:
Inbound message handling is channel-specific. Each channel plugin owns
its own inbound pipeline. Look at bundled channel plugins
(e.g.
extensions/msteams, extensions/googlechat) for real patterns.Test
Write colocated tests in For shared test helpers, see Testing.
src/channel.test.ts:src/channel.test.ts
File structure
Advanced topics
Threading options
Fixed, account-scoped, or custom reply modes
Message tool integration
describeMessageTool and action discovery
Target resolution
inferTargetChatType, looksLikeId, resolveTarget
Runtime helpers
TTS, STT, media, subagent via api.runtime
Next steps
- Provider Plugins — if your plugin also provides models
- SDK Overview — full subpath import reference
- SDK Testing — test utilities and contract tests
- Plugin Manifest — full manifest schema