Dec 5, 2017

We love email. We hate email. We deal with email everyday. Through out the years I’ve tried many ways to keep my mailbox sane. Many seek for help from a task management system. Often with this method, people track emails as todo items and treat emails themselves as merely reference material. Some email clients have taken that even further by making the client itself a hybrid task manager, popularized by Mailbox and its peers.

A rising amount of email clients started to automatically process and organize emails on user’s behalf, employing machine learning and alike. The processing may be based on an email’s type, priority, and other criteria. Such feature is sometimes called smart inbox. Spark and Inbox are two notable contenders. Even traditional email clients such as Outlook are exploring this option.

I personally do something much simpler. For that at the end of the day, email is just another communication channel. First of all, I separate my work and personal email entirely—different addresses and different clients. I don’t even have my personal account set up on my work machine and vice versa. When I absolutely need to look something up in my personal email when using my work machine, I use the web interface. Having the physical separation helps me build a clear mental separation. The cleaner context is defined, the better. The less context switching, the better.

I only subscribe to a minimal amount of newsletters. All the unsolicited ones are unsubscribed mercilessly. Marketing and promotion emails? Gone. Useless notification emails? Gone. For the ones I can never seem to find a unsubscribe button, I simply set up a rule to delete them upon arrival.

Notification. The single most distracting invention in history. To minimize the amount of notifications, I use rules to automatically mark the emails that I need but don’t need to be notified about as read. For example I do so for the newsletters I subscribed to.

I triage my inbox in batch using a GTD inspired method. If an email can be responded within 2 minutes, I usually do that right away. Otherwise I leave them in the inbox to response at a later time, and again in batch. When a long response is needed, I most likely write the response in a writing app instead of directly inside the email client. Once I respond, I archive them. I flag the sent items that I’m waiting for a response for.

I use exactly one folder besides Archive and I don’t use tags at all. The folder is called Saved, where I store things needed for upcoming events, such as concert or flight tickets. Once they are used, they go to Archive.

I believe the best way for anyone to manage their email is the way that makes them feel in control of their inbox rather than the other way around. Mine makes me feel so.


Oct 22, 2017

Who doesn’t love a good day? Everyone longs for days when everything just seems to go their way. However sometimes we focus too much on the wanting part and forget that a good day doesn’t just come by itself—it requires work and specifically, preparation work.

Go to sleep early. Prepare the clothes you need for tomorrow. Prepare breakfast as needed. When the morning finally comes, you wake up full of energy, jump out of bed and put on the clothes you’ve already decided on last night, and eat a hearty breakfast. From there, you are probably going to have a good day.

Tomorrow starts tonight. Want to get up early? Go to bed early.


Jun 16, 2017

Friends don’t let friends keep redesigning their website. I apparently need better friends.

This site was previously powered by FarBox, and with a little help from CloudFlare, it has been reliable, fast, and securely served via SSL.

Farbox was one of the best contenders from the wave of Dropbox synced blog platform. Their marquee feature was that posts were synced through a Dropbox folder where files were stored in Markdown format plus some necessary meta data. This made publishing and content management extremely easy and accessible, especially when on the go. This was all great, but I wanted more. I wanted a site that I can (almost) fully control.

The idea of having my own corner, a place where I share my words with the world, on the sea of internet has started forming ever since I subscribed to a blog via RSS for the first time. Plus I really wanted to use those Markdown writing apps that I read so many reviews about.

After the journey of the initial a few months of Tumblr, Scriptogram, and FarBox, now allow me to introduce the whole new yeefom.com – a Hugo generated static site hosted with Netlify. I picked up a theme that had the style I had in mind, and tweaked from the layout to styling to make it look exactly the way I wanted. Feel free to grab my fork and play.

Netlify made the deploy process extremely simple. All I had to do was to connect my site’s source code repo to Netlify and specify the build command. The continuous deployment requires zero configuration. Once the site was successfully built, Netlify automatically rebuilds every time the repo receives a new commit. Netlify also takes care of HTTPS and the rerouting between root domain and www subdomain if you’d like.

After the new design was done, the migration was a matter of reformatting meta data, as both FarBox and Hugo build pages from Markdown files. What took the longest was by far evaluating all the blog platform and hosting options. Nothing is absolutely future-proof, but I’m really glad to have found for now the perfect combo of Hugo and Netlify.


Working Copy screenshot on iPad

Look around, look around at how lucky we are to be alive right now. Pardon me for some Hamilton pun, but pause and think how crazy it would be if someone’d told you that Git operations could be done on your mobile devices just a few years back. What a time to be alive.

The star of today’s post is Working Copy. It’s not just a Git client on iOS; it’s one of the best Git GUIs I’ve ever seen, on any platform.1 To get started, you can either clone a repo from a remote server or initiate one locally. Besides from popular services such as GitHub and BitBucket, you can clone repos from any server you have access to (via SSH). Once you have a repo inside Working Copy, you can freely navigate around the repo, make changes, and commit (or discard) those changes. Working Copy provides a basic text editor with syntax highlighting. Thanks to iOS share sheet, you can also edit the code in your favorite external editor. After committing the changes, you can push the code back to the remote server if you wish. You can browse commit history with ease. Tap on a commit and you are presented with a side-by-side diff view. You can check out, tag, or even cherrypick the commit if needed. Commit history can also be presented in a tree graph which can be accessed from a repo’s summary view. Other operations that Working Copy supports include fetching remote changes, resolving merge conflicts (it has a great diff tool), and branch management (creation, merging and deletion). As a bonus, Working Copy provides a JavaScript console and HTML previewing, which really come in handy when it comes to web development.

Working Copy is an excellent tool for your Git needs on the go. In my opinion, it’s especially helpful when you have the need to review code, resolve merge conflicts, or make small changes when you are out and about. The developer also smartly worked around App Store’s trial restriction by making the app a free download with no function limitation except that pushing to remote servers requires an one time in app purchase. You should grab a copy.


  1. I highly recommend you check out GitUp on Mac. [return]


I wrote most of this short piece a year ago, and it only took me a year to post it. Ironically, it’s about a book that took me a year to finish.


This is not a review. This is nothing more than a man writes out his nostalgia.

I first opened Robert Galbraith1’s The Silkworm last September, and it took me nearly a year to finish. During the time I had read many other books. The Silkworm, on the other hand, progressed but slowly. As a result, this thick book moved with me from one coast of the continent to the other. Almost like an old friend, it was always there for me. I remember when I was in elementary school, finding a good book to read was the happiest thing for me. Knowing there was a good book awaiting at home filled me with an excitement which I couldn’t contain. I felt a big loss every time I finished a book. Kind of like breaking up I guess. I haven’t had a similar feeling for so long, and I miss it a ton. If this is the price of growing up then it’s too much a price if I had a say.

The Silkworm didn’t have a fast pace you would normally expect from a detective fiction. However I thoroughly enjoyed the characters’ daily activities, even when they were dull. There were many scenes that existed purely for character development, and I couldn’t get enough of them. When reading Harry Potter, I wished there were chapters that were just about their lives in Hogwarts and had nothing to do with the plot. What did they do on a weekend when they were not trying to save the world? Did they steal pumpkin pasties from the kitchen after a late night session even when they didn’t need the help from Dobby? Tell me more, please. Maybe the Strike series is a belated fulfillment for those wishes.


Epilogue

I read the next installment in the series when the post lying in the drafts folder. From time to time, I almost felt I was reading text from a Harry Potter book, catching a glimpse of a younger self’s mind. Thank you, Rowling. Please keep writing.


  1. A.k.a J. K. Rowling [return]


Can’t believe it’s 2017 already. I only felt how the past years flew by when I stopped and looked back occasionally. The last time I had a new year post I was still in college. Now I’m older and, well, probably not any wiser.

The last new year post was a retrospect. As much fun as I had to look back and reflect, I want to do something different this time. I want to look ahead, as how I like my 2017 to be like.1

In 2017, I want to write more. Considering that’s exactly what I’m doing right this moment, I think I’m having a good start. I always like writing, but writing in English intimidates me for various reasons. Writing in a second language is hard. I feel my thoughts are constraint. I feel I don’t know much about anything (I probably really don’t anyway). I feel the lack of confidence. Fortunately, new year is the best time to step out of the comfort zone. I’ve made some good progress in the past year regarding stepping out of my comfort zone—more on this later in another post. I’ve, obviously, not done so well regarding writing. My goal for 2017 is to publish at least 5 posts on this blog. It’s a very small goal—certainly not a 50,000 words NaNoWriMo challenge—and I very much intend to accomplish it. I’ve incorporated Ulysses (a Godsend) into my writing toolbox, hoping a writing app I enjoy will encourage me to write more. I tweaked this blog’s style sheet for better code snippets displaying, so expect some technical posts to come as well. The game is afoot.

Similar to writing, I want to watch more movies and read more books. In the recent years, I didn’t watch nearly enough movies or read nearly enough books as I’d like to. I ended up many shows and news articles. Shows can be great, but they are not movies to me. Movies bring me so much more emotions. I watch shows and I let myself immersed in movies. A few days ago, I watched What’s Eating Gilbert Grape, which had probably stayed on my watchlist for the longest time. When the screen went dark and the credits started rolling, I couldn’t stop thinking that I hope they never stop making movies like this. The same goes for books and news articles.

I would also want to play guitar regularly. I played guitar on and off (mostly off—especially the last two years when I didn’t have one with me) since 2009, but all I can do are still songs with extremely simple chords. The silver lining? I love music too much and I want to play the guitar. I finally got another guitar not long before the holidays, and I want to play it patiently and constantly this time around. I plan to practice 5 to 10 minutes of scale exercise daily if possible. Learn more chords one at a time, making sure I find them quickly and press with just the right amount of pressure. Ultimately, learn to play 5 (hopefully many more) songs.

There are a few more items on my list ranging from making faster decisions when shopping online to resisting the urgent of doing something when I can clearly do better the next day when I’m rested and when it’s not 2 am in the morning. They are in general a little trickier to track, but hard, I will try. As for everything mentioned here, I look forward to reporting back in December. Happy 2017.


  1. One thing I have to mention about 2016 is that Hamilton was my most surprising and amazing finding of the year. [return]


When it comes to working with APIs, a classic tool loved by many is the legendary cURL. cURL is cool, powerful, and in the meantime, maybe intimidating. The fact that it runs through the command line might scares many non-developers away. However many designers, researchers, and just anyone who works with data and the internet might have to deal with APIs at some point. Luckily, for those who prefer a GUI, there’s an awesome app called Postman.

A Chrome app1, Postman, can pretty much run on any platform. The basic usage of Postman is as easy as filling in the API url, choosing a method, and clicking send. Postman will then connect to the API and display the message and/or data sent back from the server in a format that’s easy on the eyes. You can even log in a server by hitting the authentication API and perform calls that require an authenticated user.2 Postman can definitely cover the majority’s needs for exploring APIs.

I recommend anyone who works with APIs give Postman a try if you haven’t already—even if you are comfortable with your current toolset, you might still find some hidden gem in Postman that will make your life a little easier.


  1. Now also features a standalone Mac app! [return]
  2. And of course there are many advanced features for power users. [return]


Mar 29, 2016

If this were a Friends episode, I’d like to title it the one where I geeked out and wrote the longest post on the blog.


I moved back to OmniFocus! I used a plaintext-based task management system for the past year and half. It worked quite okay during that time. However things could get quite out of control whenever I got busier. Inevitably, I had to revisit the never ending topic of task management.

Why I Ditched OmniFocus for Plaintext in the First Place

I made the move in the summer of 2014. When iOS 7 came out, OmniGroup released OmniFocus 2 for iPhone to adapt the dramatic changes iOS 7 brought to the platform. However, the new version was still buggy and feature incomplete after almost a year. The iPad app hadn’t been updated at all. The Mac counterpart was updated to 2.0 before the summer, but I wasn’t the biggest fan of how tasks were displayed in the new version. Personally, I was about to start grad school, so I thought it was a good time to reconsider my task management system.

The idea of using a plaintext-based system was long appealing to me. I store most of my notes in plaintext files and this would fulfill a plaintext nerd’s dream of having everything in one place.

I quickly decided on the setup. Tasks would be in TaskPaper format, and I used FoldingText on Mac and Editorial on iOS to access those TaskPaper files. Dropbox kept everything in sync. I put together a few shortcuts using Keyboard Maestro to make the files even more accessible. On iOS, Drafts was the main tool for task capturing (and later on Workflow made a great add-on to the workflow thanks to iOS 8’s action sheet).

The system was simple and efficient, but there was one huge drawback. I could always see all the tasks, and that was overwhelming. And even when there was not that many items on my list, seeing notes and other related information all the time was still a lot to take.

Now with work and side projects, the once elegant plaintext system no longer holds up. I tried to keep up with it for a few months, but I finally decided to go back to a more dedicated system.

I Took a Test Drive of Things

Instead of simply jumping back to OmniFocus, the nerd in me really wanted to try out something different. So obviously, I had to give Things a go. Slowly developed but solid, Things has being around since the very early days of iOS. Especially, I’ve heard great things about its cloud sync.

There were a few things I really liked about Things. First, what I heard was true—the syncing was phenomenal. If I made a change on Mac, the iOS apps would update immediately even in the background. The badge and today widget got updated too. If I added an item using the share extension, it would be synced instantly without the need of opening the app. Second, I loved the ability of rearrange today/starred items. So I could arrange things to the order I intend to accomplish them by.

But here comes the bad. First of all, with Things, I just didn’t feel in control of my tasks. It was hard to tell why exactly. The lack of something similar to OmniFocus’s Forecast view? But my plaintext system didn’t have that either. The fact that the Next view doesn’t show all available items? Maybe. For whatever reason, I just didn’t feel secure with Things. Besides that, Things lacked some basic task manager features. For one, the ability of adding repeating tasks was horrible. I honestly couldn’t understand why Cultured Code chose to store scheduled and repeating items all in a separate list. In other words, you can’t schedule (defer) or repeat a task in a project. The app also felt old. Even with its iOS 7 overhaul, Things still felt like an app from 5 years ago. It took 3 taps to edit an item!

Not sure if the promised Things 3 was coming out any time soon, I knew Things was not the task manager for me at this time.

Back to OmniFocus

Let’s take a step back and take another look at why I left OmniFocus in the first place. Besides the reasons I mentioned in the earlier section, there were a few more that pushed me to look for other options. First, the syncing was somewhat slow. Second, the lack of the ability to rearrange item in perspective. Third, the iOS version didn’t fully support perspective.

Now at least two of the problems were (semi-)fixed. Syncing is much faster now with push—still not at the same level of Things’ but much, much better. With the universal update, the iOS version supports perspective as its desktop counterpart does. Items in perspective are still not rearrangeable, but I suspect it’s related to OmniFocus’ database format. According to a blog post from OmniGroup, they are looking to change the file format. So here is hope that one day we will get manual sorting in perspectives. Another plus is that the Mac app’s interface is now more customizable.

Before I left OmniFocus, I had a kind of context-based system where my contexts were mostly based on energy level. The most important view was called Today, which was a customized perspective consists of due items and flagged items. It was a good system yet I just didn’t like the idea of picking up (flagging) today’s tasks in the morning that much. I like to plan ahead. I need to at least plan for the next day (and even the next a few days sometimes). I can certainly use start date and display deferred items in the Forecast view but Forecast don’t count them in the calendar so I won’t know if I scheduled something for a certain day unless I click or tap on that day.

I needed a different approach.

A Forecast-based System

I got rid of context.1 My current system is almost based on the Forecast view exclusively. As a GTD guru, you probably already frowned as you know the general principle that we should only set due date for tasks that have a hard deadline. However I assure you this is not as crazy as it sounds—at least not in my use case. Let’s take a closer took.

Here’s a breakdown of my Forecast-based workflow.

  • All processed tasks should have a project. Projects are organized in folders based on area of responsibility. A task that can’t be started at the moment should either have a start date or a context, Waiting, whose status is On Hold.
  • All tasks with a hard deadline has a due date set to the deadline. Besides that, I also write the deadline inside parentheses following the task name.
  • I have a customized perspective called Next that shows all available items across all projects including inbox. I might further break it into smaller perspectives such as Next Work and Next Personal depending on areas of responsibility.
  • Every evening, I go through my Next view and set tasks I want to accomplish the next as due tomorrow.2 It doesn’t matter if a task already has a future due date. I have that written down with the task name.
  • During the day, if there’s something new comes up and needs to be done on that day, I assign them as due today.
  • At the end of a day, I clean up everything that’s due. If there are items left that are due today, I either reassign them to a future date or simply clear the due date if I decide it’s no longer the best time to pursue them. Process inbox items.
  • Weekly review. Never forget to review.

With this system, I have 100% confidence that I won’t forget or miss any recorded tasks since I don’t need to remember them in the first place. Equally important, I have a clear view of what needs to be done today, tomorrow or even the following week. I feel in control.

To be honest, I miss Things’ perfect syncing and capturing. I’m still curious to see what Things 3 has to offer. I’m still intrigued by 2Do and follow its development pretty closely despite. And I will for sure try out new tools from time to time. One thing I learned from all these years’ fiddling with task managers is that although I have so many different ways to organize my tasks, I have only one way to accomplish them and that’s actually accomplishing them. I believe the most important thing is to have a system that I can trust and forget about so I can focus on actually accomplishing the tasks. At this moment I think I found that trust in OmniFocus once again.3


  1. I still have exactly two context. The first one is Waiting. I set its status to On Hold and use it to pause an action. The second one is Followup, so I can see everything I need to follow up with at a single place if I need to. [return]
  2. On Mac, I have a couple Keyboard Maestro Marcros to assign due date as today or tomorrow. On iOS, simply swipe left on an item and use the More button (or use 3D Touch if your device supports that). [return]
  3. I still use TaskPaper for some projects but that’s another topic for another time. [return]


Sep 26, 2015

During those impossibly stressful high school days, I was trained to constantly feel nervous, anxious, and that I shouldn’t be relaxed because there were important study tasks I should be dealing with. At that time, those feelings were, frankly, quite helpful. They helped me be very good with exams, and being good with exams was possibly the most important thing for any high school student in China. You see, the process of college application in China was very different from that in many western countries. In China, one’s application was almost entirely depended on the score they got in the annual, nationwide College Entry Exam. Good score equals good school. (Also the “hotter” a major was, the higher a score it required.) Simply put, there was the exam that defined you, and you only got one chance.1 So I was, of course, very pleased with those feelings. But once I stepped into college, problems appeared. There was no more that one exam. But I needed it. I still felt the need of having a goal that I was all for. It was almost impossible for me to enjoy myself since no matter what I was doing I felt that I was wasting my time and even worse, I didn’t know what I should spend my time for. So I started to set myself goals. Ace the finals. Ace those standardized tests for grad school. Get that kick-ass internship. Goals came and went, but none of them was as satisfied as the one I had in high school. But boy how obsessed I was with them.

I knew that wasn’t right. The irony was I wasn’t even the kind of person who wanted to be a huge star. I was the kind of person who would choose a balanced life over power and wealth any day. I was the kind of person who read so many books, watched so many movies, thought they knew the meaning of life, and kept telling people around to live in the moment. Yet I couldn’t shake off the feeling that I should only be doing things for an ultimate goal.

I knew I got to change.

I got to stop being so obsessed with goals. I got to learn how to enjoy the moment. I got to understand that goal was merely an illusion and I just needed to make the most out of every day and that’s it—not because making the most out of every day would help me achieve any goal. But change was hard as it always was and always would be. I spent four years in college trying to change only ended up falling into the same trap over and over again. Then I sort of just gave up and went on to grad school, hoping maybe grad school would magically fix me. Well, it didn’t. Now that I finished grad school, I really don’t see any more excuse to procrastinate the change because I know I still want to change.

The theory is sound. What I need to do is clear. I just need to you know, change. I hope it goes better this time.


  1. Or you could stay in hell for another year for a second chance—many people in China call high school hell, but to be fair, high school was the opposite to me. There I was extremely happy because things were simple: I studied my ass off and I got two-hour free time on the weekend for a movie, and just thinking of the movie time I was going to earn myself could make me the happiest person in the world. [return]