Skip to main content
Watchfire
Commands
Main content

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 PublicURL so Discord can call POST /echo/discord/interactions.
  • The Discord application has been added to the target guild with the applications.commands scope.

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 IntegrationsService gRPC has List / Save / Delete / Test RPCs; Save carries a oneof payload 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 test fails with Breaker 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 with watchfire daemon stop / start.
  • Discord interactions return 401register-discord succeeded 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 projectintegrations is project-scoped and exits if the cwd isn't a Watchfire project. Fix: cd into a project initialised with watchfire init.

On this page