Category Archives: Productivity

Toodledo: Rekindling an old flame

Many moons ago there weren’t a lot of options for good web based task management systems. Being the nerd I am I tried a few and fell fast for Toodledo. Not because of it’s pretty face, or exotic sounding name, but because it does just about everything and more.

But, time moved on and I couldn’t get my wife to understand and appreciate this fling (that, and the collaboration functionality is a paid feature). So, to make peace we decided to use Wunderlist (i.e. it was the only one I could get her to use) which was great for a time, but then it was bought out by Microsoft, the site started getting slow, and the announcement was made that they would pull the plug and force everyone over to their new todo app (which to date doesn’t have a fraction of the features of Wunderlist).

So, lost in the woods and dragging my tail between my legs I logged back into my Toodledo account after being gone for too long. There was the fast, no-nonsense, easy to use task system I loved from the beginning. And new features had been added since I ran off in the night like lists and habit tracking.

Now, I’m back in love with the features that are sorely lacking or overly burdensome in most of the task management systems available. Things like start dates, start and due times (yes, imagine that – things need to be started or completed at specific times), duration planning, timers, priorities, status, and so much more! Add in the ability to create custom saved searches and it’s the engineers dream.

In addition, with the new habit tracking feature there’s one less app that I need on my phone, and because Toodledo “gets it”, the functionality is also available on the web and in the app.

In the end, if you’re tired of feeling like a sad sack with your trailer trash task management system that only lets you track tasks, and due date, and maybe a description I would strongly suggest you check out Toodledo and start up a new flame!

Outlook Email Snooze

If you’ve gotten used to apps that allow you to snooze your email (have it disappear from your inbox until the date you specify and then reappear) I just found this page which appears to be the perfect solution for implementing in Outlook.

Basically it consists of creating a custom view of your inbox w/ 2 filters set. One for Due Date not existing and the other where Due Date is on or before “Today”.

Hit up the full post for step by step instructions and screen shots.

The Single Easiest Habit Change to Improve Your Life Forever #1aDay

This one thing has made a huge difference in my life. Find out about it by reading the full article here

Concurrently process for maximum productivity #1aDay

Christopher Penn makes a good argument for the separate concept of concurrent (or parallel processing) over the traditional single vs multi-tasking debate. Of course the key to success in concurrent processing is knowing how to split up the work without getting stuck in analysis paralysis. In that case, I would strongly recommend dropping down to single tasking instead of what most people seem to do.

Read the full article here

Emails Are Not For Real-Time Requests (and Other Rules) #1aDay

Here’s an article that’s been spreading like wildfire it seems, and while it raises an interesting idea it seems to forget that the reason people are contacting you like they are isn’t because they don’t know how to or what method to use. They don’t care about what’s convenient for you. They care about what’s convenient for them.

That’s not to say you have to use every communication method known to man or have notification turned on for all channels (for heaven’s sake, TURN OFF THE NOTIFICATIONS). Still, if you want to get a hold of me, please email. Just don’t be shocked if I don’t reply or it takes a while. We all have to set limits 🙂

Read the full article here

Recline! Why “leaning in” is killing us

I thought there were some good points in this article: Recline!.

Two of my favorites:

  • The general American tendency to think that “more time at work” equals “better work” is exacerbated by the All Crisis All the Time culture
  • When a workplace is full of employees who always lean in and never lean back, it’s full of employees who are exhausted, brittle, and incapable of showing much creativity or making good decisions.

Listening Twice as Fast!

I have a few PodCasts I enjoy and have recently been enjoying our library’s audio book selection. The thing is it always seemed to take so long to get through everything and I don’t like feeling like I’m behind on things. Then, one of my favorite PodCasts (the Lifehacker PodCast) mentioned a feature on most PodCast listening apps to let you listen at 1.5 speed. Sure enough, I opened up my favorite PodCast player and there was the option. Not only did I try it out, I cranked it up to 2x speed and have done the same on my audio book app as well!

If you’re a fan of spoken word content, check it out!

Outlook Macros to Categorize and Archive Messages

If you’re still rockin’ Outlook 2007 and want to create some macros to categorize or archive your email, here’s some copy and paste code to have fun with…

Sub Archive()
    Call CommonCategorizeAndArchive(True, False, False)
End Sub

Sub Categorize()
    Call CommonCategorizeAndArchive(False, True, False)
End Sub

Sub CategorizeAndArchive()
    Call CommonCategorizeAndArchive(True, True, False)
End Sub

Sub Task()
    Call CommonCategorizeAndArchive(True, True, True)
End Sub

Private Sub CommonCategorizeAndArchive(archiveEm As Boolean, categorizeEm As Boolean, taskIt As Boolean)
    Dim olApp As New Outlook.Application
    Dim olItem As Object
    Dim olExp As Outlook.Explorer
    Dim olSel As Outlook.Selection
    Dim olArchive As Outlook.Folder
    Dim olTasks As Outlook.Folder
    Dim olNameSpace As Outlook.NameSpace
    Dim olTmpMailItem As Outlook.MailItem
    Set olExp = olApp.ActiveExplorer
    Set olSel = olExp.Selection
    Set olNameSpace = olApp.GetNamespace("MAPI")
    Set olArchive = olNameSpace.GetDefaultFolder(olFolderInbox).Folders("@Archive")
    Set olTasks = olNameSpace.GetDefaultFolder(olFolderInbox).Folders("zTasks")

    For intItem = 1 To olSel.Count
        Set olItem = olSel.Item(intItem)
        olItem.UnRead = False
        If (categorizeEm = True) Then
        End If
        If (archiveEm = True) Then
            olItem.Move olArchive
        End If
        If (taskIt = True) Then
            Set olTmpMailItem = olItem.Copy
            olTmpMailItem.Move olTasks
        End If
    Next intItem
End Sub

Gmail Snooze Script – We Don’t Need No Stinkin MailboxApp

I’ll admit it. I got caught up in the MailboxApp fever and watched the little counter until I could get my hands on the app. Then I did and realized I didn’t particularly care for the interface or for giving up credentials to yet another service (though I do have 2 factor authentication setup). I like the Gmail interface. I think it’s done well. And I want control. So I asked that question that every engineer asks: “How can I do this better?”. Naturally the answer was smacking me in the face. Maybe a year ago I came across a Gmail snooze script, but didn’t really take the time to understand it or tweak it to my needs. This time was different.

Below you’ll find the setup instructions that will give you MailboxApp like functionality in something you completely control and that you can use from any email client. Just attach labels or move your messages to the any of the snooze labels and let the script do the rest. Personally, I’m using the script with a Dispatch “quick action” to easily triage my inbox.

See the “Setup” instructions in the comment block at the top of the code or refer to the images below…



Paste the code from below into the script

gdrive-run-function gdrive-trigger-setup

To use the functionality provided by the script just move any email to one of the snooze labels. For example, Move to –> _Z/Tonight to have the email reappear at the time you selected (default: 5pm). These are the suggested options to use, but there are more specific labels you can use for tighter control:

  • _Z/Later
  • _Z/Midnight
  • _Z/Noon
  • _Z/Tonight
  • _Z/Tomorrow
  • _Z/This Weekend
  • _Z/Next Week
  • _Z/Next Month

I hope you like it!

* Author: Mark Jacobsen (
* This is a massively modified and more powerful GMail snooze script that mirrors much of the functionality of
* the iPhone "Mailbox" app with the added benefit of not having to hand over your credentials, and being able to 
* use from any mail client (web, Android, iPhone, etc).  If you like it or have suggestions, please drop me a line
* from my blog at
* Setup:
* 1) Fill in the values below (or just use the defaults)
* 2) Run the "setup()" function using the method drop down and run arrow
* 3) Set time based triggers for:
*      moveDailySnoozes() - Daily between Midnight to 1 am
*      moveHourlySnoozes() - Every 5 minutes
* Changes:
* 2013-05-06  Fixed getLabelForHour to correctly handle am/pm thanks to "benlarge"
* 2014-02-23  Fixed moveDailySnoozes to correctly handle the current DOW thanks to "Jeff Hirsch"
* 2014-03-24  Added additional parseInt()s to moveHourlySnoozes

// =============================================================================
// Set these values according to your needs
// =============================================================================
var TIMEZONE = "America/Detroit";  // Your timezone
var TONIGHT_HOUR = 17;  // Hour (on a 24 hour clock. ex: 17=5pm) representing when something snoozed until "Tonight" should reappear
var HOURS_UNTIL_LATER = 3;  // Number of hours when something snoozed until "Later" should appear
var REAPPEAR_LABEL = "_Action";  // Full label path to apply when a message reappears in the inbox (leave blank "" to not set a label)
var REAPPEAR_UNREAD = true;  // Decide if you want to mark a thread as unread when it reappears in the inbox

// ==========================================================================================
// I wouldn't recommend changing these values but it shouldn't hurt anything if done right :)
// ==========================================================================================
var LABEL_BASE = "_Z";  // The label to create all snooze labels under (it's suggested that you don't change this)
var LABEL_BASE_MO = LABEL_BASE + "/zMonth";

// =============================================================================
// =============================================================================
// Do NOT change anything below here
// =============================================================================
// =============================================================================
var LABEL_LATER = LABEL_BASE + "/Later";
var LABEL_MIDNIGHT = LABEL_BASE + "/Midnight";
var LABEL_NOON = LABEL_BASE + "/Noon";
var LABEL_TONIGHT = LABEL_BASE + "/Tonight";
var LABEL_TOMORROW = LABEL_BASE + "/Tomorrow";
var LABEL_THIS_WEEKEND = LABEL_BASE + "/This Weekend";
var LABEL_NEXT_WEEK = LABEL_BASE + "/Next Week";
var LABEL_NEXT_MONTH = LABEL_BASE + "/Next Month";

function setup() {
  // Time of day Labels
  for (var i = 0; i <= 23; ++i) {
  // Month Labels
  for (var i = 0; i <= 11; ++i) {

function test(){

function getLabelForHour(hr){
  var ampm = "am";
  if (hr > 12)
    hr -= 12;
    ampm = "pm";
  else if (hr == 12)
    ampm = "pm";
  else if (hr == 0)
    hr = 12;
    ampm = "am";
  return LABEL_BASE_TOD + "/" + parseInt(hr) + ampm;

function getLabelForMonth(mo){
  var tmp;
  if (mo == -1){
    tmp = new Date();
    tmp = new Date(2000, mo, 1);
  return LABEL_BASE_MO + "/"  + Utilities.formatDate(tmp, TIMEZONE, "MMMMM");

function getLabelForDayOfWeek(dow){
  return LABEL_BASE_DOW + "/" + dow;

function moveDailySnoozes() {
  var dow, dom, mo;
  // Move anything that was snoozed until tomorrow
  dow = Utilities.formatDate(new Date(), TIMEZONE, "EEEE");
  dom = Utilities.formatDate(new Date(), TIMEZONE, "d");
  // Move anything that was snoozed until this DOW
  if ((dow == "Sunday") || (dow == "Saturday")){
    // If something was snoozed until this weekend, that should be moved too
  // Move anything for "next week" to the DOW it should come off snooze (i.e. the current DOW).
  // This works and doesn't move the messages pre-maturely because we moved
  // msgs for the DOW, prior to this and this functions should only fire
  // once a day
  moveSnoozes(LABEL_NEXT_WEEK, getLabelForDayOfWeek(dow));
  if (dom == 1){
    // Move anything snoozed until "next month" or
    // specifically for the current month on the 1st day
    // of a new month

function moveHourlySnoozes() {
  var curHour, curHourLabel, hourForLater, curDateTime;
  curHour = Utilities.formatDate(new Date(), TIMEZONE, "H");
  curHourLabel = getLabelForHour(curHour);
  moveSnoozes(LABEL_NOON, getLabelForHour(12));
  moveSnoozes(LABEL_MIDNIGHT, getLabelForHour(0));
  if (parseInt(curHour) == parseInt(TONIGHT_HOUR)){
  hourForLater = parseInt(parseInt(curHour) + HOURS_UNTIL_LATER);
  if (hourForLater >= 24){
    hourForLater = parseInt(hourForLater - 24);
  moveSnoozes(LABEL_LATER, getLabelForHour(hourForLater));

function moveSnoozesToInbox(oldLabelName) {
  var oldLabel, page, reappearLabel;
  oldLabel = GmailApp.getUserLabelByName(oldLabelName);
  page = null;
  // Get threads in "pages" of 100 at a time
  while(!page || page.length == 100) {
    page = oldLabel.getThreads(0, 100);
    if (page.length > 0) {
      if (REAPPEAR_LABEL != ""){
        reappearLabel = GmailApp.getUserLabelByName(REAPPEAR_LABEL);
      if (REAPPEAR_UNREAD == true){

function moveSnoozes(oldLabelName, newLabelName) {
  var oldLabel, newLabel, page;
  oldLabel = GmailApp.getUserLabelByName(oldLabelName);
  newLabel = GmailApp.getUserLabelByName(newLabelName);
  page = null;
  // Get threads in "pages" of 100 at a time
  while(!page || page.length == 100) {
    page = oldLabel.getThreads(0, 100);
    if (page.length > 0) {

Principles, Priorities, and Values – oh my!

Lately I’ve been thinking about the important things to me. What my “principles”, “priorities”, or “values” are. I’m sure I could spout off a number of things, but here are the big ideas that come to mind.

My family is the most important thing in the world to me. I will do anything within my power for my wife and kids. What is the purpose of life without someone or a cause to love?

Goals keep us moving forward. They give us something to strive for. But don’t confuse a want with a goal. Remember, goals are SMART: Specific, Measurable, Attainable, Relevant, and Time-bound.

A dream without a plan is only a wish upon a star, but beware analysis paralysis. Use planning to achieve your goals. And remember, plans change. Change with them.

Disciplined Action
This is where you walk the walk. Achieving any goal or carrying out any plan is primarily a matter of disciplined action. It’s making the hard choices. Doing things you don’t want to do. Doing as you say. Being a role-model.

The easiest way to maintain disciplined action is through routine. Routine isn’t a dirty word or meant in a negative way. Some might call it a ritual.

Spontaneity (White Space)
Of course once you have planned your disciplined actions and made them a routine it’s amazing how much time you can find for other things. Once you know where the unmovable objects are it’s easy to find the space between. Remember to keep white space in your schedule. You can’t plan everything and if you try to you will drive yourself and those around you crazy. Schedule your priorities. Don’t schedule your life.