---
name: slack-channel-digest
description: "Every weekday morning: what happened in a busy Slack channel since this time yesterday, threads included, boiled down to decisions, open questions and links. Use when the user asks for this, or when it runs on a schedule."
---

# Slack channel digest

Every weekday morning: what happened in a busy Slack channel since this time yesterday, threads included, boiled down to decisions, open questions and links.

Two hundred messages a day in #product, most of them in threads you were not tagged in. Catching up means scrolling, expanding every thread, and still missing the decision someone made in a reply at 18:40.

The agent reads the channel since this time yesterday, opens every thread, and writes down only what a person catching up needs: decisions and who made them, questions still waiting for an answer, and the links people shared. Every item links back to its message, so jumping into the conversation is one click.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Slack app in your workspace with `channels:history` (and `groups:history` for private channels) and `users:read`, added to the channel.
- Or a Slack MCP server or connector signed in as you, which sees the channels you are in.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read the channel** (Slack): `conversations.history` with the channel ID, `oldest` set to 24 hours ago as a Unix timestamp and `limit=200`, following `response_metadata.next_cursor`. Skip join messages and other `subtype` events, except bots you care about, such as a deploy bot.
2. **Open the threads** (Slack): For every message with a `reply_count`, read `conversations.replies` with its `ts`. Also scan parent messages from the past 7 days for a `latest_reply` inside the window, since old threads are where late decisions land.
3. **Pick out what matters**: A decision is an agreement nobody objected to ("let's go with", "decided", "shipping Thursday"); an open question has no answer in its thread; a link is any URL to a doc, PR, issue or dashboard. Turn user IDs into names with `users.info`.
4. **Link back** (Slack): Get a link for each item with `chat.getPermalink`, so the digest can be checked against the channel in one click.
5. **Write the digest**: Decisions first, then open questions with who asked and how long ago, then links grouped by type. At most 12 lines, plus how many messages and threads were read.

## Route B: the browser

### What you need

- Signed in to the Slack workspace as a member of the channel; private channels and their threads are only visible to members.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://app.slack.com/client. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the channel**: Slack opens your last workspace; switch with the workspace sidebar if you have several. Open `#product` and scroll up until the date divider for yesterday is above the time you are reading at, so the whole last 24 hours are loaded.
2. **Read and open the threads**: Read down from that point. Every message with a **N replies** link is a thread: click it to open the replies in the side panel, read them, and close it. Skip join and leave notices.
3. **Catch replies in old threads**: Click **Threads** at the top of the sidebar, or search `in:#product after:` with the date of two days ago, switch to the **Messages** tab and sort by **Newest**, to find replies posted in the window on threads that started earlier in the week.
4. **Copy the links**: For each decision, open question and shared link, hover the message, open the **More actions** menu (the three dots) and choose **Copy link**, so every item in the digest points at its message.
5. **Write the digest**: Decisions first with who made them, then open questions with who asked and how long ago, then links grouped by type. At most 12 lines, plus how many messages and threads you read.

Note: Scrolling and opening threads is slow past a couple of hundred messages, and Slack search shows 20 results a page. On a free plan, history older than 90 days is hidden, which does not affect a one-day window.

## The report

- **Decisions**, each with who made it and a link to the message.
- **Open questions**: asked and unanswered, with who asked and how long ago.
- **Links** shared: docs, PRs, issues and dashboards.
- How many messages and threads were read, so you know what the digest covers.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "slack-channel-digest/<date of this run, e.g. 2026-10-16>",
  "item_key": "slack-channel-digest",
  "project": "Acme",
  "source": "Slack channel digest skill",
  "kind": "update",
  "title": "3 decisions and 2 open questions in #product",
  "summary": "Read **184 messages** and 23 threads since yesterday morning. The new pricing page ships Tuesday.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Type",
          "What",
          "Who"
        ],
        "rows": [
          [
            "Decision",
            "Pricing page ships Tuesday, with the annual toggle on by default",
            "Maya"
          ],
          [
            "Decision",
            "CSV import moves out of the October scope",
            "Leo, agreed by Sam"
          ],
          [
            "Decision",
            "Beta invites go to the 40 waitlisted accounts first",
            "Maya"
          ],
          [
            "Question",
            "Who owns the onboarding email copy now? Asked 19h ago",
            "Priya"
          ],
          [
            "Question",
            "Do the new trial terms need legal review? Asked 3h ago",
            "Tom"
          ]
        ]
      }
    },
    {
      "type": "Links",
      "props": {
        "items": [
          {
            "label": "Pricing page spec",
            "url": "https://docs.example.com/pricing-v3"
          },
          {
            "label": "Beta waitlist",
            "url": "https://sheets.example.com/beta-waitlist"
          }
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 8:30 (`30 8 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
30 8 * * 1-5 claude -p "Run the slack-channel-digest skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/slack-channel-digest#schedule

Source: https://briefkin.dev/skills/slack-channel-digest
