A command line tool for keeping track of what you’re doing and tracking what you’ve done.

For a summary of all commands and options, see Doing - All Commands.

The current version of doing is 2.0.25.

Find all of the documentation in the doing wiki.

What and why

doing is a basic CLI for adding and listing “what was I doing” reminders in a TaskPaper-formatted text file. It allows for multiple sections/categories and flexible output formatting.

While I’m working, I have hourly reminders to record what I’m working on, and I try to remember to punch in quick notes if I’m unexpectedly called away from a project. I can do this just by typing doing now tracking down the CG bug.

If there’s something I want to look at later but doesn’t need to be added to a task list or tracker, I can type doing later check out the pinboard bookmarks from macdrifter. When I get back to my computer — or just need a refresher after a distraction — I can type doing last to see what the last thing on my plate was. I can also type doing recent (or just doing) to get a list of the last few entries. doing today gives me everything since midnight for the current day, making it easy to see what I’ve accomplished over a sleepless night.

Doing has over 30 commands for tracking your status, recording your time, and analyzing the results.

See the wiki for installation and usage instructions.


The LaunchBar action requires that doing be available in /usr/local/bin/doing. If it’s not (because you’re using RVM or similar), you’ll need to symlink it there. Running the action with Return will show the latest 9 items from Currently, along with any time intervals recorded, and includes a submenu of Timers for each tag.

Pressing Spacebar and typing allows you to add a new entry to currently. You an also trigger a custom show command by typing “show [section/tag]” and hitting return. Include any command line flags at the end of the string, and if you add text in parenthesis, it will be processed as a note on the entry.

Point of interest, the LaunchBar Action makes use of the -o json flag for outputting JSON to the action’s script for parsing.

Doing for LaunchBar v2.2

A LaunchBar action for use with doing

Published 02/07/20.

Updated 07/01/21. Changelog

DonateMore info…

Evan Lovely has created an Alfred workflow as well.


If you create a plugin, custom command, or hook you can share, please let me know. If I get a few plugin contributions, I’ll set up a second repository for them.

Feel free to fork the repository on GitHub and make pull requests with changes. Please target the develop branch with pull requests.


Click to expand



  • doing config set to set single config values from command line
  • BREAKING CHANGE: Moves ~/.doingrc to ~/.config/doing/config.yml
  • BREAKING CHANGE: convert config flags to subcommands, e.g. doing config --udpate => doing config update, and doing config --dump => doing config dump


  • include fzf source directly, in case git isn’t installed
  • fall back to installing fzf with sudo on error



  • completion script generator refactor and progress bars


  • compile fzf for current operating system



  • Remove any coloring before writing to doing file



  • Escape codes being included in doing file



  • Improvements to %title formatting and wrapping


  • Test release to validate git flow automation



  • Remove amatch gem dependency due to compatibility issues with Windows systems (also removes --fuzzy option from all search commands)



  • Append /r to tag transforms to replace original tag


  • Autotag tag transform fixes



  • Add ‘timer_format’ config with ‘human’ option for tag totals
  • If doing view and doing show are confused, offer option to run the other command
  • doing completion to generate shell completion scripts for zsh, bash, and fish
  • –search and –not for cancel command
  • –case flag for commands with –search. Can be (c)ase-sensitive, (i)nsensitive, or (s)mart (default smart, case insensitive unless search string contains uppercase letters)
  • Add --exact flag to all commands with --search flag to force exact matching without requiring single quote prefix
  • Add --not flag to all commands with filters (–tag, –search, –before, etc.) to negate the filter and return entries NOT matched


  • More command line feedback
  • Error formatting and output
  • Add subcommand completion for doing help in fish shell
  • Logging and error handling


  • Zsh completion not outputting results
  • Remove --[no] from non-negatable options
  • doing plugins -t export -c not outputting columns
  • View config not respecting tag_order setting



  • Import calendar events from on macOS
  • doing config --update will add newly added config keys to your existing config file (handy with plugins that define their own config keys)
  • Add %idnote template placeholder for “indented note” (entire note indented one tab)
  • (loosely printf-esque) formatting options for %note template placeholder
  • –interactive mode to act on results of doing grep
  • Printf formatting for title and date
  • Doing import plugin
  • Plugins command to list plugins
  • –dump option for doing config to output a key.path config key as JSON, YAML, or raw output
  • –no-color global flag
  • Log levels, with –quiet and –verbose global flags
  • Convert CLI messaging to Logger-based system
  • Use DOING_DEBUG, DOING_QUIET, or DOING_LOG_LEVEL environment variables to specify log levels before configuration is read
  • Hooks, register plugins to run based on events
  • –[no-]pager and paginate: config option to enable paging output
  • Never_finish and never_time config options to prevent items matching tags/sections from ever receiving @done (never_finish) or @done timestamp (never_time) - More configuration refactoring


  • Timeline output formatting
  • Major plugin architecture refactoring
  • Fix regression where notes stored in doing file were outdented, breaking TaskPaper compatibility
  • When accepting a date filter, allow end date to be in the future
  • If an edited item has no changes, don’t update/output notification - Don’t start with query when using grep –interactive
  • Select menu item formatting
  • Output wrapping for terminal display
  • Redirect warn to STDOUT when run with –stdout
  • Fish autocomplete
  • --config_file global flag deprected, now uses $DOING_CONFIG environment variable so that config overrides can be available before the initial configuration is run
  • When –stdout or not a TTY, no color or output formatting
  • Highlight tags when showing results. Because it looks nice.
  • –tag and –search for doing note
  • View/section fuzzy guessing
  • Error reporting
  • If doing config finds local doingrc files, offers a menu for editing
  • More filtering options for doing finish
  • Doing done accepts –unfinished flag to finish last entry not marked @done (instead of last entry)
  • Doing done accepts –note flag to append a note when completing an entry


  • Multi-word unquoted arguments to add_section being truncated
  • Show –from with date span
  • Handling of arbitrary times in natural language dates
  • Backward scope of since command with arbitrary times
  • doing rotate --keep wasn’t respecting keep value


  • Gemfile error


  • “taskpaper” format available for all output options
  • “markdown” format available for all output commands (GFM-style task list, customizable template)
  • --rename option for tag command to replace tags
  • --regex option for tag command, for –remove and –rename


  • Minor fix for shell command in doing select
  • Fix for doing finish –auto when matched item is last in list
  • doing finish –auto now pulls from all sections, not just the section of the target entry


  • Pretty print JSON output
  • –no-menu option for select command to use –query as a filter and act on matching entries without displaying menu


  • Add –before and –after time search to yesterday command
  • Add –before and –after date search to search/grep command
  • Add –tag_order to yesterday command


  • Add leading spaces to make %shortdate align properly, at least for the last week
  • Add –tag, –bool, and –search to view command
  • Add –before and –after date search to view command
  • Add –before and –after date search to show command
  • Add –before and –after time search to today command
  • Add –search filter to show command
  • More alignment/formatting fixes for %shortdate


  • Add count config option for templates->recent


  • Fix –auto for finish command
  • Add –before DATE_STRING to archive and rotate commands
  • Only create on rotate file per day, merge new entries into existing file


  • rotate command for archiving entries to new file
  • Fixed current_section config key not being honored in some commands


  • Fixes for doing view options, additional config keys for views


  • Bugfixes


  • fzf menu improvements
  • allow multiple selections doing select action menu


  • Convert all menus to fzf screens


  • Gem missing fzf
  • Wildcard tag removal using doing select -t "tag*" -r
  • fzf menu display polish


  • If no action is specified with select command, an interactive menu is presented
  • add output action select command with formatting and save options
  • Don’t link URLs in html output that don’t have a protocol


  • Refine editing multiple selections (doing select)


  • Add –tag and –search flags to tag command to tag all entries matching search terms
  • Add since command, which is the same as doing on tuesday to now but doing since tuesday just feels more intuitive.


  • Fix for timeline output


  • Add doing select to show menu of all tasks, searchable with fuzzy matching and the ability to perform certain tasks on multiple selections.


  • Fix for template command not working at all


  • Fix for doing done --took 30m setting the wrong @done timestamp when completing previous item


  • Add --unfinished option to finish and cancel commands


  • Fix error in doing show --sort argument parsing


  • Gem packaging error


  • Fix for some long flags being interpreted as arrays instead of strings
  • More flexible boolean specification, can be: all, and, any, or, not, or none
  • Fix for archive command not removing original entries from archived section


  • Prevent duplicates/overlapping entries when importing


  • Initial import feature for reports


  • README updates
  • If doing done --took=X results in completion date greater than current time, use current time as completion date and backdate the entry’s timestamp to fit


  • Fix: doing done with --took= and without --back= should set end time to start date plus --took value


  • Add –search filter to doing archive



  • Default value for doing again --bool was ALL, should be AND



  • Improvements to doing again --tag= functionality



  • Finish previous task if doing again and not already completed



  • Unit tests



  • Tag command tests


  • Doing not reading per-directory .doingrc configs



  • Added config_editor_app setting to config so you can have
  • A parenthetical at the end of an entry title becomes an attached
  • --editor flag for doing last to edit last entry
  • --tag= flag to filter doing last by tag
  • --search= to filter doing last by text/regex search
  • --search= for doing finish, finish last X entries matching search
  • Add tags_color as a primary config key to highlight @tags in displayed entries


  • Clean up command line help
  • –editor improvements for all commands that use it


  • Doing finish –took throwing error
  • Doing tag –remove was adding tags if they didn’t exist
  • Creating a meanwhile task with a note resulted in an error



  • Bugfix for finish --tag=TAG



  • --tag and --bool filtering for again/resume, cancel
  • --in flag for again/resume to specify to which section the new
  • Finish command accepts --tag= flag, finishing last entry
  • doing cancel to end X tasks without completion date (alias for


  • Add –no-color option to view command
  • Add –tag to show for compatibility


  • Error running finish without –tag flag
  • –archive flag on finish, done, and cancel causing error



  • Finish command accepts --tag= flag, finishing last entry
  • doing cancel to end X tasks without completion date (alias for


  • –archive flag on finish, done, and cancel causing error


  • Fix for missing date on @done tags


  • Fix confirmation dialog for doing tag -a -c 0 (autotag all)


  • Remove check for file existence before attempting to run run_after script
  • Don’t autotag entries restarted with again/resume
  • Add short flags (-b) for --back on all commands that support it


  • Code cleanup


  • Only execute run_after script if changes are written


  • Remove unnecessary console logging


  • Add again command to repeat last entry without @done tag
  • Add run_after configuration option to execute external script after any change


  • Fix note indentation in doing file


  • Fix for repeated backreferences in tag transform


  • Add --tag_sort to all subcommands with --totals option


  • Tag transforms
  • Option to sort tags by name in –totals


  • Gem dependency updates


  • Fix for array comparison error


  • Bugfixes


  • Global option -x to skip autotags and default_tags from global/local .doingrc
  • Remove extra spaces when creating entry


  • More graceful writing of default config (~/.doingrc) on first run
  • Repaired testing setup. Needs moar tests.


  • Add --at flag for doing done, e.g. doing done --at=1:35pm --took=15m A new task I already finished
  • Allow decimal quantities when using natural language for hours or days, e.g. --took=2.5h
  • Add did as a synonym for done subcommand


  • Smarter method of getting user $HOME
  • Improved avoiding duplicate tags when autotagging
  • Improved autotag reporting


  • doing note operates on whatever is most recent, not just the last note in Currently
  • doing tag with no count specified operates on most recent entry in any section, not just Currently
  • doing tag with a count greater than 1 requires a section to be specified
  • Improved results reporting for doing tag
  • When removing tag do a whole-word match to avoid removing part of a longer tag


  • Apply default_tags after autotagging to avoid tags triggering tags
  • Set doing recent to default to All sections instead of Currently
  • Fix error in time reporting
  • improved y/n prompt for TTY


  • Fix handling of “local” config files, allowing per-project configurations
  • Allow cascading of local config files
  • Allow doing today and yesterday to specify a section


  • Add legitimate regex search capabilities
  • Synonyms for grep (search) and now (next)
  • CSS fix


  • Rewrite HTML export templates with responsive layout and typography
  • Ability to customize the HTML output using HAML and CSS
  • New command doing templates to export default templates for HAML and CSS
  • New config options under html_template for haml and css


  • For doing note -e include the entry title so you know what you’re adding a note to
  • For any other command that allows -e include a comment noting that anything after the first line creates a note
  • Ignore # comments when parsing editor results
  • Add a .md extension to the temp file passed to the editor so you can take advantage of any syntax highlighting and other features in your editor


  • Fix undefined method [] for nil class error in doing view
  • Loosened up the template color resetting a bit more


  • Add --stdout global option to send reporting to STDOUT instead of STDERR (for use with LaunchBar et al)


  • Fixes overzealous color resetting


  • CLI/text totals block was outputting when HTML output was selected
  • Have all template colors reset bold and background automatically when called


Catching up on the changelog. Kind of. A lot has happened, mostly fixes.

  • Fish completion
  • views and sections subcommands have -c option to output single column
  • Fix html title when tag_bool is NONE
  • Fix @from tagging missing closing paren
  • Fix tag coloring


  • Fix gsub error in doing meanwhile


  • JSON output option to view commands
  • Added autotagging to tag command
  • date filtering, improved date language
  • added doing on command
  • let view templates define output format (csv, json, html, template)
    • add %chompnote template variable (item note with newlines and extra whitespace stripped)


  • fix for -v option
  • Slightly fuzzier searching in the grep command
  • cleaner exits, only_timed key for view configs
  • making the note command append new notes better, and load existing notes in the editor if -e is called
  • handle multiple tag input in show tag filter
  • Global tag operations, better reporting


  • Improved HTML output
  • --only_timed option for view/show commands that only outputs items with elapsed timers (interval between start and done dates)
  • add seconds for timed items in CSV output, run --only_timed before chopping off --count #
  • fix for 1.8.7 Dir.home issue
  • version bump
  • don’t show tag totals with zero times
  • zsh completion for doing
  • HTML styling
  • --only_timed option
  • added zsh completion file to
  • add zsh completion file


  • done command: making --took modify start time if --back isn’t specified
  • Cleaned up time totals, improved HTML output
  • fixes for --back and --took parsing
  • Adding more complete terminal reporting to archive command


  • Skipped ahead in the version numbering. Because I don’t care.
  • Added a note command and --note flags for entry creation commands


  • --totals, --[no-]times, --output [csv,html] options for yesterday command.
  • Add tests for Darwin to hide OS X-only features on other systems
  • -f flag to now command for finishing last task when starting a new one (Looks back for the last unfinished task in the list)
  • --took option for done and finish for specifying intervals from the start date for the completion date
  • Basic command line reporting
  • --auto flag for finish and done that will automatically set the completion time to 1 minute before the next start time in the list. You can use it retroactively to add times to sequential todos.
  • doing grep for searching by text or regex


  • Default to showing times #26, show totals even if no tags exist #27, fix indentation #29
  • Add section label to archived tasks automatically, excepting Currently section
  • Today outputs and backdate for finish
  • HTML styling and fix for 1.8.7 HAML errors
  • Look, HTML output! (--output html)
  • Also, --output csv
  • let doing archive function on all sections
  • option to exclude date from @done,
  • output newlines in sections and views
  • Flagging (doing mark)
  • fix for view/section guess error
  • Adding tag filtering to archive command (doing archive \@done)
  • doing yesterday
  • doing done -r to remove last doing tag (optionally from -s Section)
  • Add -f flag to specify alternate doing file
  • meanwhile command


  • CSV output for show command (--csv)
  • HTML output for show command (--output html)
  • fuzzy searching for all commands that specify a view.
    • In the terminal, you’ll see “Assume you meant XXX” to show what match it found, but this is output to STDERR (and won’t show up if you’re redirecting the output or using it in GeekTool, etc.)
  • tags_color in view config to highlight tags at the end of the lines. Can be set to any of the %colors.
  • Basic time tracking.
    • -t on show and view will turn on time calculations
    • Intervals between timestamps and dated @done tags are calculated for each line, if the tag exists.
    • You must include a %interval token in the appropriate template for it to show
    • @start(date) tags can optionally be used to override the timestamp in the calculation
    • Any other tags in the line have that line’s total added to them
    • Totals for tags can be displayed at the end of output with --totals


  • doing done without argument tags last entry done
    • -a archives them
  • doing finish or doing finish X marks last X entries done
    • -a archives them
  • doing tag tag1 [tag2] tags last entry or -c X entries
    • doing tag -r tag1 [tag2] removes said tag(s)
  • custom views additions
    • custom views can include tags and tags_bool
      • tags is a space-separated list of tags to filter the results by
      • tags_bool defines AND (all tags must exist), OR (any tag exists), or NONE (none of the tags exist)
    • order key (asc or desc) defines output sort order by date
    • section key can be set to All to combine sections
  • doing show updates
    • accepts all as a section
    • arguments following section name are tags to filter by
      • -b sets boolean (AND, OR, NONE) or (ALL, ANY, NONE) (default OR/ANY)
    • use -c X to limit results
    • use -s to set sort order (asc or desc)
    • use -a to set age (newest or oldest)
  • fuzzy section guessing when specified section isn’t found
  • fuzzy view guessing for doing view command


  • colors in templated output
  • open command
    • opens in the default app for file type
    • -a APPNAME (doing open -a TaskPaper)
    • -b bundle_id (doing open -b com.sublimetext.3)
  • -e switch for now, later and done commands
    • save a tmp file and open it in an editor
    • allows multi-line entries, anything after first line is considered a note
    • assumed when no input is provided (doing now)
  • doing views shows all available custom views
  • doing view without a view name will let you choose a view from a menu
  • doing archive fixed so that -k X works to keep X number of entries in the section


  • colors in templated output
  • open command
    • opens in the default app for file type
    • -a APPNAME (doing open -a TaskPaper)
    • -b bundle_id (doing open -b com.sublimetext.3)
  • -e switch for now, later, and done commands
    • save a tmp file and open it in an editor
    • allows multi-line entries, anything after first line is considered a note
    • assumed when no input is provided (doing now)

Speaking of doing…

Related Projects