I Built a CLI That Auto-Generates My Daily Standup Notes from Git History

Published: (February 23, 2026 at 02:50 PM EST)
4 min read
Source: Dev.to

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).

PrefixIntent
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 .gitignore and 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 containing password, token, secret, or api_key are 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_key is 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:

  1. Open branches (not merged to main)
  2. Recent WIP commits
  3. 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.

0 views
Back to Blog

Related posts

Read more »

tmux: a modern replacement for screen

Overview Tmux is a terminal multiplexer. It lets you run multiple programs in a single terminal, detach them so they keep running in the background, and later...