3 decisions and 2 open questions in #product
Read 184 messages and 23 threads since yesterday morning. The new pricing page ships Tuesday.
Every weekday morning: what happened in a busy Slack channel since this time yesterday, threads included, boiled down to decisions, open questions and links.
What lands on your board
Read 184 messages and 23 threads since yesterday morning. The new pricing page ships Tuesday.
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.
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.
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.
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.
Get a link for each item with chat.getPermalink, so the digest can be checked against the channel in one click.
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.
With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.
shellcurl -fsSL https://briefkin.dev/skills/slack-channel-digest/install | shAsk Claude Code:
promptRun the slack-channel-digest skillOr paste the prompt instead of installing:
promptRead the Slack channel #product for the last 24 hours with conversations.history, and open every thread with conversations.replies, including older threads that got replies in that time. Write a digest with three sections: decisions (what was agreed, by whom), open questions (asked with no answer in the thread, with who asked and how long ago) and links shared (docs, PRs, issues, dashboards). Skip join messages and small talk. Use names, not user IDs, link each item to its message with chat.getPermalink, keep it under 12 lines, and say how many messages and threads you read.Weekdays at 8:30, from cron on any machine where Claude Code is signed in:
crontab30 8 * * 1-5 claude -p "Run the slack-channel-digest skill"Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.
Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works
SKILL.md---
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
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.
https://mcp.slack.com/mcp. It only works through Slack apps that Slack has registered, so use the Slack connector in Claude or another approved client, and your workspace admin may need to approve it (docs). It searches messages and files, reads channels and threads, and can send messages.SLACK_BOT_TOKEN (xoxb-) or SLACK_USER_TOKEN (xoxp-). Read scopes: channels:history, channels:read, groups:history for private channels, users:read, and search:read (user tokens only) for search. A bot reads only the channels it was invited to.Leave out chat:write unless the skill should post back into Slack; with history and read scopes alone, the app can't post anything.
Yes, if the app is a member of the channel and has groups:history. A Slack MCP server or connector that acts as you can read any channel you are in, private ones included, which is often the simpler setup.
Since May 2025 Slack limits conversations.history and conversations.replies to one call a minute and 15 messages per call for newly created apps that are distributed commercially outside the Slack Marketplace. An internal app created in your own workspace keeps the normal limits, so build the app there and keep the window to one day.
No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.
Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.
Yes. Switch the data source to "Your browser" and the steps change to the Slack pages themselves: the agent opens app.slack.com/client in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.
Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.
Free during the open beta. No card.