Skip to content

emacsmirror/doing

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

64 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

doing.el — Activity Logging for Emacs

https://github.com/xiaoxinghu/doing.el/actions/workflows/test.yml/badge.svg https://github.com/xiaoxinghu/doing.el/actions/workflows/lint.yml/badge.svg

./assets/screenshot.png

Acknowledgment

doing.el is a direct reimplementation of Brett Terpstra’s excellent doing CLI tool for the Emacs environment. The workflow philosophy, command naming, and core concepts come directly from that project, adapted to work natively with Org-mode.

About This Project

This package was developed entirely through AI-assisted “vibe coding” using Claude Code and ChatGPT. The overwhelming majority of the code was written by coding agents, with human guidance on design and workflow.

This is an experiment in whether an experienced software engineer can effectively build quality software in an unfamiliar language by leveraging AI coding assistants. The author has limited Emacs Lisp skills (can read basic elisp and copy-paste config snippets), but brings experience across multiple programming languages and technology stacks.

NOTE: I do use the package myself, and I built it because I needed it to exist, the experiment is not the main point here, and I do carefully read what the agents are doing. So, don’t dismiss it because the code is not “free range”. I did put a lot of effort and will continue working on it. It’s just not necessarily in the form of coding.

More detailed reflections on this development approach and the experiment’s outcomes will be published in the future.

What is doing.el?

doing.el is an Emacs package for frictionless activity logging and time tracking.

It’s designed to answer the question: “What was I doing?”

Unlike traditional task managers that focus on planning future work, doing.el is optimized for capturing what you’re doing right now and generating retrospective reports about where your time went.

Key Features

  • Fast, low-friction capture — Start logging an activity with one command
  • Inline @tag syntax — Add tags naturally within your activity description
  • Automatic time tracking — Durations computed from timestamps, no manual timers
  • Retrospective reporting — View today, this week, or totals by tag
  • Project-aware auto-tagging — Automatically tag entries based on current directory
  • Org-native storage — All data stored as plain Org-mode files
  • Automatic archival — Entries automatically migrate from hot (today.org) to warm (week.org) to cold (archive/) storage

Installation

Direct Installation from Repository

Install directly from GitHub using use-package with :vc:

(use-package doing
	:vc (:url "https://github.com/xiaoxinghu/doing.el" :rev :newest)
  :bind ("C-c d" . doing-command-map))

Note: The :vc keyword requires Emacs 29 or later. For older versions, use manual installation below.

Manual Installation

  1. Clone this repository:
    git clone https://github.com/yourusername/doing.el.git
        
  2. Add to your Emacs configuration:
    (add-to-list 'load-path "/path/to/doing.el")
    (require 'doing)
        
  3. Optionally set up keybindings:
    (global-set-key (kbd "C-c d") doing-command-map)
        

Quick Start

Basic Workflow

  1. Start an activity:
    M-x doing-now RET Write README
        
  2. Check what you’re doing:
    M-x doing-current
    # => [0:15] Write README *
        
  3. Finish the activity:
    M-x doing-finish
    # => Finished: Write README (0:23)
        
  4. View your day:
    M-x doing-view-today
        
  5. Add tags with @tag syntax:
    M-x doing-now RET Fix bug @testing @emacs
    # Tags are extracted automatically
        

That’s it! No project setup, no file management, just start logging.

Auto-Finish Behavior

When you start a new activity with doing-now, any unfinished activity is automatically finished. This creates a natural flow:

M-x doing-now RET Write tests
M-x doing-now RET Review pull requests  # automatically finishes "Write tests"

Commands Reference

Capture & Lifecycle

CommandKeybindingDescription
doing-nowC-c d nStart a new activity
doing-finishC-c d fFinish current activity
doing-cancel(none)Cancel current activity (delete)
doing-againC-c d aResume last finished activity
doing-note(none)Add a note to current activity

Viewing

CommandKeybindingDescription
doing-view-todayC-c d tShow today’s activities
doing-view-yesterday(none)Show yesterday’s activities
doing-view-weekC-c d wShow this week’s activities
doing-view-recent(none)Show N most recent entries
doing-view-since(none)Show entries since a date

Reporting

CommandKeybindingDescription
doing-totalsC-c d TShow time totals by tag
doing-searchC-c d sSearch entries by text or @tag

Utilities

CommandKeybindingDescription
doing-currentC-c d cShow current activity in minibuffer
doing-last(none)Show last entry
doing-editC-c d eOpen today.org and jump to current
doing-openC-c d oOpen a doing log file

Usage Examples

Tagging Activities

Add tags when starting an activity to enable filtering and reporting.

Inline @tag Syntax (Recommended)

The easiest way to add tags is using inline @tag syntax:

M-x doing-now RET Fix authentication bug @backend @bug

The @tags are automatically extracted and removed from the title. The entry is saved as:

* Fix authentication bug :backend:bug:

You can use @tags anywhere in the title:

M-x doing-now RET Writing @documentation for the API
# => Creates: "* Writing for the API :documentation:"

Programmatic Tags

When calling doing-now programmatically, you can also provide tags as a list:

(doing-now "Fix authentication bug" '("backend" "bug"))

Inline @tags and programmatic tags are merged together if both are provided.

Auto-Tagging by Directory

Configure automatic tags based on your current directory:

(setq doing-auto-tags
      '(("~/projects/doing.el" :project "doing-el" :tags ("emacs" "elisp"))
        ("~/projects/api"      :project "api"      :tags ("backend" "go"))
        ("~/projects/website"  :project "website"  :tags ("frontend" "react"))))

Now when you call doing-now from within these directories, tags and project properties are applied automatically.

Auto-tags are merged with inline @tags and programmatic tags, with user-provided tags taking precedence:

# From ~/projects/doing.el directory:
M-x doing-now RET Fix bug @testing
# => Creates: "* Fix bug :testing:emacs:elisp:"
#    (inline @testing + auto-tags emacs, elisp)

Adding Notes

Add context to your current activity:

M-x doing-note RET Found the issue in session middleware
M-x doing-note RET Updated auth flow diagram

Notes are appended to the entry body and preserved during archival.

Time Totals

See where your time went this week:

M-x doing-totals

Totals for 2026-W04

By tag:
  emacs            4:30
  backend          3:15
  frontend         2:45
  bug              1:30
  ----------------
  Total           12:00

Searching

Search by text:

M-x doing-search RET authentication

Search by tag:

M-x doing-search RET @bug

Resuming Activities

Quickly resume your last activity:

M-x doing-again
# Creates a new entry with the same title and tags as your last finished activity

Storage Model

File Organization

doing.el uses a three-tier storage system optimized for performance:

~/org/doing/
├── today.org              # Hot: today's activities only
├── week.org               # Warm: current ISO week
└── archive/
    ├── 2026-W01.org       # Cold: archived weeks
    ├── 2026-W02.org
    └── 2026-W03.org

Automatic Rollover

Entries automatically migrate between files:

  • Daily: At midnight, yesterday’s entries move from today.org to week.org
  • Weekly: On Monday, last week’s entries move from week.org to archive/YYYY-WNN.org

Rollover happens lazily (triggered by commands) and is throttled to once per hour for performance.

Entry Format

Each activity is stored as an Org headline with tags:

* Write README :emacs:documentation:
:PROPERTIES:
:ID:       20260124T153000
:STARTED:  [2026-01-24 Fri 15:30]
:ENDED:    [2026-01-24 Fri 16:15]
:DURATION: 0:45
:PROJECT:  doing-el
:END:
Added installation instructions and usage examples.

Tags can be added using inline @tag syntax when creating the entry:

M-x doing-now RET Write README @emacs @documentation

Configuration

Basic Setup

;; Optional: change the storage directory (default: ~/org/doing/)
(setq doing-directory "~/Documents/doing/")

;; Optional: set up keybindings
(global-set-key (kbd "C-c d") doing-command-map)

Auto-Tagging Setup

(setq doing-auto-tags
      '(("~/work/project-a" :project "project-a" :tags ("work" "client"))
        ("~/personal"       :project "personal"  :tags ("personal"))))

Alternatively, use .dir-locals.el for per-project configuration:

((nil . ((doing-project . "my-project")
         (doing-default-tags . ("tag1" "tag2")))))

Philosophy

doing.el is designed around a few core principles:

Capture First, Organize Later

The barrier to logging an activity should be as low as possible. You don’t need to think about projects, categories, or file structure—just describe what you’re doing and start.

Retrospective Over Prospective

Traditional task managers focus on planning what you’ll do. doing.el focuses on recording what you did. This makes it perfect for:

  • Timesheet generation
  • Billing and invoicing
  • Retrospective analysis
  • Understanding work patterns

Minimal Friction

Common operations (doing-now, doing-finish) require minimal input. Timestamps, durations, and IDs are all generated automatically.

Org-Native

All data is stored as standard Org-mode files. You can:

  • Edit entries manually in Org-mode
  • Use Org-mode features (links, formatting, etc.)
  • Export using Org’s export system
  • Process files with any Org-aware tool

Compatibility

  • Emacs: 27.1 or later
  • Org-mode: 9.0 or later (built-in with Emacs)

Development

Running Tests.

make test          # Run all tests
make compile       # Byte-compile package
make clean         # Remove compiled files

License

MIT License

Author

Xiaoxing Hu — hi@xiaoxing.dev

About

Frictionless activity log and time tracking

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Emacs Lisp 96.6%
  • Shell 2.4%
  • Makefile 1.0%