☀️ Morning Rituals

How to Build an OpenClaw Skill that Automates Your Morning Routine

15 min read

The first hour of your day shouldn't be spent wrestling with notifications. I've spent months refining my own morning ritual, and the breakthrough wasn't a better app—it was a custom OpenClaw skill that synthesizes my world before I even touch my phone.

In this guide, I'll show you how to build a production-grade morning-brief skill. We'll go beyond simple API calls and focus on synthesized intelligence: a single, high-context briefing that combines weather, calendar, urgent emails, and industry news into a 2-minute read.

The Architecture of a Morning Skill

A good morning skill isn't just a list of data. It's a filter. We want to avoid "information overload" by using OpenClaw's ability to reason across different tools.

Our skill will focus on four pillars:

  • Environmental Context: Local weather and commute status.
  • Temporal Context: Calendar conflicts and "first meeting" prep.
  • Digital Signals: Urgent messages or mentions in Slack/Gmail.
  • Knowledge Update: Personalized news summary based on your specific interests.

Step 1: Setting Up the Skill Directory

Following OpenClaw best practices, we start by creating a dedicated directory in our workspace. Use the init_skill.py tool if you have it, or create it manually:

morning-brief/
├── SKILL.md
├── scripts/
│   └── get_commute.py
└── references/
    └── preference_profile.md

Step 2: Defining the SKILL.md

The SKILL.md is the brain of your automation. It tells OpenClaw when to trigger and how to process the information. Here is the exact structure I use:

---
name: morning-brief
description: "Generate a synthesized morning briefing. Use when the user asks for their morning update, status check, or starts their day."
metadata: {
  "openclaw": {
    "emoji": "☕",
    "requires": {
      "bins": ["gws", "weather"],
      "env": ["GOOGLE_CALENDAR_ID"]
    }
  }
}
---

# Morning Briefing Workflow

Generate a structured daily briefing by following these steps in order:

## 1. Context Collection
- Get weather for the configured home city using `weather`.
- Fetch calendar events for today using `gws calendar list`.
- Check Gmail for "high priority" or "urgent" labels using `gws gmail search`.

## 2. Synthesis
Compare the calendar against the weather. If it's raining and they have an off-site meeting, highlight the commute impact.

## 3. Formatting
Use the following structure for the output:
- **Environment**: Temperature and sky conditions.
- **The Day Ahead**: Bulleted list of meetings with 1-sentence summaries.
- **Action Items**: Urgent digital signals requiring immediate attention.
- **Insight**: One interesting piece of news relevant to {preference_profile.md}.

Step 3: Creating the Preference Profile

The "Knowledge Update" pillar works best when the agent knows what you care about. Create references/preference_profile.md:

# Content Interests
- Primary: AI infrastructure and MCP protocol updates.
- Secondary: Next.js performance optimizations.
- Industry: Competitive analysis of agentic frameworks.

# Briefing Style
- Concise, technical, no "hope you're having a great morning" fluff.
- Prioritize conflict resolution over simple listing.

Step 4: Implementing Logic for Commute Synthesis

Sometimes you need a script to handle logic that is too complex or token-heavy for raw LLM reasoning. For example, calculating commute times based on current traffic.

#!/usr/bin/env python3
# morning-brief/scripts/get_commute.py
import os
import requests

HOME = os.getenv("HOME_LOCATION")
WORK = os.getenv("WORK_LOCATION")
API_KEY = os.getenv("GOOGLE_MAPS_API_KEY")

def check_traffic():
    url = f"https://maps.googleapis.com/maps/api/distancematrix/json?origins={HOME}&destinations={WORK}&departure_time=now&key={API_KEY}"
    response = requests.get(url).json()
    duration = response['rows'][0]['elements'][0]['duration_in_traffic']['text']
    return duration

if __name__ == "__main__":
    print(f"Current commute: {check_traffic()}")

Advanced Tips for Peak Performance

1. Use Gating to Prevent Failures

Note the requires block in the metadata. This ensures the skill only attempts to run if you have the gws (Google Workspace) CLI and weather tool installed. It prevents the agent from hallucinating data when a dependency is missing.

2. Progressive Disclosure

Don't put your entire contact list or history in SKILL.md. Use the references/ directory. OpenClaw only loads those files when the agent decides it needs to see your "preference profile." This saves thousands of tokens per run.

Troubleshooting Common Issues

  • Skill won't trigger: Ensure your description contains the exact phrases you use to ask for the brief (e.g., "what's my day look like?").
  • Slow execution: Check if you are calling too many tools sequentially. Try to combine gws calls into a single batch if possible.
  • Outdated news: Ensure you're using a tool like web_fetch or firecrawl_search to get real-time headlines rather than relying on the model's training data.

FAQ

Can I run this on a schedule?

Yes. Use OpenClaw's cron system to trigger the skill at a specific time (e.g., 7:00 AM) and send the output to your Slack or Discord channel.

Does this work with Outlook?

You'll need an MCP server or CLI for Outlook. Once that's installed, just update the instructions in SKILL.md to call the Outlook tool instead of gws.

Can it brew my coffee?

If your coffee maker has an API (like a Home Assistant integration via MCP), absolutely. Just add a step to the workflow: "If first meeting is before 9 AM, trigger coffee_maker start."

How do I share this with my team?

Package the directory into a .skill file using the packaging script and upload it to ClawHub or your internal skill repository.

Is my data secure?

OpenClaw runs locally. Your calendar and email data never leave your machine unless you're using a cloud-based model, and even then, only the specific context needed for the brief is sent.

Ready to build?

Get the OpenClaw Starter Kit — config templates, 5 production-ready skills, deployment checklist. Go from zero to running in under an hour.

$14 $6.99

Get the Starter Kit →

Also in the OpenClaw store

🗂️
Executive Assistant Config
Buy
Calendar, email, daily briefings on autopilot.
$6.99
🔍
Business Research Pack
Buy
Competitor tracking and market intelligence.
$5.99
Content Factory Workflow
Buy
Turn 1 post into 30 pieces of content.
$6.99
📬
Sales Outreach Skills
Buy
Automated lead research and personalized outreach.
$5.99

Get the free OpenClaw quickstart guide

Step-by-step setup. Plain English. No jargon.