← Back to PRs

#7883: feat: add Campfire channel plugin

by frankdierolf open 2026-02-03 08:44 View on GitHub →
gateway size: XL
### Hola :wave: So, I'm Frank. and I would love to have native integration for campfire. This is the PR. **Notes:** I am currently using it with openclaw. And gave my clients access to it. They like it, because they have a highly capable AI and everything nicely secured on on Hetzner server with their own seperate Email Hosting and everything is nicely encapsulated to let openclaw run like a wild child. So back to the code, from my side I can approve this integration also the code makes sense and follows the pattern from other Channels. There is a little quirk. The bot cant read messages in the chat room, so created a workaround which logs in as a seperate Users and just looks thruh messages. It a campfire-cli that I built for that. Great for write every 3 hours a summaries of the Channels and post it to the board, so a nice log of who does what in each channel. Securit wise, if the "Observer Account" only read the message where is invited, not really used but a nice byproduct. Anyways, thats blabla, I just wanted to say, I tested it and work with it. To be blunt I am not so certain if I dived in every little possible aspect, for that is the current openclaw codebase a bit too much. So I resolved it by focusing on just channel plugin and that was easier to grasp and fits in my head. Happy about that PR Thanks for the work! **Best regards,** Frank :beers: --- *AI PR Text, follows the template and is approved by me* #### Summary Add Campfire channel plugin for 37signals' self-hosted chat. Closes #7880 lobster-biscuit #### Use Cases - Teams using 37signals Campfire for internal chat want openclaw to respond to @mention messages in rooms — same as Telegram, Discord, Slack, WhatsApp - Bot listens via webhook, processes messages asynchronously (Campfire has a 7-second webhook timeout), and replies as text or attachments #### Behavior Changes New extension `extensions/campfire/` — no changes to existing code. - Registers HTTP handler at configurable webhook path (default `/campfire`) - Processes inbound @mention webhooks with group policy / user allowlist checks - Sends text replies (plain text POST) and attachments (multipart form-data) - Supports multi-account configuration with env vars or inline config - Block streaming with coalesced updates (1500 chars / 1s idle) Configuration: ```yaml channels: campfire: baseUrl: https://your-campfire.example.com botKey: "{id}-{token}" webhookPath: /campfire groupPolicy: open # disabled | allowlist | open requireMention: true ``` Env vars: `CAMPFIRE_BOT_KEY`, `CAMPFIRE_BASE_URL`, `CAMPFIRE_WEBHOOK_PATH` #### Existing Functionality Check - [x] I searched the codebase for existing functionality. Searches performed: - Checked all channel plugins (Telegram, Discord, Slack, WhatsApp, BlueBubbles) for patterns to follow - Searched for existing Campfire/37signals references — none found - Verified plugin SDK types (ChannelPlugin, ChannelDock) and reused shared utilities (chunkMarkdownText, resolveEnvelopeFormatOptions, dispatchReplyWithBufferedBlockDispatcher) #### Tests - `pnpm check` passes (lint + format) - No unit tests yet (extension-only, no existing test patterns for webhook channel plugins) #### Manual Testing ##### Prerequisites - A running Campfire instance with a bot configured (bot key from Campfire settings) - openclaw running with campfire channel enabled ##### Steps 1. Configure `channels.campfire.baseUrl` and `channels.campfire.botKey` 2. Set up Campfire bot webhook URL pointing to `<openclaw-url>/campfire` 3. @mention the bot in a Campfire room 4. Verify openclaw receives the webhook, processes the message, and replies in the room 5. Send an image attachment — verify it arrives as a multipart upload **Sign-Off** - Models used: Claude Opus 4 - Submitter effort: manual E2E testing with live Campfire instance - Agent notes: Plugin follows existing channel patterns (Telegram extension used as primary reference). Greptile review addressed: filename sanitization added, unused exports removed. ## AI-Assisted Contribution 🤖 - [x] Marked as AI-assisted - [x] Degree of testing: lightly tested (live Campfire instance, manual E2E) - [x] I understand what the code does

Most Similar PRs