Zero-friction work journaling for Claude Code. Every coding session is automatically summarized, rolled up into daily digests, and synthesized into standup and weekly briefs — all written to markdown files you own.
Session ends → 3-6 bullet summary appended to today's daily note
↓
9 PM + 8:45 AM → daily rollup merges all sessions into one summary
↓
Mon-Fri 8:50 AM → standup brief (yesterday + PRs + commits + calendar)
Monday 8:00 AM → weekly brief (themes, shipped, in-flight, loose ends)
All output goes to a local markdown vault (Obsidian-compatible, but works with any editor).
# Standup Brief — 2026-04-09
## Yesterday
- Shipped PDF extraction migration: replaced mupdf-wasm with pdfjs-dist
- Fixed API/Worker version mismatch in staging
- Fixed text reading-order and stripped multi-line running headers
## Today
- No open PRs to chase — clean slate
- Pick up next medchron task post-PDF migration
## Blockers
- None- Claude Code CLI (
claudecommand available in PATH) - macOS (for scheduled launchd agents) or Linux (manual cron setup)
- Optional:
ghfor PR context in briefs - Optional:
gcalclifor calendar context - Optional:
terminal-notifierfor macOS notifications
git clone https://github.com/YOUR_USERNAME/claude-work-journal.git
cd claude-work-journal
# Basic install (vault defaults to ~/obsidian-notes)
./install.sh
# With custom vault location and git repo for commit history
JOURNAL_VAULT=~/notes JOURNAL_REPO=~/projects/my-app ./install.shThe installer:
- Copies hook scripts to
~/.claude/hooks/ - Copies the
/ideaskill to~/.claude/skills/ - Configures the Claude Code
SessionEndhook in~/.claude/settings.json - Installs and loads launchd agents for scheduled briefs (macOS)
All scripts read configuration from environment variables:
| Variable | Default | Description |
|---|---|---|
JOURNAL_VAULT |
~/obsidian-notes |
Where daily notes and briefs are written |
JOURNAL_REPO |
(none) | Git repo path for commit history in briefs |
JOURNAL_LABEL |
com.claude-journal |
launchd label prefix |
To change settings after install, edit the environment variables in the launchd plists at ~/Library/LaunchAgents/com.claude-journal.*.plist and reload:
launchctl unload ~/Library/LaunchAgents/com.claude-journal.*.plist
launchctl load ~/Library/LaunchAgents/com.claude-journal.*.plistEvery time a Claude Code session ends, the SessionEnd hook:
- Reads the session transcript
- Asks Claude to summarize it in 3-6 bullets
- Appends the summary to
$VAULT/YYYY-MM-DD.md
Subagent sessions are skipped. Large transcripts are truncated to the last 4000 lines.
Runs at 9 PM and 8:45 AM. Merges all session summaries from the day into a single 4-8 bullet "Daily Rollup" at the top of the daily note. Idempotent — uses HTML comment markers so re-runs replace the previous rollup.
Runs Mon-Fri at 8:50 AM. Gathers:
- Yesterday's daily note
- Open PRs (
gh pr list --author @me) - Recent commits (last 36 hours)
- Today's calendar (
gcalcli, if installed)
Produces a brief in Yesterday / Today / Blockers / Heads up format, written to $VAULT/Briefs/standup-YYYY-MM-DD.md.
Runs Monday at 8:00 AM. Reads the past 7 days of daily notes plus git history. Produces Themes / Shipped / In flight / Loose ends / Wins format, written to $VAULT/Briefs/weekly-YYYY-Www.md.
Type /idea your thought here in Claude Code to quickly append an idea (with conversation context) to $VAULT/Inbox.md.
$VAULT/
├── 2026-04-09.md # Daily note with session summaries + rollup
├── 2026-04-08.md
├── Inbox.md # Quick ideas from /idea
└── Briefs/
├── standup-2026-04-09.md # Today's standup brief
└── weekly-2026-W15.md # This week's summary
The installer only sets up launchd (macOS). On Linux, add cron entries manually:
# Daily rollup: 9 PM + 8:45 AM
0 21 * * * JOURNAL_VAULT=~/obsidian-notes /path/to/.claude/hooks/daily-rollup.sh
45 8 * * * JOURNAL_VAULT=~/obsidian-notes /path/to/.claude/hooks/daily-rollup.sh
# Standup brief: Mon-Fri 8:50 AM
50 8 * * 1-5 JOURNAL_VAULT=~/obsidian-notes JOURNAL_REPO=~/my-repo /path/to/.claude/hooks/standup-brief.sh
# Weekly brief: Monday 8:00 AM
0 8 * * 1 JOURNAL_VAULT=~/obsidian-notes JOURNAL_REPO=~/my-repo /path/to/.claude/hooks/weekly-brief.sh./uninstall.shRemoves hook scripts, launchd agents, and the idea skill. Your notes are not deleted.
Briefs not generating? Check the log files:
cat ~/.claude/hooks/standup-brief.log
cat ~/.claude/hooks/standup-brief.errSession summaries not appearing? Verify the hook is configured:
cat ~/.claude/settings.json | jq '.hooks.SessionEnd'macOS TCC / Full Disk Access issues? If your vault is inside ~/Documents, launchd agents may be blocked by macOS privacy controls. Move your vault outside ~/Documents (e.g., ~/obsidian-notes) or grant Full Disk Access to /bin/bash in System Settings > Privacy & Security.
The system uses Claude's claude -p (prompt mode) to generate all summaries. Each script pipes context into Claude with a carefully tuned prompt and writes the markdown output to disk. No API keys needed beyond what Claude Code already uses — claude -p handles authentication.
MIT