NAME
doing-el — Retrospective time tracking in Emacs — log activities as they happen, review where time actually went.
SYNOPSIS
status: active
tags: emacs
repo: https://github.com/xiaoxinghu/doing.el
Overview
doing.el is an activity journal for Emacs. It answers "what was I doing?" rather than "what should I do next?". The workflow is a direct port of Brett Terpstra's doing CLI into Emacs, with org-mode as the storage format instead of doing's custom file.
The core gesture: start something, start something else (which auto-finishes the previous), review at end of day. That's it.
Why
I needed frictionless activity logging without leaving Emacs. The original doing CLI is excellent but its data isn't org-native, and calling a shell tool breaks flow. Existing Emacs time-tracking tools (org-clock, etc.) require pre-configured projects and explicit start/stop discipline. I wanted something closer to a running log — describe what you're doing in a sentence, move on, and reconstruct the day afterward.
Storage
All data lives in ~/org/doing/ (configurable) as plain org files:
~/org/doing/
├── today.org # active: only today's entries
├── week.org # current ISO week, minus today
└── archive/
├── 2026-W01.org
├── 2026-W02.org
└── ...Each entry is a plain org headline with a properties drawer:
#+begin_src org
Fix authentication bug
Tags come from @tag tokens in the description at capture time — they're stripped from the title and stored as org tags. Durations are computed from =STARTED=/=ENDED= timestamps; DURATION is stored redundantly for human readability.
Rollover is lazy and throttled to once per hour. On first command of the day, today.org entries from prior dates flush to week.org; on first command of the week, prior-week entries route to their archive/YYYY-WNN.org file.
Commands
All bound under C-c d:
C-c d n | doing-now | Start a new activity; auto-finishes current |
C-c d f | doing-finish | Explicitly finish current activity |
C-c d c | doing-current | Show current activity + elapsed time |
C-c d a | doing-again | Resume the last finished activity |
C-c d t | doing-view-today | View buffer of today's entries |
C-c d w | doing-view-week | View buffer of this week's entries |
C-c d T | doing-totals | Time totals grouped by tag for current week |
C-c d s | doing-search | Search by text or @tag |
C-c d e | doing-edit | Open today.org, jump to current entry |
Also available via M-x: doing-cancel, doing-note, doing-view-yesterday, doing-view-since, doing-last.
Configuration
Auto-tag entries based on working directory:
(setq doing-auto-tags
'(("~/projects/doing.el" :project "doing-el" :tags ("emacs" "elisp"))
("~/projects/api" :project "api" :tags ("backend" "go"))))Longest-prefix-match wins, so subdirectories can override parent directories. User-supplied tags always take precedence over auto-tags.
Per-project config via .dir-locals.el also works:
((nil . ((doing-project . "my-project")
(doing-default-tags . ("tag1" "tag2")))))No external dependencies — requires only Emacs 27.1+ and Org 9.0+ (both standard).
Notes
Built with AI assistance (Claude Code, ChatGPT) despite limited prior Elisp experience. The module structure is deliberately fine-grained: doing-lib.el owns all data access, capture/finish/rollover live in separate files. This kept AI-generated code reviewable in small chunks.
Currently no org-clock or org-agenda integration — intentional. The tool is meant to be orthogonal to the rest of the Org ecosystem, not woven into it.
AUTHOR
Xiaoxing Hu