Picture of Michael Lee

How I use the Eisenhower matrix to figure out what to work on

Written on February 21, 2021

Everyone is special, Dash

Which is another way of saying that no one is.

– A conversation from the movie, The Incredibles between Dash and Helen Parr.

Isn’t it funny that sometimes the things we need to get done tend to feel like the dialogue above?

That when you look at your list of tasks to get done in a day and they are all screaming at you, “I’m special, work on me next. No, I’m special, check me out!”.

Right, tasks don’t really talk. But if left unchecked and you dive into your work, simply letting each “special” task dictate your day.

You might end up at the end of the day feeling like you were busy, but didn’t really get anything meaningful done.

I know I’ve been there.

To help with this, I’ve been employing what’s called the Eisenhower matrix to surface the what I should be working on each day.

The Eisenhower matrix, is a simple two-by-two matrix.

Graphic for the Eisenhower matrix

In the top left hand quadrant is where things that are both important and urgent go. These are the time-sensitive and important work that needs to get done ASAP. Perhaps you have a proposal that needs to get on your boss’ desk today and so you need to wrap it up and send it over.

In the top right hand quadrant is where things are important but not urgent. Let’s say you’ve got a project you’ve been working on at work and you have a whole quarter to work on it. It is important, but that due date is quite off from today.

This quadrant is where you’ll want to pay close attention to and make sure to schedule tasks into your calendar regularly.

In the bottom left hand quadrant, these are the urgent, but not important tasks. There’s a time constraint on these tasks—say if you’re a developer and work in set sprint intervals—that must get done by a certain time. But the value you’re able to provide at this very moment are higher in other tasks than these.

It might be better to ask others if they can help take things off your plate and delegate so you can focus on the work in the first two quadrants.

The last quadrant, the bottom right, are where tasks are both not urgent and not important. These are tasks you might’ve added at a particular time to your list of todos but now reviewing it isn’t important or relevant anymore.

These tasks you’ll want to delete and remove completely.

Don’t spend too much time, just sort

The point of using the Eisenhower isn’t to spend too much time, but to simply sort the tasks and figure out what to work on.

If you find yourself getting stuck, follow what your gut says on a task and move on.

The first time you’re using the matrix you might have a lot of tasks to weed through so you might find yourself spending 30 minutes or so. But once you regularly use the Eisenhower matrix, you’ll be able to breeze through it fairly quickly depending on the number of tasks you’ve got in there.

How I’ve set up the Eisenhower matrix in my task manager

For my personal task manager, I use an app on macOS called, Things. Within Things, they let you set up a list which is made up of headings and tasks called, a project.

I’ve set up a project called the Eisenhower matrix, and it is just a list with headings that represent each of the quadrants like this.

A project in Things set up for the Eisenhower matrix

Each end of day or end of week, I’ll dump all my tasks into this designated list—which then nicely shows up above all the headings.

All tasks at top

Then one-by-one I’ll move each task quickly into the sections that I believe they belong.

Tasks assigned to a quadrant

Tasks in quadrant four, I can simply remove.

Tasks in quadrant three, I’ll ask someone to help with taking over the task.

Tasks in quadrant two, I’ll move them into specific days in the upcoming week.

Tasks in quadrant one, I’ll put in my very next work day.

Benefits of using the Eisenhower matrix

Since using the Eisenhower matrix, I’ve found that I’m able to focus on tasks and work that helps move the needle forward.

It also helps me fight the issues of decision paralysis that sometimes takes way too much energy out of my day.

It reduces anxiety because it forces me to be real with myself. While there might be a lot of things that needs to get done. The matrix forces me to confront that I don’t need to do everything and I don’t need to do everything right now.

Finally, it helps me get into the habit of decluttering. Have you ever noticed from time-to-time there are those tasks that tends to stick around on your todo list but don’t get done? It ends up taking head space and it screams at you that it needs your attention but for some reason, week-in and week-out it never gets done.

Well thanks to quadrant four—not important, not urgent—you can address it and the let go of those tasks and rid them of your attention so you can focus on work that’s meaningful.

Reimagining year left

Written on February 14, 2021

Almost four years ago, I was playing around with the Twitter API and ended up building, year left (@year_left).

Year left is a bot that calculates the days left in a year, presents it as visual using emojis and then tweets it.

Lately, I’ve been having fun making widgets for the iOS Homescreen using an app called Scriptable. Scriptable allows you to use JavaScript to build widgets.

I had always thought year left would be a neat widget for the iPhone and so finally last week, I took parts of the code that generates year left’s tweets and reimagined it as a widget.

Since year left’s code is written in JavaScript, it didn’t take long to reconfigure it to be used in Scriptable. The only change—which was a bit challenging—was changing the look and feel of year left.

I didn’t want to just lift the Twitter bot’s look, but wanted to give it a face lift so it looks good on an iPhone.

Using some of my friend, Shaun Moynihan’s mockups that he had made when he was mocking up the sales page for my YouTube page, I was able to come up with a more modern look for the year left widget.

My first attempt was to use dots to represent the year representation but ended up going with a dashed look.

Year left widget with dashes

The reason I did this was I couldn’t quite map out the logic to work with dots. While I’m happy with the dashes, I may revisit the dots and provide it as an option in the future.

No idea how to get dots to work, even on paper

I plan on eventually releasing the code for the new year left widget, but before I do I want to clean up the code a little bit.

When creating these iOS widgets, I often remember my friend, Jess Martin’s mantra when building with code, “make it work, make it right, make it fast”. And in that order.

I’m definitely in the make it work phase right now. These iOS widgets start out as experiments where I’m just trying to see if I can get something to work. But it takes a little while to get it right.

Hopefully my next post will be sharing the code for the reimagining of year left as an iOS Homescreen widget so you can also have it on your phone as well.

Signed up for HEY

Written on February 7, 2021

Tonight, I signed up for an email account with HEY–an email service by Basecamp.

The need to consolidate

At this time I have four Gmail accounts that I use for various services–I’m not proud of this fact. For a while now I felt the need to consolidate them.

While I’ll likely keep a single Gmail account in the consolidation process, it won’t be my main personal email. My new HEY email will be.

The reason to keep at least one Gmail account is that my wife is still a Gmail user and we share things like a calendar together.

Why pay for email?

As life gets more complex as an adult, I feel more of the need to pay for the services that I use. This is because I want more control over the privacy of the information that has to do with me and is about me.

I already pay for email for the address that’s tied to my site’s domain so it isn’t too far fetched for me to pay for an email service.

The other reason being, I’ve been a fan of the work coming from the Basecamp team for a very long time and HEY is an opportunity to support them financially.

I get to support the many makers at Basecamp for the impact that they have had on my life

While I don’t personally use Basecamp for task management, I have been both a fan and a recipient of a lot of value from the byproducts created at Basecamp.

The two byproducts that I’ve benefitted from the most are Ruby on Rails and the various forms of the Basecamp podcast–The Distance and now Rework.

Because of the immense value that I’ve received from these two byproducts over so many years, I wanted to in some way pay back the many folks who have contributed to Ruby on Rails and the podcast.

Since I needed a new email service, it felt like a no-brained to sign up for HEY and pay for a subscription.

Because I want to support Basecamp’s work for the long run.

Fears

I’ll admit though, while going through the sign up process, I did have some fear creep in and my palms were a little sweaty.

The reason for this was the thought of HEY not being a reliable service crept into my head.

I mean email is one of those things that sticks with you for a very long time. All sorts of important information flows through our email accounts. What if HEY or Basecamp disappeared one day? What if they mess up?

Then I remembered a podcast episode with DHH in which he shared a story when Basecamp genuinely messed up. I can’t remember quite all the details, but in the episode DHH shared how they made a mistake and told their customers that they messed up.

I remember thinking at the time how refreshing that is. For a company to own their mistakes, apologize and then come up with ways to prevent it from happening again.

If Basecamp messes up, be it service reliance issues, I’m sure I’ll get a super human response that explains their decision and how to mitigate any fears or risks. Knowing that I can name off a handful of folks who work at Basecamp is reassuring versus the no-name behemoths who currently dominate the email space.

As for the fear of disappearing one day, I think businesses are similar to organic things. They are born, they grow and one day they might not exist. But it is helpful that Basecamp thinks about going the distance. I mean after all they did produce a (exceptional) podcast once called The Distance which covered businesses that were at least 25 years old.

I believe if the founders of Basecamp decide to call it quits one day, there will be a solid succession plan and that we–their customers–will have a way to carry on. For now, I think they’re in it for the long haul and for this reason, I can trust them as my email provider.

Skipped the trial

Before I could have any other doubts or questions, I decided to just go ahead and pay for a full year of service–foregoing the (generous) two week trial of the service.

“But how do you know if HEY is for you if you didn’t even try it out?” you might be asking right now.

Email is pretty simple and the way all other companies have treated it since I can remember aren’t doing any crazy innovations around it, why not?

What Basecamp is doing with HEY is providing a very opinionated approach to email and I think that’s refreshing. Instead of just providing a new flavor of the same old email. They are trying to help us rethink how email should work.

Neat!

An opinionated approach that’s supposed to help with the anxiety inducing experience that is email–cool, let’s do it!

Plus if I end up not liking it, it’s just a year for now. I can always cancel and at least feel good that I’ve at least contributed financially to a company that again has provided a ton of value in my life professionally and personally.

How I chose my email address

This was kind of a weird experience for me. When I signed up for an email account in the past, I didn’t really give it much thought. Which is probably why I ended up with four personal email accounts.

But signing up for my HEY account felt akin to trying to grab a sweet name on an up and coming social media account.

I couldn’t decide if I wanted something short and sweet or something easier to say phonetically?

I confess that I initially signed up with an email address with the least amount of letters possible–without paying for a premium account.

While I liked the brevity of the email address, I actually didn’t like how it played out in scenarios in my mind.

The three common scenarios in which I imagined giving out this email where I felt like having a phonetically, easy to spell name was better than my short email choice,

  • Over the phone
  • In person
  • My wife giving it out in either scenarios above

Having to spell out emails addresses are annoying when sharing it with others. So I decided to choose the address that was phonetically easier to say and hopefully spell.

While I was tempted to also sign up with a word that was super common that was still available–coffee@hey.com–I decided to go against it since it really didn’t have any connections to me other than I enjoy it as a hot beverage.

Long road, but excited

While the road ahead in consolidating and getting my personal email accounts in order may be long, I’m excited to be calling HEY the new home for my personal emails.

Storyworthy

Written on January 31, 2021

What is the storyworthy thing that happened to me today?

I heard this from Ali Abdaal’s recent webinar sharing about his productivity systems. And I keep coming back to it because I think it embodies what I’ve been trying to capture the last few years with journaling.

While I haven’t been the most consistent journaler in my life, it’s something I’ve been trying to do more regularly. This is because I’ve found that life was happening so quickly—especially with kids and I wanted to be able to capture my thoughts, memories and feelings around events in my life.

My daily journaling habit looks like this, everyday I have an automation in Shortcuts that creates a new entry in Notes with the current date.

Then throughout the day I record things in that entry. The nice thing about having the entry automatically created for me is that it is one less barrier. And since Notes is on all of my devices, my digital journal is likely always with me.

I’ll admit, there are days that I don’t write anything. So once every few days I’ll have to do some cleaning. But on the days that I have a story-worthy moment, I’m able to capture it easily.

That’s been super valuable for me.

Since Ali sharing about the storyworthy tip, I’ve been more mindful of my day. The question will pop up in random times of the day because I want to be aware of things that I find important.

Like last week on a no-meeting day for me, I sat with my first born while he was doing virtual school. He had a verbal math test and I was so nervous for him. I wanted him to do well and there were times I wanted to help him but I knew if I did, I would be taking away from his education. When the test was done, he told his teacher that I was also with him and she shared that he marked at a level above his current grade.

I was super proud of him!

If you’re having a hard time with a regular journaling cadence but want to create a better habit. Why not try starting with a question you ask yourself daily?

What is the storyworthy thing that happened to me today?

Simply answer that question and see what happen. You might find yourself being more aware of your day which could in turn motivate you to journal.

iOS Scriptable YouTube widget

Written on January 20, 2021

In this article, I’ll be showing you how to add a YouTube widget to your iPhone that pulls in a couple of stats from your YouTube channel—total subscribers and total views.

What will it look like on my phone?!

Great question, here’s a screenshot of the widget on my phone with my excellent channel stats 🥳

Screenshot of iPhone Home Screen with YouTube widget

Looks nice right? You want one on your phone too, you say? Well let me show you how!

What it won’t do

Wait…before we get started let me tell you what the widget won’t do for you. It won’t create new videos for you. It won’t give you more subscribers. It won’t make you a YouTube sensation.

Unfortunately, you’ll have to still put in the work to make all your YouTube dreams come true.

What the widget could do is give you a little motivation every time you look at your iPhone’s Home Screen to keep creating and putting your work out into the world.

I hope you still want this widget on your phone…I just wanted to set the right expectations first 😬

What you’ll need to get started

In order to get this widget on your phone and working correctly you’ll need four things.

  1. You’ll need an iPhone with iOS 14—the first version of iOS where widgets appeared.
  2. An app called Scriptable.
  3. A Google API key—you can follow instructions here to set up an account and get one.
  4. A little patience as there’s some code involved. No worries if you’re not a coder, I’ll do my best to guide you along and make it as not scary as possible.

Once you’ve got all four of the items in the list above, it’s time to grab your YouTube channel ID.

Where to find your YouTube channel ID

The easiest way to grab your YouTube channel’s ID is to pull up the channel in your browser.

In the address bar, you should see,

www.youtube.com/channel/****

Where *** represents your channel’s ID.

Screenshot of YouTube channel highlight the channel ID

Write your channel ID down or copy and paste it somewhere because you’re going to need it in a little bit.

But wait Michael, I’m MKBHD and I’ve got a totally sweet short URL for my channel like this,

Screenshot of MKBHD's YouTube channel

How do I get my channel’s ID?

Glad you asked Marques!

This is how you find your channel’s ID if you’ve got one of those fancy short URLs for your YouTube channel.

  1. Click on any video in your channel
  2. Hover over your profile’s name on the video page, you’ll notice that it’s actually linking to your channel with the non-fancy, long obscure ID.

    Hover over YouTuber name to reveal channel ID

  3. Right click over your name and select the copy link and now you’ve got your channel URL with the ID. Throw away everything but the channel ID.

    Right click on name to copy the channel URL

The code

Now comes the part where it might get a little scary if you’ve never touched code before, but I promise I’ll try to make it as not scary as possible.

In this part we’ll put some code into Scriptable and then use some of the things we’ve been collecting to finally get our widget set up.

  1. Open up Scriptable and create a new script by pressing the + button in the top right hand corner.

    Tap on the top right plus symbol to create a new script

  2. Copy and paste this code in there,

     const apiKey = ""
     const channelID = ""
     const channelName = "My channel"
     const textColor = Color.white()
        
     if (config.runsInWidget) {
       const widget = await createWidget()
       Script.setWidget(widget)
       Script.complete()
     }
        
     async function getData (channelID, apiKey) {
       const url = `https://www.googleapis.com/youtube/v3/channels?part=statistics&id=${channelID}&key=${apiKey}`
       const r = new Request(url)
       const body = await r.loadJSON()
       return body
     }
        
     async function createWidget() {
       const widget = new ListWidget()
          
       let ytData = await getData(channelID, apiKey)
       ytData = ytData.items[0]
          
       const subscribers = widget.addText(abbreviateNumber(ytData.statistics.subscriberCount, 2))
       subscribers.font = Font.boldSystemFont(36)
       subscribers.centerAlignText()
       subscribers.textColor = textColor
          
       const subscribersLabel = widget.addText("Subscribers")
       subscribersLabel.font = Font.semiboldSystemFont(10)
       subscribersLabel.centerAlignText()
       subscribersLabel.textColor = textColor
          
       widget.addSpacer()
          
       const viewsBlock = widget.addStack()
       viewsBlock.addSpacer()
          
       const viewsContainer = viewsBlock.addStack()
       viewsContainer.layoutHorizontally()
       viewsContainer.centerAlignContent()
         
       const viewSymbol = SFSymbol.named("play.fill")
       const viewImage = viewsContainer.addImage(viewSymbol.image)
       viewImage.tintColor = Color.white()
       viewImage.imageSize = new Size(12, 12)
          
       viewsContainer.addSpacer(4)
         
       const views = viewsContainer.addText(abbreviateNumber(ytData.statistics.viewCount))
       views.font = Font.semiboldSystemFont(20)
       views.centerAlignText()
       views.textColor = textColor
          
       viewsBlock.addSpacer()
         
       const viewsLabel = widget.addText("Views")
       viewsLabel.font = Font.semiboldSystemFont(10);
       viewsLabel.centerAlignText()
       viewsLabel.textColor = textColor
          
       widget.addSpacer()
          
       let channelLabel = widget.addText(channelName)
       channelLabel.font = Font.semiboldRoundedSystemFont(10);
       channelLabel.centerAlignText()
       channelLabel.textColor = textColor
          
       widget.addSpacer(2)
          
       let reloadStack = widget.addStack()
       reloadStack.layoutHorizontally()
       reloadStack.centerAlignContent()
          
       reloadStack.addSpacer()
          
       let reloadSymbol = SFSymbol.named("arrow.triangle.2.circlepath")
       let reloadImage = reloadStack.addImage(reloadSymbol.image)
       reloadImage.tintColor = Color.white()
       reloadImage.imageSize = new Size(8, 8)
       reloadImage.imageOpacity = 0.9
       reloadImage.centerAlignImage()
          
       reloadStack.addSpacer(2)
          
       let today = new Date()
       let updateTime = `${today.getMonth() + 1}/${today.getDate()} ${zeroPad(today.getHours())}:${zeroPad(today.getMinutes())}`
          
       let updateLabel = reloadStack.addText(updateTime)
       updateLabel.font = Font.semiboldRoundedSystemFont(8)
       updateLabel.textOpacity = 0.9
       updateLabel.centerAlignText()
       updateLabel.textColor = textColor
          
       reloadStack.addSpacer()
            
       const startColor = new Color("#ff0000")
       const endColor = new Color("#e40000")
       const gradient = new LinearGradient()
       gradient.colors = [startColor, endColor]
       gradient.locations = [0.0, 1]
       widget.backgroundGradient = gradient
          
       return widget
     }
        
     // Credit: https://stackoverflow.com/a/32638472
     // Thanks to https://stackoverflow.com/users/1438550/d-deriso
     function abbreviateNumber(num, fixed) {
       num = Number(num)
       if (num === null) { return null; } // terminate early
       if (num === 0) { return '0'; } // terminate early
       fixed = (!fixed || fixed < 0) ? 0 : fixed; // number of decimal places to show
       var b = (num).toPrecision(2).split("e"), // get power
       k = b.length === 1 ? 0 : Math.floor(Math.min(b[1].slice(1), 14) / 3), // floor at decimals, ceiling at trillions
       c = k < 1 ? num.toFixed(0 + fixed) : (num / Math.pow(10, k * 3) ).toFixed(1 + fixed), // divide by power
       d = c < 0 ? c : Math.abs(c), // enforce -0 is 0
       e = d + ['', 'K', 'M', 'B', 'T'][k]; // append power
       return e;
     }
        
     function zeroPad(numToPad) {
       if (numToPad > 9) {
         return numToPad
       } else {
         return `0${numToPad}` 
       }
     }
    
  3. Add your API key to the first line in the code that starts like this,

     const apiKey = ""
    

    You’ll want to add the API key in between the two quotation marks "". Once you do, the first line of code should look something like this,

     const apiKey = "yourAPIKeyFromGoogle"
    
  4. Add your channel key to the second line in the code that starts like this,

     const channelID = ""
    

    Again, you’ll want to add the ID in between the two quotation marks "". Once you do, the second line of code should look something like this,

     const channelID = "yourChannelIDWeGrabbedEarlier"
    
  5. And that’s it for the coding portion! Now let’s add just a little bit of flair by giving our script a name, icon and color. You can do this by pressing the icon in the bottom left corner of your screen.

    Tap on the icon to get to the script settings

    You’ll get this screen where you can set a name, icon and color.

    You can change the name, icon and color of the script from this screen

  6. Now that you’re done. Close the window and tap Done to exit our of your script. We’re ready for the moment we’ve all been waiting for…the widget!

The widget

In this section, I’ll show you how to get the new Scriptable widget on your Home Screen. If you’re already familiar with this process, feel free to skip over this step and go to the next section.

To add the widget to your Home Screen you’ll want to do this.

  1. Tap and hold anywhere on your Home Screen until the apps start to jiggle.

    Gif to show app jiggle on iOS Home Screen

  2. Tap the plus + button in the top left hand corner,

  3. Scroll down until you see Scriptable and tap it.

  4. Select the small widget (which should be the default one shown) and tap Add Widget

  5. Once the widget is added to your Home Screen, you’ll see the widget display, Select script in widget configurator, tap the new widget and you should get the widget configurator.

  6. Next to the label, Script tap Choose to select the new YouTube script you had added into the Scriptable. Once you’ve selected it, tap outside of the configurator to be taken back to your Home Screen.

    Photo of Scriptable configurator

  7. 🥳 do a little dance cause now you’ve got your very own YouTube widget on your Home Screen to go with you wherever you go. The widget is proof that your work is appreciated by viewers from all over!

Get fancy

Now that you’re able to see your channel’s subscriptions and video views count, I hope it motivates you to keep putting out great videos to share with the world!

If you’re feeling adventurous, try enhancing the widget in Scriptable to make it your own. With a little knowledge of JavaScript, some imagination and the incredible, well put together doc, you can improve it to really match your personal brand.

Screen shot of Michael's widget and a custom MKBHD widget

If you’re looking for customizations but can’t be bothered with more code, you can purchase the enhanced code. The code comes with easy-to-follow instructions to add a custom logo and background to your YouTube widget.

Think less and start

Written on January 17, 2021

During Christmas my family was gifted a new kitchen appliance which my wife and I were both really excited about—a toaster oven and air fryer. We’ve had a toaster and an air fryer before, but this thing did both and more.

After unpacking it what we did next was I sat down on our couch and opened up the manual and my wife grabbed a piece of toast and began pushing buttons.

This is an example of what happens every time my wife and I bring home a new appliance.

This speaks loudly to how my wife and I learn about things and build new habits. My wife tends to jump right in and learn by doing, while I will usually sit and try to learn about something first and try to anticipate different scenarios to achieve my goals.

What I’m learning from my wife and recently from my friends is that sometimes doing is more valuable than thinking first.

Just start

For a while I had become obsessed about sleep schedules of successful people.

Bob Iger, former CEO of Disney, in his book, The Ride of a Lifetime, shares that he wakes up at 4 AM to have time for creativity to start the day.

The Rock, also wakes up around 4 AM to start his day with exercising before his family rises.

Casey Neistat, of YouTube fame, starts his days at 5 AM and sleeps on average of 4 hours of sleep a night.

Recently in November, my friend, Nick Ang, took part in National Novel Writing Month (NaNoWriMo for short) to work on a personal goal of his—to work on a novel. During the month he shared tweets about getting up early to spend time writing his novel.

It was inspiring.

As a response to a tweet about creative and productive times during the day, Nick of course shared that for him it was early mornings.

I then asked if he had some advice for making the habit of waking up early stick and to my surprise and delight, he shared this response,

How to get started with flossing

I really love Nick’s response of the story of his trip to his dentist and their advice on starting first and then worrying about technique later.

I can definitely learn from this.

As an engineer, I easily fall into a place where I try to look at something and analyze as many outcomes or prepare myself—by reading manuals—before diving in.

While it’s helpful in scenarios where time spent up-front has proven to help mitigate issues that might arise. What’s also important is how you solve for issues that arise along the way.

Your mileage may vary, so start

Going back to our new toaster, while reading the manual definitely told me how to set the appliance in toaster mode. What it failed to teach me was what setting to put it on to get the desired browning of my toast. In other words, what a manual and thinking up-front failed to teach me is how to solve for, “your mileage may vary”. Toasting in this appliance varies based on what kind of toast, quantity and preference of toast level—things the manual can’t teach me.

In the same way that reading a book on how to play baseball won’t make you a baseball player adept to playing in a major league game. Perhaps the quicker way to achieving your goal may be instead is to get started and build first the muscle for the habit you’re trying to create. And then once the muscle is built, seeking for help to improve your technique to go further in your habit.

A book can only take you so far and while your mind can go further, often the reality of how things play out will be fairly different because our mileage will vary. But what doing allows us to do is learn and adapt as we move closer along the path of realizing our goals instead of on a couch—stationary—in the hypotheticals of our mind.