watchfire integrations
Manage Watchfire's outbound delivery adapters and inbound HTTP integrations from the command line.
Manage the Integrations layer — outbound adapters (webhook, Slack, Discord, GitHub auto-PR) and the inbound HTTP server that lets external services drive the daemon back. The parent command groups every integrations-related subcommand.
Usage
watchfire integrations <subcommand>
The CLI is the scriptable surface. The same operations are available interactively in the TUI (Integrations overlay on Ctrl+I) and in the GUI (Settings → Integrations).
Subcommands
integrations list
List configured outbound and inbound integrations.
watchfire integrations list
Prints one row per integration with its name, type (outbound adapter or inbound provider), and a status pill — OK, Disabled, Breaker open, or Misconfigured.
integrations test <name>
Fire a synthetic event through the named adapter to verify wiring end-to-end (signature, transport, render).
watchfire integrations test slack
watchfire integrations test webhook
Synthetic events are clearly labelled in the rendered output so they're easy to identify in the receiving channel.
integrations register-discord <guild_id>
Register or refresh the Watchfire slash-command set in a Discord guild.
watchfire integrations register-discord 123456789012345678
Calls Discord's bulk-overwrite endpoint with the current command schema (/watchfire status, /watchfire retry <task>, /watchfire cancel <task>). The command is idempotent — re-running upserts the schema without producing duplicates, so you can safely re-run after upgrading Watchfire to pick up new commands.
This drives the inbound side of the integration. For the outbound Discord adapter (the one that posts task and digest envelopes into a channel) see the Outbound section of the Integrations concept page.
Prerequisites
- The Discord application's public key has been saved as the inbound Discord secret (write-only) in GUI Settings → Integrations → Inbound or via the equivalent TUI overlay.
- The Watchfire daemon is reachable at
PublicURLso Discord can callPOST /echo/discord/interactions. - The Discord application has been added to the target guild with the
applications.commandsscope.
Notes
- All three subcommands are project-scoped — run them from inside a Watchfire-initialised project.
- Outbound and inbound configuration live in
~/.watchfire/integrations.yaml; secrets live in the OS keyring (with a file-store fallback) and never enter the YAML on disk. - For the on-the-wire shape, the
IntegrationsServicegRPC hasList/Save/Delete/TestRPCs;Savecarries aoneofpayload and secret fields are write-only.
Examples
Audit what's currently wired
watchfire integrations list
Sample output:
NAME TYPE STATUS
slack outbound OK
webhook outbound Disabled
github inbound OK
discord inbound Misconfigured
A Misconfigured pill is the cue to open GUI Settings → Integrations and re-paste the secret — the CLI can't surface secret values.
Verify a Slack adapter end-to-end
watchfire integrations test slack
test fires a clearly-labelled synthetic event through the named adapter, exercising signature, transport, and renderer. Run this after editing the adapter URL or rotating a signing secret.
Refresh Discord slash commands
watchfire integrations register-discord 123456789012345678
Idempotent — the command upserts the schema, so re-run it after every Watchfire upgrade to pick up new slash commands without producing duplicates.
Common pitfalls
integrations testfails withBreaker open— the adapter has tripped its circuit breaker after repeated upstream failures. Fix: address the upstream issue (auth, URL), then wait for the breaker to half-open, or restart the daemon withwatchfire daemon stop/start.- Discord interactions return 401 —
register-discordsucceeded but Discord still rejects requests. Fix: re-paste the Discord public key into GUI Settings → Integrations; secrets are write-only and can be replaced but not read back. See Webhook signature verification fails. - Subcommand run outside a project —
integrationsis project-scoped and exits if the cwd isn't a Watchfire project. Fix:cdinto a project initialised withwatchfire init.