Your AI Transcripts Are a Free Work Journal
I never managed to keep a work journal. Tried paper, Obsidian daily notes, time trackers — they all lasted about a week before I stopped bothering. Then I realized I already had one. Every Claude Code and Gemini CLI session logs every prompt I type.
Those transcripts are sitting on your disk right now. They record what you actually worked on, not what you planned to work on. That’s more honest than any journal I’ve kept.
The idea
Claude Code stores sessions as JSONL files in ~/.claude/projects/. Gemini CLI stores them as JSON in ~/.gemini/. Each file maps to a project directory and contains timestamped user prompts and AI responses.
The AI responses are huge — thousands of tokens of code, explanations, tool calls. But the user prompts? Those are tiny. And they tell you everything: what you asked for, what you were stuck on, what you shipped.
A 50-line bash script can extract yesterday’s prompts, group them by project, and give you a clean summary in under a second.
The script
#!/usr/bin/env bash
# yesterday-summary.sh — Extract user prompts from Claude & Gemini sessions
# Usage: yesterday-summary.sh [YYYY-MM-DD]
set -euo pipefail
DATE="${1:-$(date -d yesterday +%Y-%m-%d)}"
NEXT=$(date -d "$DATE + 1 day" +%Y-%m-%d)
CLAUDE_DIR="$HOME/Claude/code-projects"
GEMINI_DIR="$HOME/Gemini/code-projects"
echo "# Activity Summary: $DATE"
echo ""
# Claude Code sessions
if [[ -d "$CLAUDE_DIR" ]]; then
mapfile -t files < <(find "$CLAUDE_DIR" -name "*.jsonl" \
! -path "*/subagents/*" \
-newermt "$DATE 00:00" ! -newermt "$NEXT 00:00" 2>/dev/null)
for f in "${files[@]}"; do
project=$(basename "$(dirname "$f")")
echo "## $project"
jq -r 'select(.type == "user" and .userType == "external")
| .message.content
| if type == "string" then . else empty end' "$f" \
| grep -vE '^\s*$|^(<|#|\*\*|```|---|>|\[)' \
| grep -vE '^\s*(yes|no|y|n|A|B|C|1|2|3)\s*$' \
| head -20 \
| sed 's/^/- /'
echo ""
done
fi
# Gemini CLI sessions
if [[ -d "$GEMINI_DIR" ]]; then
mapfile -t files < <(find "$GEMINI_DIR" -path "*/chats/*.json" \
-newermt "$DATE 00:00" ! -newermt "$NEXT 00:00" 2>/dev/null)
for f in "${files[@]}"; do
project=$(echo "$f" | rev | cut -d/ -f3 | rev)
echo "## $project"
jq -r '.messages[] | select(.type == "user")
| .content[0].text // empty' "$f" \
| grep -vE '^\s*$|^(---|Content from)' \
| sort -u \
| sed 's/^/- /'
echo ""
done
fi
What the output looks like
# Activity Summary: 2026-02-21
## Claude Code Sessions (1)
### Project: it/premium/terraform/infrastructure
- look into my zsh setup and suggest changes for claude code best user experience
- make a blog post about this to prokopov.me by creating a new PR
- the repository is mprokopov/mprokopov-hugo-static
## Gemini CLI Sessions (1)
### Project: personal
- download github repo mprokopov/raisa-letters and add google verification file
- check the pipeline status
Two sessions, five prompts. That’s my Friday in 10 seconds.
Why user prompts, not full transcripts
Full transcripts are massive — a single Claude Code session can run 50,000+ tokens. The AI responses contain code, file contents, command output, tool calls. Useful in the moment, noise for a daily summary.
User prompts are the signal. They’re short, imperative, and capture intent. “Fix the auth bug”, “add tests for the payment flow”, “deploy to staging” — you can reconstruct your day from these alone.
The filtering matters. Claude Code sessions include tool results, skill system prompts, and confirmation responses (yes, A, 1) mixed into the user messages. The userType == "external" filter in jq catches only what you actually typed. For Gemini, .type == "user" does the same.
Plugging it into a daily routine
I run this through an AI assistant (OpenClaw) as a cron job at 5:55 AM. Five minutes later, a morning planning prompt asks what I want to do today. So I wake up to:
- What I did yesterday (auto-generated from transcripts)
- A question about what I want to do today
The yesterday recap takes zero effort. I didn’t have to log anything — just working with Claude Code and Gemini was enough.
Making it your own
The script assumes macOS/Linux paths synced locally. If you use Claude Code on multiple machines, sync ~/.claude/projects/ with Syncthing or rsync. Same for Gemini’s chat logs.
You could extend this to:
- Weekly summaries — loop over 7 dates, count sessions per project
- Project time tracking — count sessions and timestamps per project directory
- Standup prep — pipe the output to an LLM with “summarize in 3 bullet points”
The data is already there. You’ve been writing a work journal this whole time. You just weren’t reading it.