How to automate your daily business brief to Slack
Read your connected business sources each morning, synthesize priorities and blockers, and deliver a cited brief to one Slack destination.
Posted by
Related reading
How to monitor competitors with OpenCode and Slack
Tell your agent which competitors to watch, test the brief once, and get cited updates in Slack every morning.
Turn a Linear ticket into a reviewed PR from Slack
A repeatable loop for turning Linear tickets into reviewable PRs with an OpenCode agent, with Slack as the receipt.
OpenCode skills for business: planning, triage, and updates
Install Pipa skills in OpenCode to plan your day, triage requests, and draft project updates. Includes skill links and prompts to use with your work.
Pipa Local can read the business sources you connected, pull out what needs your attention, and post a short morning brief to one Slack channel. The agent runs on your computer and reads only the sources you configured. It posts only where you tell it to, and only while that computer is awake with Pipa running.
What this brief is not
This is not a news digest. It does not summarize headlines or the weather. It is not a calendar-only summary either. It answers one question from your own tools: what are my priorities and blockers today, and where did each one come from?
The scheduling mechanics behind it live in the OpenCode scheduling guide. This tutorial covers what the briefing itself should contain, then gives the exact command to put that brief on a morning schedule.
Before you brief
Set up and start Pipa Local first. The Pipa Local install guide covers installation and Slack credentials; the OpenCode Slack integration page explains the working folder and trusted-channel setup.
Name the sources first
List where priorities and blockers live today before you write the prompt. Start with three or fewer sources: where work is tracked, where customers ask for things, and where the calendar sets the day's constraints. Each added source adds noise and another way for the run to fail, so add a fourth only when a priority lives nowhere else.
Connect only those sources to the agent. Anything you leave unconnected stays unread. That boundary is the point: the brief can only cite what it was allowed to see.
Use one briefing prompt
Keep a single prompt you can reuse every morning. Name the sources, the destination, and the shape of the answer. Replace the bracketed placeholders with your own tools and channel.
Morning brief. Read [SOURCE_1], [SOURCE_2], and today's calendar. Reply in this Slack channel with: 1. Top 3 priorities, each with its source 2. Blockers, each with owner and source 3. Anything due today with its time Keep it under 200 words. Cite every item with its source. If a source is unreachable, say so and brief from the rest. Do not invent items.
Run it once by hand
Send the prompt in the destination channel yourself the first time, so the run also proves delivery works. Read the result before anyone else depends on it. Check that every item carries a source, and that the priorities match what you know is true.
When something is missing, the fix is usually the source list, not the wording. Add the source the item lives in, or narrow the prompt to stop asking for things no connected source can answer.
An example brief
Illustration with placeholder names, not a recorded run:
Morning brief, Thu (illustration) Priorities 1. Reply to the Acme renewal thread (support inbox) 2. Review the staging deploy checklist (task board) 3. Prep the 2pm call with Northwind (calendar) Blockers - Invoice approval waits on Sam (accounting sheet) Due today - Acme renewal reply by 3pm (support inbox)
Put it on a morning schedule
Once the manual run reads true, schedule the same prompt, so the routine you save is the one you already verified. Preview first: with --preview and --json the command prints the normalized schedule as JSON and saves nothing. Check the time, timezone, and channel in that output, then run the identical command without --preview to save the routine. Nothing is scheduled until that second run: the re-run is the confirmation.
pipa routine create \ --prompt "Morning brief. Read [SOURCE_1], [SOURCE_2], and today's calendar. Reply in this Slack channel with: 1. Top 3 priorities, each with its source. 2. Blockers, each with owner and source. 3. Anything due today with its time. Keep it under 200 words. Cite every item with its source. If a source is unreachable, say so and brief from the rest. Do not invent items." \ --timezone America/New_York \ --channel C0123456789 \ --every 1d \ --times 07:00 \ --preview \ --json
Replace the bracketed sources with your own, plus your channel ID and timezone. The scheduler is local: it runs only while Pipa's Socket Mode process and your computer are running, missed occurrences are skipped rather than backfilled, and Pipa Managed profiles do not execute routines.
When the brief looks wrong
- A source is missing from the brief: check it is still connected and named in the prompt. The agent reports unreachable sources instead of covering for them.
- Everything reads stale: confirm the machine was awake at the scheduled time. A sleeping computer skips the run.
- Two sources disagree: keep both citations in the brief and decide yourself. The brief surfaces the conflict. It does not resolve it.
Keep the source list small. A brief that reads three sources you trust beats one that skims ten you do not.