Slack integration — setup and usage guide
Fredrin's Slack integration is two-way: your board pushes review-ready and
agent-blocked alerts into a Slack channel, and your team files tickets by
just tagging the bot — @Fredrin create a task to fix the login flow — in
any conversation where the work came up.
It is bring-your-own-app: you create a small Slack app in your own Slack workspace and paste its bot token into Fredrin. Fredrin hosts no shared Slack app, so nothing about your Slack workspace is visible to anyone else; the token and signing secret are stored encrypted and never logged.
What you get
- Review-ready alerts — the moment a ticket lands in the Review column (a
Worker finished and opened a PR), the channel gets
:mag: Ready for review — FRED-XXXX <title>. - Agent-blocked alerts — when a Worker stops and needs a human,
:no_entry: Agent blocked — needs your input — FRED-XXXX <title>. @Fredrinmentions — natural-language intake, answered in a thread:@Fredrin create a task to <what needs doing>(alsofile a ticket:,add an issue for, …)@Fredrin status— per-column ticket counts
/fredrinslash command (optional) — the same commands as a slash command, answered privately:/fredrin new <title>,/fredrin status,/fredrin help.
Prerequisites
- A Fredrin project (in the desktop app) you want to wire up.
- Permission to create and install apps in your Slack workspace.
- About ten minutes.
- A Fredrin deployment with
CONNECTOR_ENCRYPTION_KEYset. It is required to save any pasted-key connector; without it the Connectors panel shows a "connecting is unavailable" banner. (Self-hosting only — it is already set onfredrin.com. That banner also names OAuth client IDs, which Slack does not need.)
1. Create the Slack app
- Open api.slack.com/apps → Create New App →
From scratch. Name it (e.g.
Fredrin) and pick your Slack workspace. - OAuth & Permissions → Scopes → Bot Token Scopes → add
chat:write(this is what lets the bot post alerts and reply to mentions). - You also need
app_mentions:read— without it Slack never deliversapp_mentionevents, so@Fredrinstays silent no matter what else is set up. Slack normally attaches it for you when you subscribe to theapp_mentionbot event in step 4 below; after that, come back to this page and confirm it is actually listed, and add it by hand (then reinstall) if it isn't. - OAuth & Permissions → Install to Workspace → authorize.
- Copy two values — you'll paste both into Fredrin:
- the Bot User OAuth Token (OAuth & Permissions; starts
xoxb-) - the Signing Secret (Basic Information → App Credentials)
- the Bot User OAuth Token (OAuth & Permissions; starts
2. Pick the alert channel
- Choose (or create) the channel alerts should land in, e.g.
#fredrin. - Invite the bot to it: type
/invite @Fredrin(your app's name) in the channel. The bot can only post — and hear mentions — where it has been invited. - Copy the Channel ID: click the channel name → About tab → the ID is
at the bottom (it starts with
C). Use the ID, not the channel name.
3. Connect it in Fredrin
Do this before step 4 — Slack's event-URL handshake is verified against the signing secret you store here.
- In the Fredrin desktop app, open your project → Project settings → Connectors → Slack.
- Paste the Bot User OAuth Token, the Signing Secret (enables
@Fredrinmentions and/fredrin; alerts work without it), and the Alert channel ID (enables alerts; mentions work without it). - Click Connect Slack for this project — or Connect for workspace (workspace owners) to serve every project in the workspace with one app.
A note on rotating the bot token later: use Update credentials on the
connected Slack row — not Disconnect. Paste the new xoxb- token and leave the
signing-secret and channel fields blank; blanks keep the stored values, so
mentions and alerts keep working. Disconnecting first is a genuine reset: it
revokes the stored credential, so the signing secret does not carry forward
and you must paste it again.
4. Enable @Fredrin mentions
Back in your Slack app's settings:
- Event Subscriptions → toggle Enable Events on.
- Request URL:
https://www.fredrin.com/api/webhooks/slack— it should show Verified within a moment (if it doesn't, finish step 3 first: the handshake is rejected until the signing secret is connected in Fredrin). - Subscribe to bot events → Add Bot User Event →
app_mention. - Save Changes, and reinstall the app if Slack prompts for it.
5. (Optional) add the /fredrin slash command
Mentions cover intake; add the slash command only if your team prefers it — its replies are private to the invoker instead of threaded in the channel.
- Slash Commands → Create New Command: command
/fredrin, Request URLhttps://www.fredrin.com/api/webhooks/slack, descriptionFile and track Fredrin tickets, usage hintnew <title> | status | help.
6. Try it
- In a channel the bot is in:
@Fredrin create a task to test the Slack integration. The bot replies in a thread with the ticket identifier and column; the ticket is on your board's Backlog. @Fredrin status→ per-column counts.- Move any ticket into Review (or wait for a Worker to finish one) — the alert appears in your alert channel.
Using it day to day
- Filing tickets. Tag the bot with what you need:
@Fredrin create a task to tighten the signup copy. Verbscreate/add/file/open/makewithtask/ticket/issueall work, joined byto/for/about/:— write it how you'd say it. The rest of the message becomes the ticket title (Slack formatting is cleaned up), the ticket lands in the project's entry column (Backlog on a default board), and the bot confirms in a thread. The ticket's description records that it came from Slack, attribution goes to the member who connected Slack, and a title identical to one filed in the last 24 hours is rejected as a duplicate. - Several projects on one Slack app? Target one by slug:
@Fredrin create a task in my-project: <title>and@Fredrin status my-project. With a single connected project no prefix is needed. Ordinary colons in titles are safe — a prefix only routes when it matches a real project slug. - Board glance.
@Fredrin statuslists per-column counts (threaded reply);/fredrin statusdoes the same privately. - Privacy. Slash replies are ephemeral (only you see them); mention replies are threaded in the channel. Alerts carry the ticket identifier and title only, never agent conversation content.
- Acting on an alert. Alerts name the ticket (
FRED-XXXX); open the Fredrin desktop app to review the diff and ship or send back.
Troubleshooting
- The event Request URL won't verify in Slack. Connect the Slack connector
in Fredrin first (with the Signing Secret pasted) — the handshake is
signature-verified, so an unconnected secret is rejected — then retry the
URL. Also check it is exactly
https://www.fredrin.com/api/webhooks/slack. @Fredringets no reply. The bot must be in the channel (/invite @Fredrin); the app must be subscribed to theapp_mentionevent (step 4); and the connector must be connected with the signing secret./fredrinshows a Slack error ("dispatch_failed"). Same causes: request URL wrong, or the connector was connected without the signing secret → reconnect and paste it.- No alerts arrive. Three usual causes: no Alert channel ID was set
(reconnect and add it), the bot was never invited to the channel
(
/invite @Fredrin), or the channel name was pasted instead of theC…channel ID. - "Slack rejected the bot token." The token was revoked or reinstalled
away. Reinstall the app to your Slack workspace and reconnect with the fresh
xoxb-token — blank optional fields keep their stored values. - Commands rejected after long queues or clock skew. Requests older than five minutes are refused (replay protection). Just re-run the command.
Security notes
- The bot token and signing secret are stored AES-256-GCM-encrypted in your Fredrin workspace and are never logged or shown again.
- Every inbound request — mention, handshake, or slash command — is verified against your app's signing secret (timing-safe HMAC with a five-minute replay window) before anything is read or created. Unverified requests are rejected.
- Redelivered events are deduplicated, and the bot never acts on bot-authored messages (no reply loops).
- Alerts are one-way notifications with ticket metadata only; disconnecting the connector stops both directions immediately.