I Built a CLI That Auto-Generates My Daily Standup Notes from Git History
Source: Dev.to
The Problem: Nobody Remembers What They Did Yesterday
Every morning, the same ritual. Standup starts in 5 minutes. You stare at Slack trying to reconstruct what you worked on. You check your browser history. You scroll through git log. You write something vague like “continued work on the feature.”
I got tired of this. My git history already has everything — what I changed, when, and why. Why am I manually summarizing it every day?
So I built dev‑journal.
pip install dev-journal
dev-journal collect --since 2026-02-17
dev-journal standup
That’s it. Your standup is ready to paste.
Example Daily Standup — February 23, 2026
### What I did yesterday:
- **[my-app]** feat: implement rate limiting middleware (4 files, +112/-8)
- **[my-app]** fix: correct null check in auth handler (2 files, +15/-6)
- **[api-client]** chore: bump httpx to 0.27 (1 file, +3/-3)
### What I'm working on today:
- Continue work on branch: `feature/oauth2-integration`
### Blockers:
- None
---
*Stats: 3 commits | 7 files | +130/-17 lines | repos: my-app, api-client*
The tool can also aggregate an entire ISO week: total commits, lines changed, per‑repo breakdown, daily heatmap, and top highlights by impact. It generates Dev.to‑compatible markdown with YAML front‑matter, narrative sections per repo, stats, and placeholder sections for “Lessons Learned.” (Yes, I used dev‑journal to help write this post.)
How dev‑journal Works
dev‑journal has three collectors and three generators:
Collectors: Generators:
┌──────────────┐ ┌──────────────────┐
│ git log │───┐ │ standup (daily) │
│ file mtime │───┼────>│ weekly (sprint) │
│ shell history│───┘ │ blog (Dev.to) │
└──────────────┘ └──────────────────┘
│ │
▼ ▼
SQLite DB text / markdown / json
Commit‑type Classification
dev‑journal parses git log --stat output and classifies each commit’s intent using conventional‑commit prefixes (or keyword fallback).
| Prefix | Intent |
|---|---|
feat: | FEATURE |
fix: | FIX |
refactor: | REFACTOR |
docs: | DOCS |
test: | TEST |
| (else) | CHORE |
It also extracts file counts, insertions/deletions, and normalizes timezone‑aware timestamps.
Additional Scanning
- File collector – scans recently modified files, grouped by language and directory; respects
.gitignoreand skips common junk (__pycache__,node_modules, etc.). - Shell collector – parses Zsh/Bash history for developer commands (
git,pytest,docker,make). Disabled by default; sensitive commands containingpassword,token,secret, orapi_keyare automatically filtered and never stored.
Project Layout
src/dev_journal/
├── cli.py # Click CLI: 7 commands
├── config.py # TOML config at ~/.dev-journal/
├── storage.py # SQLite with full CRUD
├── formatter.py # Rich terminal output
├── collectors/
│ ├── git_collector.py # git log parser
│ ├── file_collector.py # mtime scanner
│ └── shell_collector.py # history parser
└── generators/
├── standup.py # daily notes
├── weekly.py # sprint summary
└── blog.py # Dev.to draft
Design Principles
- All data is local – SQLite database stored at
~/.dev-journal/journal.db. Nothing leaves your machine. - Shell history is opt‑in – disabled by default; you explicitly enable it.
- Sensitive data is filtered – any command matching
password,secret,token,api_keyis skipped. - User‑controlled tracking – configure ignored extensions, directories, and patterns.
Commit Intent Classification Logic
The classifier first uses conventional‑commit prefixes. If none are present, it falls back to keyword analysis:
- Messages containing “add”, “implement”, “create” → FEATURE
- Messages containing “fix”, “resolve”, “patch” → FIX
- Messages containing “refactor”, “restructure”, “clean” → REFACTOR
Predicting Today’s Work
The hardest generator problem is predicting what you’ll work on today. dev‑journal looks at:
- Open branches (not merged to
main) - Recent WIP commits
- Commits from today that look incomplete (small changes, no tests)
It isn’t perfect, but it beats staring at a blank text box.
Project Health
- 67 tests passing
- 74 % coverage
- Python 3.9–3.12 matrix CI
- 3 output formats: text, markdown, JSON
Installation & Quick Commands
pip install dev-journal
dev-journal collect --since $(date -v-7d +%Y-%m-%d)
dev-journal standup --copy # copies to clipboard
Get Involved
Star it on GitHub:
How do you prepare for standup? Let me know in the comments if you’ve tried automating it.