Back to Tools
Command

Daily Briefing

Generate personalized daily briefings from your calendar and past meeting notes with Claude Code

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

  1. Fetch Calendar Events - Python script retrieves today's events via Google Calendar API
  2. Search Meeting Notes - Claude searches your Obsidian vault for relevant past meetings
  3. Extract Context - Action items, decisions, and personal context are identified
  4. 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.

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.