Going Paperless: Automating Repetitive Stuff about Meetings

I promised that beginning this year, one of these posts each month would be a more advanced, in-depth post on how to use Evernote for automation. I mean to keep that promise, and thus, this post. Much of what you will find in this post in not terribly technical, but it does require some knowledge of programming to implement it the way that I have. Be warned.

“Meetings are places where minutes are taken and hours are lost.”

I can’t remember the source of that quote, but I remember hearing it while listening to the radio on the commute home from work more than a decade ago, when I lived in Los Angeles. I’ve loved the quote ever since. I find myself in a lot of meetings, and one things I’ve learned about meetings is that they tend to be fair consistent in the overall process. What I mean by this is, in my experience, that a meeting usually amounts to:

  1. Putting something on my calendar.
  2. Attending the meeting
  3. Taking notes
  4. Transferring any action items to my to-do list

Within that framework, I had already automated quite a bit. Folks who have been following along for some time know that if I have to do something more than once, I try to automate it.

The two biggest targets of automation when it comes to meeting that I attend are items 3 and 4. I’ve had item #3 automated for some time now. Indeed, I’ve written about this before. But let’s review quickly for those who may be new.

How I automate my meeting notes in Evernote: a review

If there is one common element to every meeting I attend, it is meeting notes.

I capture all of my meeting notes in Evernote. Over the years, I have evolved a standard template that I use for all of my meeting notes. After a while of setting up this template each time I arrived at the meeting, I got the bright idea of automating it. Now, if I add a meeting to my Google Calendar, and the subject contains “@en”, I have an IFTTT recipe that will create a new note in Evernote, with the meeting title, and a blank meeting notes template 15 minutes before the start time of the meeting.

This is great. It means when I walk into a meeting room, I open Evernote and my pre-titled, blank meeting notes template is waiting for me.

Of course, not every meeting is planned ahead of time. Some are ad hoc. In these cases, I’ll create a new note in Evernote and then use a TextExpander snippet (;;meeting) to create my template.

Eliminating more repetition

Over time, I noticed that there was one thing I did twice that was hard to see at first, but once I saw it, drove me nuts, and I was determined to automate it. To explain, let me illustrate the problem.

Meeting Automation

The diagram above illustrates the overall process for meetings that I described earlier. I sit in meetings and take notes in Evernote. As with most meetings, those notes include action items. At some point I found myself transferring those action items from my meeting notes into my to-do list, so that I remembered to do them.

But here’s the thing. I’d already recorded the action item once. It seemed silly beyond description to do it a second time. What if I could automate the process of identifying action items in my meeting notes and automatically adding them to my to-do list?

A bit on my to-do list

Over the years, I’ve tried lots of to-do list managers. I’ve tried Evernote, but it is too problematic for me for many reasons, but the most important being that I use Evernote as a repository of knowledge (e.g. “Remember Everything”) not a place to manage short-term pieces of information like to-do items. That just clutters things up for me.

I’ve tried services like Remember The Milk (which integrates with Evernote!), Asana, Wunderlist, and Trello. They all have their pluses and minuses, but most are overly complex, and not simple enough for my needs.

If I was not paperless, I’d use a piece of paper to maintain my to-do list. Given that I am paperless, I want something just as simple. I found this in Gina Tripani’s todo.txt system. todo.txt is a text-based, command-line based to-do system that uses one simple command and a bunch of text files. There is a simplicity to plain text files that is very much akin to a piece of paper. The text files are maintained in Dropbox so that I can access them from anywhere. There is an iPhone app for when I need to access my to-do list from my phone. Otherwise, whether I’m on my iMac or Windows machine, I just use a command prompt. I run a very simple command to view my to-do list:

I just type “t” at the command line to see my list.

I’m not going to go into all of the details of the benefits of todo.txt here. I’ll save that for another post. The important thing to take away is that (a) I do have a to-do list manager, and (b) it is very simple and based on text files.

That latter fact is significant because plain text file are very easy to work with. And todo.txt is simple enough to make adding new tasks from the command line a breeze. Indeed, part of the reason I love todo.txt is that I can add to-do items faster than I could with a pen and paper, faster than I can with any other system I’ve tried.

Automatically adding meeting action items to my to-do list

Okay, so I’d been frustrated by the fact that I was repeating myself for each set of meeting notes I had. I’d record action items as part of the note-taking process, and then record them yet again when I added them to my to-do list. I decided that the second recording was a waste of time. I would automate the process. Here is how I did it.

First, I used a tool called Geeknote, which is a command-line tool for Evernote. It allows you to view your notes, run searches, add new notes, update notes, etc. all from the command line. This was perfect for what I needed.

My notion was this:

I could use Geeknote to search for any notes on a given day tagged “meeting notes.” On the command line, such a command might look like this:

% geeknote.py find --tags "Meeting Notes" --date 11.02.2014

If any matches are found, I could loop through the matching notes, looking for action items.

How would I identify action items?

As it turned out, I was prepared for this. Indeed, I had been prepared for this since college. When I took notes in college, I devised my own shorthand for things. One of those things was an action item. Any line in my notes that started with a plus sign (+) was an action item. I’ve kept that throughout my career. Any line in my meeting notes which begins with a + is an action item.

So, I would need a script that would run geeknote with the proper parameters for the given day, and for each resulting note, loop through the contents of the note looking for lines that begin with a +. Each time it finds a line that begins with a +, the script would run my todo.sh command to add the entire line (minus the plus sign) to my to-do list. Because I’d be parsing text, I decided to write the code in Perl. While it may sound complicated to non-coders, the code itself is fairly simple:

# Purpose: Uses GeekNote to grab any notes created today and tagged with
# "Meeting Notes" and then parses the notes looking for action
# items (lines that begin with +). For each action item found,
# add the action item to my todo list via todo.sh
use Getopt::Std;
use POSIX qw(strftime);
$MEETING_TAG = "Meeting Notes";
$GN_CMD = "/usr/local/geeknote/geeknote.py";
$TODO_CMD = "/usr/local/bin/todo.sh";
if ($opt_d) {
   # ASSERT: a -d parameter was provided
   if ($opt_d !~ /^(\d{4})\-(\d{2})\-(\d{2})$/) {
      die("Invalid date format. Use yyyy-mm-dd.");
   $date = "$3.$2.$1";
} else {
   # ASSERT: no -d parameter provide; use today's date
   $date = strftime "%d.%m.%Y", localtime;

# Grab a list of meeting notes for the day in question
$cmd = "$GN_CMD find --tags \"$MEETING_TAG\" --date " . $date;
@lines = split(/\n/, $output);
$count = 0;

foreach $line (@lines) {
   next if $count < 3;
   if ($line =~ /^\s+(\d+)\s+/) {
      $note = `$GN_CMD show $1`;
      @note_lines = split(/\n/, $note);
      foreach $note_line (@note_lines) {
         if ($note_line =~ /^\s*\+\s(.*$)/) {
            $todo_item = $1;
            # Add this item to todo list
            `$TODO_CMD add \"$todo_item\"`;

The script does as I describe above. Each night, it looks for any notes in Evernote created that day and tagged “Meeting Notes.” For each set of notes it finds, it looks through the notes for any lines that start with a +. If it finds one, it adds it to my to-do list.

The results

The results have been great! I no longer have to re-enter my action items into my to-do list. Now, I just take notes. The next day, when I look at my to-do list, any action items I added to meeting notes are listed in my to-do list.

My script runs as a cron job on my iMac, and it runs just before midnight each night. I generally don’t have late meetings, but I like the automated stuff to run at the end of the day, just in case.

This also frees me up of the additional worry for “forgetting” to add an action item to my to-do list. My script will do it for me, so long as I follow my own format–and it’s a format I’ve been using for nearly 25 years now.

Abstracting this for other to-do services

The automation I illustrated above is specific to my process and my to-do list manager. The key takeaway for people who use other services is that this is still possible. Many of the to-do list services provide an API. Many of them also allow you to create to-do items simply by sending an e-mail message. Wunderlist allows you to create to-do items by email, for instance. Suppose you wanted to implement something similar for Wunderlist? All you’d do is modify the code to send an email for each to-do item it finds in your meeting notes.

The idea here is to abstract the concepts and apply them to your own systems. How can you identify action items in your notes? What tools can you use to find meeting notes and parse them for action items? And how will you send those action items to your to-do list?

Todo.txt makes it very easy because it is entirely text-based. This is one of the big reasons I love the simplicity of text files. But it is entirely possible with other systems. And it is a great exercise in eliminating duplicate work, and automating processes that you end up doing manually again and again and again.

If you have a suggestion for a future Going Paperless post, let know me. Send it to me at feedback [at] jamietoddrubin.com. As always, this post and all of my Going Paperless posts is also available on Pinterest.

Last week’s post: Quick Tip: How I Do a “Daily Review” in Evernote.

Enjoy these posts? – Tell a friend

Recommending readers is one of the highest compliments you can pay to a writer. If you enjoy what you read here, or you find the posts useful, tell a friend! Find me online here:

Twitter | Facebook | Google+ | Blog | RSS

Or use one of the share buttons below. Thanks for reading!


  1. Excellent! I’ve played with Geeknote a little bit, but never got anything this useful out of it. Would love to hear more about what else do you do with Geeknote.

  2. Regarding the IFTTT recipe, is there anyway to change the time increment when the template is delivered? For example, I take the time in the morning to prepare for the days activities. If the templates for today’s meetings are ready at 8am, I can start preparing for them – adding ‘questions to ask’, thoughts, ideas to stress, etc to the templates so that I’m really prepared for the days meetings.

  3. For someone who doesn’t understand code, this sounds difficult. My problem is I can’t download anything to my work computer, I need things to be web based and web based on IE9 as that is the only browser work uses. So I am having difficulties finding anything that works well.

    But I am determined to find something that will work.

  4. Great tip and script.

    I’ve had to modify it slightly to get it to behave – unless I’m being thick, in your version above, the first call to geektool to list the notes that match the pattern doesn’t actually get called, so I’ve changed it to:

    # Grab a list of meeting notes for the day in question
    $cmd = “$GN_CMD find –tags ‘meeting_notes’ –date ” . $date;
    $output = `$cmd`;
    @lines = split(/\n/, $output);
    $count = 0;

    Also, running geeknote from cron changes its behaviour – it treats the input differently. Python types need to hunt for this line (768) –
    if config.IS_IN_TERMINAL:
    and then compare with its matching else:
    #if input stream
    COMMAND, ARGS = modifyArgsByStdinStream()

    then modify accordingly, else when called from cron, it’ll just silently exit.

    1. I had exactly the problem that Adrian talks about. I did get it to run from the command line, but I do not know enough about python to make the changes in the last few paragraphs of his comment, Any help is greatly appreciated.


This site uses Akismet to reduce spam. Learn how your comment data is processed.