log.md: The Single File That Replaces Your Standup, Journal, and Memory
I stopped using Notion, Linear, Slack threads, and daily standup tools. Not because I'm anti-productivity. Because I found something simpler: a single text file called log.md that I append to every day.
No sync conflicts. No database migrations. No subscription renewals. Just one file that grows forever, tracked in git, where git blame becomes a time machine.
This is the append-only discipline that actually works.
Table of Contents
- What Append-Only Actually Means
- The log.md Structure That Scales
- Git Blame as Your Time Travel Interface
- How to Grep Your Own History
- AI-Powered Morning Briefings from Your Log
- When to Break the Append-Only Rule
- Why This Works for Solo Builders and Small Teams
What Append-Only Actually Means
Append-only isn't just a database concept. It's a discipline.
You write. You never edit. You never delete. Every entry is permanent.
Redis uses append-only files (AOF) for durability. Every write command gets appended to disk immediately. You can't modify history, only replay it. Your log.md works the same way.
The append-only constraint forces honesty. When you can't edit yesterday's entry to make yourself look smarter, you stop performing for an imaginary audience. You write what actually happened.
Analogy: Think of log.md like a blockchain for your thoughts. Each day's entry builds on the last, cryptographically linked by git commits. You can't rewrite history without everyone (including future you) knowing.
Here's what breaks the discipline:
- Fixing typos from three days ago
- Reorganizing old sections for clarity
- Deleting embarrassing predictions that didn't pan out
- Merging duplicate entries
Here's what maintains it:
- Write today's clarification as a new entry
- Reference old entries with dates: "Re: 2024-01-15, turned out X was wrong"
- Let the messy parts stay messy
- Trust future grep to find connections
The log.md Structure That Scales
Your log.md needs exactly three elements:
Date headers in YYYY-MM-DD format. ISO 8601 is grep-friendly and sorts correctly. Every entry starts with a level-2 heading:
## 2024-01-15
Shipped the API refactor. Took 3 days instead of "a few hours."
Lesson: always triple your time estimate for architectural changes.
## 2024-01-16
Bug reports from yesterday's deploy. The error handling I skipped?
Yeah, that's what broke.
Timestamped sub-entries when context matters. Use HH:MM for events within a day:
## 2024-01-17
09:30 - Customer call. They want the export feature by Friday.
14:00 - Started export implementation. Realized our data model won't support it.
16:45 - Proposed workaround: CSV-only for now, full export in v2.
Tags as inline anchors for grep. Use #project-name or @person-name or !blocker consistently:
## 2024-01-18
#api-refactor: Finally merged. @sarah reviewed in 20 minutes.
!blocker: Can't deploy until staging tests pass.
That's it. No metadata blocks. No frontmatter. No nested hierarchies. Just dates, times, and inline tags.
Git Blame as Your Time Travel Interface
Run git blame log.md and you see every line annotated with:
- Commit hash
- Author
- Date
- Time
This is your time machine. Every entry links to the exact moment you wrote it.
Want to know when you decided to pivot from feature X? git log -S "feature X" log.md
Want to see what you were thinking three months ago? git show HEAD~90:log.md | grep "$(date -d '90 days ago' +%Y-%m-%d)"
Want to replay your thought process on a specific project? git log, all, grep "#project-name", log.md
The append-only constraint means every git blame line is accurate. You never retroactively changed your mind in the file itself. You wrote a new entry admitting you were wrong.
How to Grep Your Own History
Your log.md becomes your external memory. But only if you can query it.
Find every mention of a project:
grep -n "#api-refactor" log.md
See all entries from a specific month:
grep -A 10 "^## 2024-01" log.md
Extract all blocker tags:
grep "!blocker" log.md
Get context around a specific date:
grep -B 5 -A 5 "2024-01-15" log.md
Find patterns across time:
grep -E "Lesson:|Mistake:|Should have" log.md
This is why inline tags matter. They're grep anchors. Consistent syntax means reliable queries.
I keep a query.sh script with common searches:
#!/bin/bash
case $1 in
blockers) grep "!blocker" log.md ;;
lessons) grep -E "Lesson:|Learned:" log.md ;;
month) grep -A 10 "^## $2" log.md ;;
*) echo "Usage: query.sh {blockers|lessons|month YYYY-MM}" ;;
esac
Now ./query.sh blockers surfaces every unresolved blocker instantly.
AI-Powered Morning Briefings from Your Log
Here's where log.md gets interesting. Feed your last week of entries into Claude or GPT:
tail -n 100 log.md | pbcopy
Paste into this prompt:
Summarize the last week from this log. Highlight:
1. Open blockers tagged !blocker
2. Patterns in time estimates vs. reality
3. Unfinished threads or decisions
4. Lessons learned
Keep it under 10 bullet points.
The AI reads your append-only log and generates your morning briefing. No manual weekly review. No trying to remember what happened Tuesday.
For teams, everyone maintains their own log.md in a shared repo. The AI prompt becomes:
Summarize this week's team logs. Identify:
1. Cross-person blockers
2. Duplicate work
3. Communication gaps
4. Momentum shifts
Instant async standup. No meeting required.
When to Break the Append-Only Rule
Two exceptions:
Redacting sensitive data. If you accidentally logged a production API key, delete it. Security > purity.
Archiving after one year. Move entries older than 12 months to log-archive-YYYY.md. Your active log stays fast for grep.
Everything else? Append a correction. Don't edit history.
Why This Works for Solo Builders and Small Teams
Context-switching kills momentum. Every tool switch costs 5-10 minutes of mental reload time.
log.md eliminates tool sprawl:
| Replaced Tool | log.md Equivalent |
|---|---|
| Daily standup | Grep yesterday's entries |
| Notion journal | Append-only markdown |
| Linear updates | Inline #project tags |
| Slack threads | @mention + timestamp |
| Time tracking | HH:MM prefixes |
| Retrospectives | Grep "Lesson:" |
One file. One syntax. One workflow.
For solo builders, it's your second brain. For small teams (2-5 people), it's an async communication layer. Everyone reads everyone's log.md when needed. No mandatory meetings. No forced updates.
The discipline is simple: open log.md every morning, write the date, append your day. Close it every evening with a final entry.
No AI cliches about "unlocking productivity." Just a text file that grows with your work, queryable forever, honest about your mistakes, tracked in git.
Try it for two weeks. Create log.md in your home directory. Add it to a private git repo. Write one entry per day. Never edit. Only append.
If you're still using it after 14 days, you'll probably use it for 14 years.
The append-only constraint isn't a limitation. It's freedom from the anxiety of keeping everything perfectly organized. You don't curate. You capture. Future grep will find it.