How to Build an OpenClaw Skill that Automates Your Morning Routine
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.mdStep 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
gwscalls into a single batch if possible. - Outdated news: Ensure you're using a tool like
web_fetchorfirecrawl_searchto 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.
Continue Implementation
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
Get the free OpenClaw quickstart guide
Step-by-step setup. Plain English. No jargon.