doing.el
DOING-EL(1)doing.elDOING-EL(1)

NAME

doing-elRetrospective 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

doing.el2026-02-12Active