Slack app
Capture and update tasks from Slack with /done or @done. Each Slack user links their own Done account, so everything you add is scoped to your tasks alone.
What you can do
/done buy milk tomorrow urgent #errands/done done review the PR/done update groceries :: friday, low priority/done list/done connect/done disconnect/done help@done … in a channel the bot is in works the same as /done ….
Add Done to your workspace
One person installs the app for the whole workspace. It takes a click and needs no configuration — you don't create a Slack app, and you never touch a secret.
Installing grants Done three bot scopes — commands, chat:write and app_mentions:read — and nothing else. Installing on its own connects nobody's tasks: each person still links their own account below, so an admin cannot wire the workspace into someone else's Done data.
Connect your account
- In Slack, run
/done connect. - Open the link it replies with and sign in to Done if you aren't already.
- Approve on Slack's own consent screen. Done asks for a single scope,
identity.basic, which only tells us which Slack user you are. - That's it —
/donenow manages your account's tasks. Run/done disconnectanytime to unlink.
Both halves of the connection are proven, never asserted by a URL: your Done account comes from the session in your browser, and your Slack identity comes from Slack's own token exchange. The link /done connect gives you is the same for everyone and says nothing about who is connecting — so forwarding it to someone else does nothing on your behalf, it just starts their connection to their own account.
Set it up (workspace admin)
Only needed if you self-host Done. On trydone.app the app is already published — use the Add to Slack button above instead. Self-hosting means creating your own Slack app pointed at your instance and setting four secrets; until they're set, the /slack/* routes stay dormant and reply “not configured”.
- At api.slack.com/apps, create an app for your workspace.
- Slash Commands → add
/donewith the request URLhttps://trydone.app/slack/commands, and add thecommandsbot scope — Slack refuses to save an app that declares a slash command without it. - Interactivity & Shortcuts → toggle on, request URL
https://trydone.app/slack/interactivity. Approval alerts DM you with Approve / Request changes buttons; without this URL Slack has nowhere to deliver the press, so the buttons render but do nothing. - Event Subscriptions (optional, for
@done) → request URLhttps://trydone.app/slack/events, subscribe to theapp_mentionbot event, and add both thechat:writeandapp_mentions:readscopes — subscribing toapp_mentionrequires the latter. - OAuth & Permissions → add the redirect URL
https://trydone.app/slack/oauth/callbackand theidentity.basicuser token scope. Account linking is an OAuth round trip; without these,/done connecthas nowhere to send people. - Install the app to the workspace, then set the secrets on the Worker:
wrangler secret put SLACK_SIGNING_SECRET # from Basic Information → App Credentials
wrangler secret put SLACK_CLIENT_ID # Basic Information → App Credentials → Client ID
wrangler secret put SLACK_CLIENT_SECRET # …→ Client Secret (needed for /done connect)Set SLACK_SIGNING_SECRET before you add the Event Subscriptions URL. Slack verifies that URL by posting a url_verification challenge to it, and /slack/events checks the request signature before it answers the challenge — so while the secret is unset the endpoint replies “not configured” and Slack rejects the URL. No other step has that constraint — Event Subscriptions is the only one Slack verifies on save.
Smoke test: /done connect → approve on Slack → /done buy milk tomorrow urgent #errands → /done list. Then have an agent park a proposal and press Approve on the DM — that last step is the only one that proves Interactivity is wired.
Notes
- Every Slack request is verified with Slack's signing-secret signature; stale (replayed) requests are rejected.
- All work is scoped to the linked user's own account — the same isolation the app and MCP endpoint enforce.
- Tasks created from Slack are ordinary tasks: assign them to an AI agent, set dependencies, or work them in the app.