Every runbook in the gallery started as a blank file. Someone had a task they were doing by hand, wrote it down, and told their agent to handle it instead. That is the whole process.
This tutorial walks through building a real runbook from scratch: a daily standup summarizer. By the end, your agent will check your git history and calendar every morning and generate a standup report. You will never write another standup manually.
What you need
- OpenClaw installed and running
- A connected channel (Telegram is easiest)
- 15-20 minutes
Step 1: Start with a blank SOUL.md
SOUL.md is where your agent gets its personality and core behavior. It loads once at startup. Every session, your agent reads it first.
Navigate to your workspace:
cd ~/.openclaw/workspaceCreate a blank SOUL.md:
touch SOUL.mdOpen it and add something minimal. Do not overthink it. The goal is to tell your agent what role it plays and how it should behave:
# SOUL.md
You are a productivity assistant. Your job is to help reduce the time spent on repetitive reporting.
Be concise. No filler. Deliver information in the shortest format that is still useful.
When you run a report, send it to Telegram. Do not ask for confirmation first.That is enough for a starting point. You can refine it later.
Step 2: Install the skills you need
The standup summarizer needs two things: access to git history (via the github skill) and calendar data (via the gog skill). Install both:
clawhub install github
clawhub install gogThe github skill wraps the gh CLI. The gog skill connects to Google Calendar, Gmail, Drive, and Sheets. For the standup, you only need the calendar piece.
If you have not set up gog yet, follow the auth flow it shows you. It takes about 10 minutes the first time (OAuth with your Google account). After that it just works.
Step 3: Write the HEARTBEAT.md
HEARTBEAT.md is where you define scheduled behavior. Your agent reads it on every heartbeat poll. Write tasks as a numbered list of things to check and do.
Create the file:
touch HEARTBEAT.mdHere is the standup summarizer runbook:
# HEARTBEAT.md
Every weekday at 8:45am:
1. Check git log for commits in the last 24 hours across all repos
- Run: git log --all --since="24 hours ago" --format="%h %s" --author="$(git config user.email)"
- If no repos are configured, note that and move on
2. Check Google Calendar for today's meetings
- List events from now until end of day
- Include: title, time, attendees count
3. Generate a standup report in this format:
Yesterday: [list of commits, one line each]
Today: [list of meetings + any planned work]
Blockers: [anything that needs attention]
4. Send the report to Telegram
5. Keep the whole report under 15 linesSave the file. Your agent will pick it up on the next heartbeat poll.
Step 4: Test it
Do not wait until 8:45am to find out if it works. Send your agent a message in Telegram:
Run the standup report nowYour agent will read HEARTBEAT.md, execute the steps, and send back a report. If something is wrong (no git access, gog not connected), it will tell you what failed.
Common issues:
- No git repos found: tell your agent which directory to check, or run git init in your project
- gog not authenticated: run the gog auth flow if you skipped it
- Calendar empty: normal if you have no events today. The report will still run.
Step 5: Customize it
The template works as-is, but a few tweaks make it yours:
- Change the time: replace 8:45am with whatever works for your standup
- Add repos: specify exact paths if you have multiple projects
- Add tasks: pull from a GitHub Projects board or Notion if you use those
- Change the format: match whatever format your team uses
The real value of building from scratch is knowing every line of the runbook. You wrote it. You know exactly what it does and how to change it.
The pattern
This same pattern works for any runbook:
- Identify a task you do by hand on a schedule
- Write down what you actually do, step by step
- Paste that into HEARTBEAT.md (for scheduled tasks) or SOUL.md (for always-on behavior)
- Install any skills needed
- Test it manually first, then let the schedule run it
The gallery has 40+ runbooks that followed this exact process. If you build something that works, submit it. Other people are hitting the same problems.
Submit your runbook at tryrunbooks.com/submit.