Overview
The /daily-briefing command generates a comprehensive daily briefing by analyzing your
Google Calendar events and searching your Obsidian vault for relevant context from past meetings.
What You'll Get
- Quick Overview - Critical action items and key context for the day
- Per-Event Context - Relevant notes and action items for each meeting
- Personal Follow-Ups - Suggested questions for one-on-ones based on past conversations
- Action Items - Extracted tasks from previous meetings with attendee highlighting
- Quoted Context - Exact quotes from past meetings with source links
How It Works
- Fetch Calendar Events - Python script retrieves today's events via Google Calendar API
- Search Meeting Notes - Claude searches your Obsidian vault for relevant past meetings
- Extract Context - Action items, decisions, and personal context are identified
- Generate Briefing - Structured markdown briefing is created with grounded quotes
Installation
Ready to set up Daily Briefing?
This setup requires Google Calendar API credentials and takes about 10 minutes. You'll need to create a Google Cloud project.
Prerequisites
Let's make sure you have the required tools installed.
Do you have Claude Code installed?
Google Calendar API Setup
Create OAuth credentials in Google Cloud Console.
Install Python Dependencies
Install the Google API libraries.
Download Calendar Script
Get the script that fetches your calendar events.
Download Claude Command
Install the /daily-briefing command for Claude Code.
Automated Workflow (Optional)
Set up n8n to generate briefings automatically each morning.
Setup Complete!
The /daily-briefing command is ready to use.
Pipe your calendar data to the command in Claude Code to generate your briefing.
Scroll down to see usage examples.
Usage
Manual Usage
First, fetch your calendar events:
~/scripts/calendar-events/fetch_today_events.py > /tmp/calendar.json Then run the Claude command with the calendar data:
cat /tmp/calendar.json | claude -p "/daily-briefing" Automated Usage (n8n)
If you've set up the n8n workflow, briefings are generated automatically at 5am on weekdays. The workflow handles fetching calendar data, running the command, and saving the output.
Output Format
The generated Obsidian note follows this structure:
# Daily Briefing - 2025-12-16
> Generated using filesystem search
> [!important] Quick Overview
> - Critical action item for today's standup
> - Key decision point from last week's planning
> - Blocker to discuss with engineering lead
## Table of Contents
- [Team Standup (09:00 - 09:30)](#team-standup-0900---0930)
- [1:1 with Jason (10:00 - 10:30)](#11-with-jason-1000---1030)
---
## Team Standup (09:00 - 09:30)
**Attendees**: erik, jason, sarah
### [[2025-12-13 Sprint Planning]]
(Relevance: 75 points | Recency: 3 days ago)
**Action Items**:
- [ ] @Erik — Review API spec before Monday standup ⭐
- [ ] @Jason — Update deployment scripts
**Quoted Context**:
> "We agreed to prioritize the authentication refactor this sprint."
> "Blocked on infrastructure team for staging environment."
---
## 1:1 with Jason (10:00 - 10:30)
**Attendees**: jason
> [!tip] Personal Follow-Up
> "How was your daughter's soccer tournament?" → from [[2025-12-09 1-1 Jason]]
### [[2025-12-09 1-1 Jason]]
(Relevance: 82 points | Recency: 7 days ago)
**Action Items**:
- [ ] @Jason — Draft proposal for new CI pipeline
**Quoted Context**:
> "Jason mentioned feeling stretched thin across multiple projects."
---
*Generated at 2025-12-16 05:00:15*
*Found 8 relevant notes across 5 events* Meeting Note Format
For the Daily Briefing to find relevant context, your meeting notes need consistent frontmatter. The search relies on this metadata to match past meetings with today's calendar events.
Required Frontmatter
---
title: "Weekly Sync with Engineering Team"
date: 2025-12-13
people:
- jason
- sarah
- erik
type: meeting
tags:
- engineering
- sprint-planning
--- Key Fields for Search
- title - Descriptive meeting title (matched against calendar event titles)
- date - Meeting date in YYYY-MM-DD format (used for recency scoring)
- people - List of attendee first names (matched against calendar attendees)
- type - Meeting type:
meeting,one-on-one,standup, etc. - tags - Topics and themes for additional context matching
Optional but Helpful
- project - Associated project name
- status - Meeting status (completed, cancelled)
- location - Meeting location or video link
Why frontmatter matters:
Without proper frontmatter, the search can only match on file content. With good metadata, you get much more accurate results because the command can match attendee names to your calendar, prioritize recent meetings, and identify relevant one-on-ones for personal follow-ups.
Configuration
Obsidian Vault Structure
The command expects meeting notes organized by quarter:
~/Obsidian/Vault/
├── Meetings/
│ └── 2025/
│ ├── Q125/
│ ├── Q225/
│ ├── Q325/
│ └── Q425/
├── Dashboard/
│ └── Daily Briefing.md (output location)
└── Templates/
└── Tag Reference.md (name normalization) Customizing Paths
Edit ~/.claude/commands/daily-briefing.md to customize:
- Meeting notes directory structure
- Output file location
- Tag Reference file location
- Relevance scoring thresholds
Downloads
Prefer to install manually? Download the files directly:
Troubleshooting
Error: Credentials file not found
Ensure your Google OAuth credentials are at ~/.google/credentials.json.
Follow the Google Calendar API Quickstart to create credentials.
Error: Token refresh failed
Delete ~/.google/token.json and run the script again to re-authenticate.
No events found
Check that you're using the correct calendar ID. The script uses primary by default.
Use --calendar-id to specify a different calendar.
Command not found: /daily-briefing
Make sure the daily-briefing.md file is in your ~/.claude/commands/ directory
and restart Claude Code.
No relevant notes found
The command searches Meetings/YYYY/Q#YY/ directories. Ensure your meeting notes
are organized in this structure and contain attendee names matching your calendar.