Morning Brief Agent
Deploy a personalized AI morning briefing agent that wakes up before you do, gathers weather, calendar, tasks, and news from all your sources, and delivers a concise daily digest to Slack, WhatsApp, or any channel — replacing 60 minutes of manual scanning with a focused 2-minute read.
Connected Apps & Services
Google Calendar
Gmail
Slack
Overview
The average knowledge worker in 2026 starts their day drowning in information. Between email inboxes with 50+ unread messages overnight, Slack channels buzzing with updates across time zones, calendar invites that shifted while they slept, news feeds algorithmically tuned for engagement over relevance, and task boards scattered across three different project management tools — most professionals spend the first 45 to 90 minutes of their day just figuring out what actually matters. According to research from the University of California, Irvine, it takes an average of 23 minutes to refocus after each context switch. When your morning starts with a dozen context switches before you have even begun real work, you have already lost your most productive hours.
This is not a new problem, but the scale has become untenable. The volume of digital information created daily surpassed 400 exabytes in 2025. Enterprise workers toggle between an average of 13 different apps per day. Notification fatigue is now a clinically recognized contributor to workplace anxiety. And the irony is sharp: the tools designed to keep us informed are the very things preventing us from being effective.
A personalized AI morning briefing agent solves this by inverting the relationship between you and your information. Instead of you hunting across a dozen sources every morning, a single AI agent wakes up before you do, pulls from every source that matters to your specific role and life, synthesizes it into a concise digest, and delivers it to wherever you will actually read it — Slack, WhatsApp, Telegram, email, or directly in your OpenClaw chat. The agent learns your priorities over time, adapts its sections based on what you actually engage with, and compresses what would take 60+ minutes of manual scanning into a focused 2-minute read.
With OpenClaw's built-in cron scheduler, web search and fetch tools, and extensible plugin system for calendar, email, and task integrations, building a morning briefing agent is one of the highest-value automations you can deploy — and it takes less than 15 minutes to set up.
Architecture
The Morning Brief Agent runs on a simple but powerful architecture built entirely within OpenClaw's native capabilities:
┌─────────────────────────────────────────────────────┐
│ OpenClaw Gateway │
│ │
│ ┌─────────────┐ ┌──────────────────────────┐ │
│ │ Cron │───▶│ Isolated Agent Session │ │
│ │ Scheduler │ │ │ │
│ │ "0 6 *" │ │ 1. Read HEARTBEAT.md │ │
│ └─────────────┘ │ 2. Fetch weather API │ │
│ │ 3. Read Google Calendar │ │
│ │ 4. Pull Notion tasks │ │
│ │ 5. Search top news │ │
│ │ 6. Compile brief │ │
│ │ 7. Deliver via Slack │ │
│ └──────────┬───────────────┘ │
│ │ │
└────────────────────────────────┼─────────────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌──────▼──────┐ ┌────────▼───────┐ ┌────────▼────────┐
│ Data Sources │ │ Delivery │ │ Storage │
│ │ │ │ │ │
│ Weather API │ │ Slack channel │ │ Brief archive │
│ Google Cal │ │ WhatsApp │ │ (workspace dir) │
│ Notion API │ │ Telegram │ │ │
│ News/RSS │ │ Discord │ │ │
│ Gmail │ │ Email │ │ │
└──────────────┘ └────────────────┘ └─────────────────┘
- Cron trigger: OpenClaw's built-in cron scheduler fires at your configured time (e.g., 6:00 AM weekdays). The job runs in an isolated session, so it does not pollute your main chat history.
- Data gathering: The agent executes its AGENTS.md instructions, calling each data source in sequence — weather API via
web_fetch, Google Calendar via the calendar plugin, Notion tasks via the Notion plugin, and news viaweb_search.
- Synthesis: The agent compiles all gathered data into a structured, prioritized brief following the template defined in your configuration. It highlights what is urgent, what is time-sensitive, and what is informational.
- Delivery: Using
delivery.mode = "announce"with your preferred channel, the compiled brief lands in your Slack DM, WhatsApp chat, Telegram, or any connected messaging platform — ready and waiting when you pick up your phone or open your laptop.
- Archival: Optionally, the agent saves each brief to a dated file in the workspace (
briefs/YYYY-MM-DD.md) for later reference and trend analysis.
The entire cycle typically completes in 15 to 45 seconds depending on the number of API calls and response times from external services.
Step-by-Step Setup
Prerequisites
- A running OpenClaw instance (self-hosted or via Donely)
- API keys for your chosen data sources (weather, news)
- Connected plugins for calendar and task management (optional but recommended)
- A delivery channel configured (Slack, Telegram, WhatsApp, or Discord)
Step 1: Configure Weather API
The agent uses OpenWeatherMap (free tier: 1,000 calls/day) for weather data.
- Sign up at openweathermap.org and grab your API key
- Store it in your OpenClaw environment:
# Add to ~/.openclaw/.env
OPENWEATHER_API_KEY=your_api_key_here
The agent will call the weather API via web_fetch:
web_fetch https://api.openweathermap.org/data/2.5/forecast?q=San+Francisco,US&units=imperial&cnt=8&appid=${OPENWEATHER_API_KEY}
This returns the current conditions plus an 8-period (24-hour) forecast, which the agent summarizes into a human-readable weather section.
Step 2: Connect Google Calendar
Install and configure the Google Calendar plugin for OpenClaw:
- Enable the Google Calendar plugin in your OpenClaw config:
{
plugins: {
entries: {
"google-calendar": {
enabled: true,
config: {
credentials: { "$ref": "secret:google-calendar-credentials" },
calendarIds: ["primary", "work@company.com"],
lookahead: "16h" // fetch events for the next 16 hours
}
}
}
}
}
- Complete OAuth setup:
openclaw plugins configure google-calendar - The agent will automatically pull today's events including meeting times, attendees, and descriptions.
Step 3: Connect Notion for Task Priorities
Link your Notion workspace to pull tasks and project updates:
- Create a Notion integration at notion.so/my-integrations
- Share your task databases with the integration
- Configure the plugin:
{
plugins: {
entries: {
notion: {
enabled: true,
config: {
apiKey: { "$ref": "secret:notion-api-key" },
databases: {
tasks: "your-database-id",
projects: "your-projects-db-id"
}
}
}
}
}
}
The agent queries for tasks due today, overdue items, and high-priority items, then ranks them in the brief.
Step 4: Configure News Sources
The agent uses OpenClaw's built-in web_search tool for news. Configure your preferred search provider:
{
plugins: {
entries: {
brave: {
config: {
webSearch: {
apiKey: "YOUR_BRAVE_API_KEY"
}
}
}
}
},
tools: {
web: {
search: {
enabled: true,
provider: "brave"
}
}
}
}
Alternatively, you can use Tavily, Perplexity, or any other supported search provider. The agent's prompt specifies which topics to search for — you customize these in the AGENTS.md file.
Step 5: Create the Morning Brief Agent
Create a dedicated agent for the morning brief in your OpenClaw configuration:
{
agents: {
list: [
{ id: "main", default: true },
{
id: "morning-brief",
model: "anthropic/claude-haiku-4.5",
heartbeat: {
every: "0m" // no heartbeat needed — cron handles scheduling
}
}
]
}
}
Step 6: Write the Agent Instructions
Create the agent's workspace file at ~/.openclaw/agents/morning-brief/AGENTS.md:
# Morning Brief AgentYou are a personal briefing agent. Your job is to compile a concise, actionable
morning brief for the user. Follow these rules strictly:
Sections (in order)
- Weather — Current conditions + today's forecast. Include high/low temps,
precipitation probability, and a clothing suggestion if rain > 40%.
- Calendar — All events for the next 16 hours. Flag conflicts. Note prep
time needed for important meetings.
- Priority Tasks — Top 5 tasks due today or overdue, pulled from Notion.
Sort by urgency (overdue first, then by priority).
- News Digest — 3-5 headlines relevant to: [your topics here, e.g.,
"AI/ML, startup funding, cybersecurity"]. One-sentence summary each.
- Daily Focus — Based on calendar density and task load, suggest one
primary focus for the day.
Format Rules
- Total brief must be under 800 words
- Use bullet points, not paragraphs
- Bold the most important item in each section
- Include timestamps in 12-hour format with timezone
- End with a motivational one-liner (rotate daily, never repeat within 30 days)
Data Sources
- Weather: web_fetch OpenWeatherMap API
- Calendar: google-calendar plugin
- Tasks: notion plugin (database: tasks)
- News: web_search with Brave/Tavily
Step 7: Schedule the Cron Job
Add the cron job that triggers the agent every morning:
openclaw cron add \
--name "Morning Brief" \
--cron "0 6 1-5" \
--tz "America/New_York" \
--session isolated \
--agent morning-brief \
--message "Generate today's morning brief following your AGENTS.md instructions. Gather all data sources, compile the brief, and deliver it." \
--announce \
--channel slack \
--to "channel:C1234567890"
--cron "0 6 1-5"— Runs at 6:00 AM, Monday through Friday--tz "America/New_York"— Respects your local timezone--session isolated— Each brief runs in a fresh session (no conversation history bloat)--announce— Delivers the output to your chosen channel--agent morning-brief— Binds to the dedicated agent with your briefing instructions
For weekends, you might want a lighter brief:
openclaw cron add \
--name "Weekend Brief" \
--cron "0 8 0,6" \
--tz "America/New_York" \
--session isolated \
--agent morning-brief \
--message "Generate a lightweight weekend brief: weather only, any calendar events, and one fun news story. Keep it under 200 words." \
--announce \
--channel slack \
--to "channel:C1234567890"
BOOTSTRAP.md
Create this file at ~/.openclaw/agents/morning-brief/BOOTSTRAP.md for first-run configuration:
# Morning Brief Agent — First Run SetupWelcome! I'm your Morning Brief agent. Let me configure your daily digest.
Quick Setup Questions
- What city are you in? (for weather data)
- What time do you want your brief? (e.g., "6:30 AM" or "7:00 AM")
- Weekdays only or every day?
- Which news topics matter to you? (e.g., "AI, fintech, cybersecurity, climate")
- Where should I deliver? (Slack channel, WhatsApp, Telegram, or here)
- Any calendars beyond your primary? (e.g., shared team calendar ID)
- Do you use Notion, Todoist, or Linear for tasks? (I'll connect the right one)
What I'll Configure
After your answers, I will:
- Set up the cron schedule in your timezone
- Configure weather for your city
- Tune news search queries to your interests
- Connect your calendar and task sources
- Write your personalized AGENTS.md
- Send a test brief immediately so you can review the format
Sections You Can Enable
Section Default Source
Weather & forecast On OpenWeatherMap API Calendar events On Google Calendar / Outlook Priority tasks On Notion / Todoist / Linear News digest On web_search (Brave/Tavily) Email highlights Off Gmail plugin GitHub activity Off GitHub plugin Health metrics Off Apple Health / Garmin Market summary Off web_fetch financial APIs Daily focus suggestion On AI synthesis Motivational close On AI-generated
After setup, delete this file — it only runs once.
Capabilities
The Morning Brief Agent can pull from a wide range of data sources depending on your connected plugins and API keys:
Weather & Environment
- Current temperature, humidity, wind speed, and conditions
- Hourly forecast for the next 24 hours with precipitation probability
- Severe weather alerts and advisories
- UV index and air quality (with premium weather API tiers)
- Clothing and umbrella suggestions based on conditions
Calendar & Schedule
- All events for today and tomorrow morning from multiple calendars
- Meeting conflict detection and prep time suggestions
- Attendee lists with context (first meeting with someone? recurring 1:1?)
- Travel time estimates between in-person meetings
- Focus block suggestions based on meeting gaps
News & Information
- Topic-filtered headlines from web search (configurable topics per user)
- One-sentence AI summaries for each headline
- Source diversity (avoids showing 3 articles from the same outlet)
- Trending topics in your industry via search trend analysis
- RSS feed summaries from custom sources via
web_fetch
Task & Project Priorities
- Overdue tasks highlighted with days overdue
- Due-today items sorted by priority
- Blocked tasks with blocker context
- Sprint progress summary (for agile teams)
- Upcoming deadlines within the next 3 days
Health & Wellness Metrics
- Sleep duration and quality from connected health APIs
- Step count and activity goals from previous day
- Hydration and nutrition reminders based on calendar density
- Suggested break times based on meeting load
Communication Highlights
- Unread email count with VIP sender highlights (Gmail plugin)
- Slack mentions and DMs received overnight
- GitHub PRs awaiting your review
- Open support tickets assigned to you
Configuration Reference
Full OpenClaw Config Example
{
agents: {
list: [
{ id: "main", default: true },
{
id: "morning-brief",
model: "anthropic/claude-haiku-4.5", // fast + cheap for daily runs
heartbeat: { every: "0m" }
}
]
},
plugins: {
entries: {
"google-calendar": {
enabled: true,
config: {
credentials: { "$ref": "secret:google-calendar-credentials" },
calendarIds: ["primary"],
lookahead: "16h"
}
},
notion: {
enabled: true,
config: {
apiKey: { "$ref": "secret:notion-api-key" },
databases: { tasks: "db-id-here" }
}
},
slack: {
enabled: true,
config: {
botToken: { "$ref": "secret:slack-bot-token" },
defaultChannel: "C1234567890"
}
},
brave: {
config: {
webSearch: {
apiKey: { "$ref": "secret:brave-api-key" }
}
}
}
}
},
tools: {
web: {
search: { enabled: true, provider: "brave" },
fetch: { enabled: true }
}
}
}
Cron Schedule Patterns
| Pattern | Schedule |
|---|---|
0 6 1-5 | 6:00 AM weekdays |
0 7 | 7:00 AM every day |
30 5 1-5 | 5:30 AM weekdays (early risers) |
0 8 0,6 | 8:00 AM weekends only |
0 6 1-5; 0 9 * 0,6 | 6 AM weekdays, 9 AM weekends (two jobs) |
Delivery Channel Options
| Channel | --channel | --to example |
|---|---|---|
| Slack | slack | channel:C1234567890 |
| Telegram | telegram | 12345678 (chat ID) |
whatsapp | +15551234567 | |
| Discord | discord | channel:123456789 |
| Main session | last | (none needed) |
Section Configuration in AGENTS.md
Control which sections appear by editing the agent's AGENTS.md. Each section can be toggled, and the agent will skip data source calls for disabled sections — saving API calls and execution time.
Real-World Examples
Example 1: Executive Morning Brief
Scenario: A startup CEO needs a comprehensive daily overview covering investor-relevant metrics, team updates, and market intelligence. AGENTS.md configuration:# Executive Morning BriefCompile a C-level morning brief. Be direct and data-driven.
Sections
- Key Metrics — Pull from Notion "KPIs" database: MRR, active users,
churn rate, runway months. Flag any metric that changed >5% from yesterday.
- Calendar — Today's meetings. For board/investor meetings, include
attendee names and any prep docs linked in the event description.
- Team Blockers — Check Linear for any "blocked" issues across all teams.
Summarize what's stuck and who owns it.
- Market Intel — Search for: company name mentions, competitor news,
industry regulation updates. 3 items max.
- Cash Position — If it's Monday, include weekly burn rate summary.
- Decision Queue — Pull Notion "Decisions Pending" database items
that have been waiting >48 hours.
Format
- Lead with the single most important thing I need to know today
- Use red-circle emoji for urgent items
- Total: under 600 words
PRIORITY: Series B lead partner meeting at 2 PM — prep deck not yet shared by Sarah (pinged)>
Metrics (vs yesterday)
- MRR: $147,200 (+1.2%)
- Active users: 12,847 (+89)
- Churn: 3.1% (unchanged)
- Runway: 14.2 months>
Today's Calendar
- 9:00 AM — Engineering standup (30m)
- 11:00 AM — Product review with design team (1h)
- 2:00 PM — Series B partner meeting with Acme Ventures (1h) — prep needed
- 4:30 PM — 1:1 with CTO>
Blockers
- Payment service migration blocked on AWS approval (DevOps, 3 days)
- Mobile app release waiting on App Store review (Mobile, 2 days)>
Market Intel
- Competitor X raised $20M Series A (TechCrunch)
- EU AI Act enforcement timeline moved up to Q3 2026>
"The best time to plant a tree was 20 years ago. The second best time is now."
Example 2: Developer Standup Prep
Scenario: A senior developer wants a brief that prepares them for the daily standup — what they accomplished yesterday, what is on deck today, and any blockers. AGENTS.md configuration:# Dev Standup PrepPrepare my daily standup talking points. Pull from real data, not memory.
Sections
- Yesterday's Commits — Search my GitHub activity from the last 24 hours.
Summarize PRs merged, reviews completed, and issues closed.
- Today's Sprint Tasks — Pull from Linear: my assigned tasks in the
current sprint, sorted by priority. Mark any that are due today.
- PR Reviews Waiting — List any open PRs where I'm a requested reviewer
and how long they've been waiting.
- CI/CD Status — Check if any of my branches have failing builds.
- Calendar — Show only meetings, flag if standup time changed.
- Blockers — Any of my Linear tasks marked as blocked, with blocker context.
Format
- Use "Yesterday / Today / Blockers" standup format
- Keep under 300 words
- Code-block format for branch names and PR titles
Standup Prep — March 22, 2026>
Yesterday
- Merged feat/user-analytics-dashboard (#847) — 12 files, 340 additions
- Reviewed and approved fix/payment-retry-logic (#851)
- Closed issue #392 (stale session cleanup)>
Today
- [HIGH] PROJ-234 — Implement rate limiting middleware (due today)
- PROJ-241 — Write integration tests for webhook handler
- PROJ-245 — Update API documentation for v2 endpoints
>
PRs Awaiting My Review
- fix/cache-invalidation (#853) — waiting 18 hours (Jamie)
- feat/export-csv (#849) — waiting 2 days (Priya)
>
Blockers
- None currently>
Calendar
- 9:00 AM — Standup (unchanged)
- 2:00 PM — Architecture review (new: added yesterday)
Example 3: Family Schedule Digest
Scenario: A parent manages a busy household and wants a morning overview covering everyone's schedules, school events, meal planning, and household tasks. AGENTS.md configuration:# Family Morning DigestYou are a family schedule assistant. Keep it warm, practical, and scannable.
Sections
- Weather — Today's weather with a kid-friendly clothing suggestion
("jacket weather" or "sunscreen day").
- Family Calendar — Pull from ALL calendars: "Family", "Kids School",
"Sports", and both parents' work calendars. Group by person.
- School Notes — Any calendar events tagged with "school" — picture day,
early dismissal, permission slips due.
- Meals — Check Notion "Meal Plan" for today's dinner. If nothing planned,
suggest something quick based on the evening schedule density.
- Errands & Tasks — Notion "Household" database: anything due today or
overdue. Note who's assigned.
- Logistics — Flag any schedule conflicts (e.g., two kids need rides at
the same time). Suggest solutions.
Format
- Use family member first names
- Emoji-friendly (this goes to a family WhatsApp group)
- Under 400 words
- End with "Have a great day, [family name]!"
Good morning, Johnsons! Here is your Saturday rundown.>
Weather: 65°F and partly cloudy. Light jacket for morning soccer, t-shirts by afternoon. No rain expected.>
Emma (10)
- 9:00 AM — Soccer practice at Riverside Park (until 10:30)
- 2:00 PM — Birthday party at Sky Zone (gift: wrapped and in hallway closet)>
Liam (7)
- 10:00 AM — Swimming lesson at the YMCA
- Free afternoon>
Mom (Sarah)
- 8:30 AM — Yoga class
- 11:00 AM — Grocery run (list is in Notion)>
Dad (Mike)
- Morning: Soccer drop-off + swimming drop-off
- 1:30 PM — Drop Emma at Sky Zone>
Logistics Alert: Soccer pickup (10:30) overlaps with swimming drop-off (10:00). Suggestion: Mike does soccer while Sarah does swimming after yoga.>
Dinner: Taco night (planned). Ingredients on grocery list.>
Tasks: Return library books (overdue 2 days — assigned: Mike)>
Have a great day, Johnsons!
Best Practices
Information Density
- Lead with the most actionable item. The first line of your brief should be the single thing that most needs your attention. Everything else is supporting context.
- Cap your brief at 800 words. Briefs over 1,000 words defeat the purpose — you are recreating the information overload you set out to solve. If you need more detail on a specific section, create a separate cron job for deep-dive reports (weekly cadence).
- Use a fast model. Claude Haiku 4.5 or GPT-4o-mini are ideal for morning briefs. They are fast (under 5 seconds), cheap (fractions of a cent per brief), and more than capable of synthesis tasks. Reserve Opus or Sonnet for complex reasoning tasks.
- Limit news to 3-5 items. More than 5 headlines creates noise. The agent should deduplicate similar stories and pick the most substantive source.
Delivery Timing
- Schedule 15-30 minutes before you typically start your day. The brief should be waiting for you, not interrupting you mid-task.
- Use timezone-aware scheduling. Always set
--tzon your cron job. Without it, the gateway uses the host's timezone, which may differ from yours (especially on cloud-hosted instances). - Separate weekday and weekend briefs. Weekday briefs should be dense and action-oriented. Weekend briefs should be lighter — weather, family events, maybe one interesting article.
- Avoid exact top-of-hour times. OpenClaw applies a stagger window to prevent load spikes. If you want a precise time (e.g., exactly 6:00 AM), use
--exactto disable stagger.
Reliability
- Use isolated sessions. Always run morning briefs with
--session isolated. This prevents brief history from consuming your main session's context window and avoids the agent confusing today's brief with yesterday's. - Set reasonable timeouts. If one API is slow (e.g., a weather service taking 10+ seconds), it should not block the entire brief. The agent handles this naturally by moving to the next section.
- Archive your briefs. Add a line to your AGENTS.md: "After delivery, save this brief to
briefs/YYYY-MM-DD.mdin the workspace." This creates a searchable history. - Monitor with
openclaw cron runs. Check the run history periodically to ensure briefs are generating successfully. Failed runs show error context.
Cost Optimization
- One brief per day costs roughly $0.002-$0.01 with Claude Haiku 4.5 (depending on section count and response length). That is under $0.25/month — negligible.
- Web search calls are the biggest cost driver. Brave Search includes 1,000 free queries/month. A daily brief with 3 news searches uses ~90 queries/month — well within the free tier.
- Avoid redundant API calls. If you do not need weather, disable that section rather than fetching and discarding it. Each disabled section saves both time and API credits.
Troubleshooting
Brief not delivering at the scheduled time
- Check the cron job exists:
openclaw cron list— verify the job is active and the schedule is correct. - Verify timezone:
openclaw cron listshows the timezone per job. Ensure it matches your local timezone, not UTC. - Check run history:
openclaw cron runs --id— look for failed runs with error messages. - Channel connectivity: Ensure the delivery channel (Slack, Telegram, etc.) is connected and the bot has permission to post to the target channel.
Brief is empty or missing sections
- API key issues: Check
~/.openclaw/.envfor missing or expired API keys. Weather APIs and search APIs require valid keys. - Plugin not enabled: Verify plugins are enabled in your config:
openclaw plugins list. - Calendar permissions: Google Calendar OAuth may need re-authorization. Run
openclaw plugins configure google-calendar. - Notion database access: Ensure the Notion integration has access to the databases referenced in your config.
Brief is too long or unfocused
- Tighten the AGENTS.md prompt: Add explicit word limits per section (e.g., "Calendar section: max 100 words").
- Reduce news topics: Narrow from 5 topics to 2-3 of highest relevance.
- Use
lightContext: true: In the cron job config, enable lightweight context so the agent only loads AGENTS.md, not the full workspace bootstrap.
Brief arrives at the wrong time
- Stagger window: OpenClaw applies up to a 5-minute stagger for top-of-hour cron expressions. Use
--exactflag to disable:openclaw cron edit.--exact - Active hours conflict: If you have
activeHoursset in heartbeat config, ensure the brief's cron time falls within the active window — though cron jobs are independent of heartbeat active hours. - Host timezone mismatch: On cloud-hosted instances, the host may be in UTC. Always specify
--tzexplicitly.
Cron job runs but delivery fails
- Check delivery mode: Ensure
--announceis set (default for isolated jobs, but verify). - Channel target syntax: Slack channels need the
channel:C...prefix. Telegram needs the numeric chat ID, not the username. - Bot permissions: Slack bots need
chat:writescope and must be invited to the target channel. Telegram bots need to have messaged the chat at least once. - Fallback delivery: Add
--best-effortto prevent delivery failures from marking the entire run as failed. The brief will still be available in the cron run history.
