Morning Synthesis: a Start-of-Day Note Before Coffee
Schedule Claude Code to read your recent notes and write a daily start-of-day briefing.
Run this workflow
CI-verified, 6/6 fixtures passing.
Intended Use
Obsidian users who keep dated daily notes and want an automatic morning briefing (where you left off, due today, overdue, suggested focus) generated by Claude Code on a schedule.
Not for
- Vaults without dated tasks, 'overdue' only works if your tasks carry dates
- Anyone who hasn't backed up their vault, the agent writes to it (git is ideal)
The Stack
Tested Against
claude-codebash@5.xcoreutils@9.xobsidian@1.7.xSide effects & data flow
- Network
- Anthropic API, only in the non-CI Claude step
- Writes
- ./vault/Daily/, ~/bin/morning-synthesis.sh
- Credentials
- Claude Code login, for the synthesis step only
Data privacy
- Anthropic (Claude), only in the non-CI agent step ← the text of your recent daily and project notes (retention: per Anthropic's API/data policy)
Prerequisites
- Claude Code installed and logged in: `npm i -g @anthropic-ai/claude-code`
- An Obsidian vault with Daily/ and Projects/ folders
- Back up your vault first (git ideal), the agent writes to it
- cron (built into macOS/Linux)
Steps
- 1
Check your toolchain
The deterministic setup only needs bash, coreutils and cron. Claude Code is the agent for the final step, so we just warn if it's missing.
for bin in bash date find; do command -v "$bin" >/dev/null 2>&1 || { echo "MISSING required: $bin"; exit 1; } done command -v claude >/dev/null 2>&1 || echo "optional (needed for the synthesis step): claude" echo "preflight OK on $(uname -s)" - 2
Scaffold the vault
Create the Daily/ and Projects/ folders Claude reads, with a couple of sample notes to synthesize.
mkdir -p vault/Daily vault/Projects printf '%s\n' '- [ ] Ship the importer (due 2026-06-02)' > vault/Projects/importer.md printf '%s\n' 'Left off mid-refactor.' > vault/Daily/2026-06-03.md find vault -type d | sort - 3
Write the scheduled script
This is the exact morning-synthesis.sh from the guide. We write it, make it executable, and confirm it carries the claude -p call.
mkdir -p bin cat > bin/morning-synthesis.sh <<'EOF' #!/usr/bin/env bash cd ~/Documents/MyVault claude -p "Read my daily notes from the last 3 days in Daily/ and my active notes in Projects/. Create Daily/$(date +%F)-start-of-day.md with four sections: Where I left off, Due today, Overdue, and Suggested focus priority. Keep it short." EOF chmod +x bin/morning-synthesis.sh test -x bin/morning-synthesis.sh && grep -q 'claude -p' bin/morning-synthesis.sh && echo "script ready: bin/morning-synthesis.sh" - 4
Check the dated path and the cron line
Prove the output filename resolves to a real dated path, and that the 7am schedule is well-formed.
echo "would write: Daily/$(date +%F)-start-of-day.md" echo "0 7 * * * /Users/you/bin/morning-synthesis.sh" | grep -Eq '^[0-9]+ [0-9]+ \* \* \* ' && echo "cron OK: daily at 07:00" - 5
Let it run (the Claude step, not checked by CI)
Schedule it with `crontab -e` (add `0 7 * * * ~/bin/morning-synthesis.sh`) and Claude Code writes your briefing each morning. This step needs your Claude login and produces judgement-based output, so CI doesn't run it, the badge covers the scaffold, script and schedule above.
Eval, 6 fixtures
Last passed: verified 10d agoclean-exitexit_codetimeout 15s · max $0Expected:
0cron-okcontainstimeout 15s · max $0Expected:
cron OK: daily at 07:00dated-pathregextimeout 15s · max $0Expected:
Daily/[0-9]{4}-[0-9]{2}-[0-9]{2}-start-of-day\.mdpreflight-okcontainstimeout 15s · max $0Expected:
preflight OKscript-readycontainstimeout 15s · max $0Expected:
script ready: bin/morning-synthesis.shvault-dailycontainstimeout 15s · max $0Expected:
vault/Daily
Results
From the WebAfterAI guide: 5 Obsidian + Claude workflows that actually run.