POST /session creates an authenticated session and returns a set cookie.
DELETE /session/:id will logout/remove the session and cookie.
Difficult for a single-page web application to check its authenticated state without performing a request. You necessarily incur network latency at application start even if all other resources are locally cached. > 200ms may mean the difference between instant and regular web site.
This approach works well for native browser applications (HTML forms) because the login forms can be customised (as opposed to native HTTP authentication).
Cookies are easy to implement and typically supported by web application frameworks. This approach won’t add to the implementation effort.
An API token is a server or client generated token that is appended to each HTTP request as part of the URI (or request body).
Machine services can consume a service easier using an API token: it’s easier to append a query parameter in HTTP libraries than to setup cookie handling.
These tokens break HTTP caching because the URL changes per session.
It is not intuitive how session management would work this approach: how do you log out?
Web applications cannot have persistent sessions (between application starts) without resorting to cookies or storing the API token in HTML5 localStorage.
This approach is the same as using cookies but shifts the burden to the developer to append credentials to each request.
HTTP Basic and Digest authentication schemes are provided for by the HTTP specification.
These solutions don’t allow the login process to be customised and provide a bad user experience for logging on (standard forms are used). Similarly, no session management options are provided and you cannot logoff.
This is a brief (and incomplete) summary of the issue. For more information, see the plethora of questions on StackOverflow.
Perfect Dev Environment for Building Single Page Web Apps.
jQuery (+ mobile), Backbone.js, Coffeescript and HAML-Coffee.
I started building a single-page mobile web app side-project on the weekend (hopefully I’ll release it in the coming weeks). I spent a couple of hours creating the perfect development environment - its definitely share-worthy so here it is.
Node.js + Express
Node and Express provide the basic compilation architecture. connect-assets is responsible for compiling and minifying all of my client-side code. This means that I can develop and use refresh to recompile.
haml-coffee is my client-side templating language. connect-assets will compile all of the templates into .js files and then automatically include them so you don’t have to worry about dependency management. stylus is similarly used for all my stylesheet needs.
Your entire client-side application lives in assets. This directory is compiled for each request (basically turned into single .js files, etc).
assets/js - put all of your application code here (and any other libraries that you want included and minified into your application code).
assets/css - stylesheets.
assets/templates - all of your hamlc templates go in here.
The other important file is your views/layout.jade file. This file generates the page that you will request from the browser and that will run your code. Basically you need to make sure you include your main application file and any other assets you need. For example:
The difference between script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js') and != js("underscore") is that the former is loaded from an external site, while the latter is included as part of my application and will eventually be minified into just a single app.js.
Including Other Files
This workflow uses snockets (node version of sprockets) to manage dependencies. Including another file is as simple as putting a comment at the beginning of the file:
#= require ../models
Similarly, you can require a whole directory (including sub-directories) of files by using require_tree as such:
#= require_tree ../templates
Important tidbits for configuration - you need to add these lines to your app.coffee file to get it to work properly.
Never have a list of things you have to get done ‘today’ that lasts longer than ‘today’.
I use Things to store and plan tasks that I need to get done. When I first started using it, I would stack up my ‘Today’ list with aspirations - things which I thought I might be able to get done today. Then I would come back the next day. And they would still be there. And then the next, and there would even be a couple more items which I need to get done.
It’s pretty disheartening to look at a long list of tasks you should be doing every morning. It hurts even more when its not really stuff you really care about.
The list of stuff you need to get done today should not be aspirational.
By having a long list of tasks I’ll never get around to doing, it reduces the value of the list: I never get around to doing half of the stuff and it doesn’t seem to matter (because you’ll always get the important stuff done regardless). It also disincentivises me from checking it - why face this giant list that makes you feel bad?
I realized that I had to take control and stop using my task manager as an aspiration planner. Every morning I now compose a couple of ‘must complete’ items into my Today list. When those are done, I can tackle others from the ‘Next’ list. No more big hairy scary lists.
A Better Website Editing Workflow: Word to Markdown
For the SULS website, most people prefer to submit content in Word format (docx or doc). This presents a slight problem since the website uses Markdown for content.
manually convert the word files to markdown (extremely tedious and spirit crushing);
teach everyone how to use markdown;
automatically convert the word files to markdown.
The second option seems reasonable, until attempted in practice. Markdown is an extremely simple format - and most people seem to get it really quickly. The problem is that the workflows for producing it are terrible. If people don’t use a dedicated editor on Mac, they tend to use TextEdit which spits out RTF files which have to be manually converted regardless. While software like Mou exists which is fantastic, not everyone has the latest version of OS X (which is required by Mou) or even runs Mac. On Windows, the WYSIWYG editor situation is pretty horrific as well.
Most of the Word content is actually pretty trivial (no complex formatting) - therefore automated conversion actually has a chance of working well. So, how do we do it? David on StackOverflow helpfully provides a solution:
textutil -convert html file.doc | pandoc -f html -t markdown -o file.md file.html
This actually works surprisingly well - however it does have some minor issues converting links and other things. It does reduce a lot of the legwork out of manually converting a lot of the content.
The main shortcoming seems to be with textutil's conversion of doc to html. This could perhaps be remedied using Google Docs. One potential solution is to pull down all the website content dynamically from Google Docs as html at compile time and then convert it to md. This could provide a nice and seamless editing workflow.
Take almost anything – news, weather, stocks, social services like Facebook – you name it. PC users have to interact with these things via the web, reducing their super-powerful PC to a dumb terminal. But mobile device users get rich, smooth apps that are a lot more fun to use.
Why is using Flipboard or the SMH App on an iPad better than the experience on my laptop?
Hint: it’s not because of touch.
As a PC user I am increasingly left out. Left to suffer with browser-based experiences while my wife uses her iPad to interact with the same services in a more enjoyable manner.
Apps can remember who you are - they can integrate tightly with other services and most importantly they just work.
An amazing example is the SMH App. Favouriting and sharing is much easier on an iPad than on a laptop because apps can remember who you are effectively without you having to create an account.
Also, at least on Android devices, sharing is consistent across every app: to share a news article on my laptop I have to open up Gmail, select the correspondent, paste a link in and then send it.
Compare that to click a button select a contact, and click send.
There are many reasons I’m motivated to see Windows 8 be successful … Perhaps the biggest though, is apps. For touch, keyboard, and mouse, I want apps.
Windows 8 will enable an app ecosystem. The most compelling reason that it hasn’t existed to date is the lack of a secure sandbox and app store.
The App Store is all about licence management: I don’t have to deal with 100 different vendors and there licencing issues and remember who I bought what from. It’s all in one place. I don’t have to create a new account with each vendor.
The sandbox means I don’t have to worry that some small utility app is going to mess up my entire PC.
I think the lack of apps on the PC is because there’s no store, so no easy way to find and install such apps. Microsoft could have created an app store for Windows 7, but Win7 doesn’t offer a fully sandboxed runtime environment where such apps can be virus and harm-free to the end user.
Mac users benefited from apps before the official App Store because of a psuedo-sandbox: I typically trust that Mac Apps won’t screw up my computer; and they feel easier to remove (ie. just drag it to the trash can).
“Mark, you need to stop negotiating point-by-point.
Our goal here isn’t to have a negotiation line-by-line. We want to know what all of their issues are first. You’re compromising on each point and that makes no sense.
Let’s get all of their issues on the table. Let’s then convene privately and rank the issues we care about and which we don’t.
Let’s be very flexible on the issues that are at the bottom of our rank and they might really care about. Let’s dig in our heels on the issues we care most about. We can trade compromises on issues that aren’t as important to us in exchange for not budging at all on our most important points.
If you negotiate piecemeal you end up compromising on everything. That’s not very smart.”
By negotiating each point up front (without knowing what all the issues are) its harder to strategise which issues you should concede on and which you should holdfast on. There will always be things that are important to you - but things which are only nice-to-haves in any negotiation.
It’s also harder to make a case for the things you really care about - you can’t really point to issues you’ve already conceded on because they were negotiated separately.
it’s fine to disagree, it’s fine to push back, it’s great to have strong opinions and beliefs, but give my ideas some time to set in before you’re sure you want to argue against them. “Five minutes” represented “think”, not react. He was totally right. I came into the discussion looking to prove something, not learn something.
Being first doesn’t mean being right. Take time with your responses - no one will think worse of you for it.
Slow down, think it through and then respond in an argument. Conciseness and brevity are better than waffling on and if we don’t stop and think we waffle.
There’s also a difference between asking questions and pushing back. Pushing back means you already think you know. Asking questions means you want to know. Ask more questions.
Relax - and don’t try to win arguments. If you view it as a confrontation you’ll only reaffirm your beliefs and you’ll shut out all other possibilities. You’re not always going to be right.
There are two things in this world that take no skill: 1. Spending other people’s money and 2. Dismissing an idea.
So next time you hear something, or someone, talk about an idea, pitch an idea, or suggest an idea, give it five minutes. Think about it a little bit before pushing back, before saying it’s too hard or it’s too much work. Those things may be true, but there may be another truth in there too: It may be worth it.
Sent an email out (with a fun title) asking customers to install Earbits for Chrome. Interesting that weren’t trying to sell to the customer (by proffering the benefits of the extension) but instead asked because tehy wanted to get to the top of the Chrome Web Apps Store.
Apparently it worked. I have a feeling it had something to do with the playful tone in the email.
We need a favor. Seriously.
We’re already in the Chrome Store’s Most Popular Apps section. But we really want to move our way to the top. You can help.
Please install Earbits for Chrome (it takes 4.2 seconds).
reduce maintenence as much as possible (I only have a few hours a week to work on SULS related projects)
make it easy for the rest of the executive to update
make it secure and faster
make it easy to test out new features and restyle the site.
The new website is statically generated with Nanoc. The main reasons for switching to static generation are:
The content on the SULS website doesn’t actually change frequently - there are no user comments and there are only a couple of new posts made per week. This means that the cost of regenerating the entire website (about 8s of compilation) is trivial.
The entire website can be versioned using Git - this means that if something breaks (i.e. someone updating it incorrectly) it is trivial to revert to a working verison.
Simple tools can now be used to update the website: Most of the content is now markdown (which can be edited using tools like Macchiato) and all of the supporting assets can simply be dragged and dropped. The most difficult part of the update process is obviously invoking the compilation via the command line or doing a git commit/push - this I intend to automate with Apple Scripts (we’re a Mac-only society).
There are no security vulnerabilities and no maintenance! The website has no running code and is statically served by nginx. Therefore - the only way to break it would be to use an nginx exploit (automatically updated by VPS provider) or to break in using SSH (good luck - we use public key only authentication). Furthermore, this means that I don’t have to apply any weekly security patches.
I can now experiment with the website on my local computer - changing the layout or adding new features without worrying about affecting users.
The website should also be faster since it can be cached entirely and there are no DB accesses or content generation running on each request.
Additional benefit: the entire website is backed up on multiple computers by cloning and regularly pulling the Git repository.
Over the next couple of weeks, hopefully I’ll get a change to write a couple of blog posts outlining why I chose Nanoc, the structure of the website and how it is generated using Nanoc. I’m also looking at open sourcing the code as an example of a relatively complex site built using Nanoc.
Gramfeed is a side-project turned startup that grew quite successfully with the rise of Instagram.
At launch it was just a website to view popular photos, search photos, view user photos and view user feed.
Most of the features and UI changes were implemented based on user feedback … Obviously watch for any product mentions on twitter and engage with users.
The key is to select a few bloggers and tell them your personal story that led you to developing the website rather than describing how great your product is.
Ultimately if your product is simple, easy to use and solves a problem then people will notice it, they will tweet about it, recommend it to their friends, influencers will take notice and you will get covered eventually, no special marketing is necessary, focus on making things simple and listen to your customers.
Having a blog also drives traffic back to the site.
On Tuesday I attended the University of New South Wales Startup Pitch Event. There were some great ideas - but they just weren’t expressed right. Here are a couple of things I took away from the pitching.
1. Make me feel the problem.
Mathspace is using the internet to make learning math easier. They listed a few problems (ie. manual marking is time consuming for teachers) at the start of their presentation - but I never connected with the problem. They never really made me understand why maths had to transition to the internet because they talked in the abstract - devoid of any real story or experience. I doubt many in the room were teachers - but everyone has done high-school maths - we’ve all faced homework where you struggle through each problem kind of hoping its right only to find out the next day in class you were completely wrong and the time was wasted.
The biggest problem startups face is ensuring people understand what problems they are solving. For example, Shop2 are doing a social commerce app - but why I would want to have a profile of everything I’ve bought? I can only assume the problem they are solving is there isn’t a good way to share clothes/fashion you’ve bought with friends. Throughout their pitch I was just trying to work out why I would use it - or who their target market was and why people would be compelled to use it.
Tell me a story - make me feel the problem - invoke a memory or an experience. If you can’t do it directly then at least give me someone to emphasise with, even if he/she is fictional - Sally the fresh out of uni teacher is much easier to relate to than ‘teachers’.
2. Tell a Story.
Mijura told an excellent story - even though I couldn’t relate to the problem directl - the pitcher introduced Kim the bank manager. Although they weren’t solving a problem I have, by introducing this character with a backstory I could understand the problem - I could see how annoying it would be. They had my attention.
More importantly, they used the story to introduce the problem and to discuss their solution. At the end, they brought Kim when asking for funding so they could ‘reach out to people like Kim’. This was a great conclusion, it made the pitch feel cohesive and whole.
3. You should be the most interesting thing on stage.
The best pitch of the night came from Locongo - the speaker was charismatic and immediately made me feel the problem and gave me a solution. Locongo is a travel experience business focused on letting you do the things the locals do. I was hanging on to every word after the story he told - I had felt the pain of finding things to do while travelling and I wanted a solution.
The speaker didn’t present slides and this is helped as he had to sell the entire idea through speech. What’s more powerful - writing on a powerpoint slide or being able to speak to a crowd and developing a rapport? Too many of the presenters relied on uninteresting, text-heavy slides. Slides where used as a crutch for communicating their ideas.
4. Acknowledge the Elephants.
A lot of the startups had major problems which they failed to acknowledge. Everyone talked about their solutions or the problem they were solving but many failed to tackle the elephant in the room.
One group (whose name escapes me - Spoilz?) were developing a check-in app that allowed bricks-and-mortar stores to give discounts to get more people into their shops. While they attempted to tackle competitors by naming apps like FourSquare - they missed their specific competitive advantage (what would stop FourSquare from doing exactly the same thing?). Similarly, they missed the biggest issue - getting users to download their app (how are they going to gain traction in Australia when FourSquare hasn’t?).
Mathspace is pretty much a direct clone of the Khan Academy. Throughout the pitch I had this unsettled feeling because they ignored this - they didn’t tackle what they were going to do differently, or how they were going to compete. It is perfectly fine to bring an existing business/idea to a new market - but you need to justify why the original player can’t enter the geographic market. In this case, Mathspace may have a legitimate advantage because educational curriculums are in different markets - but that doesn’t tackle why someone wouldn’t use the Khan Academy (especially because it is a not-for-profit) where the materials are appropriate.
Locongo also failed to tackle the major scaling issue in their one minute pitch. While this may have been due to time constraints - the biggest issue with their business will be expanding in to new geographic locales while keeping customer (ie. experience offerors) acquisition costs down. Another related issue is how they would deal with complaints. I spoke with the pitcher afterwards and he informed me it would be an escrow style service. While this is maintainable on a small-scale, it could potentially be labour intensive and lead to big branding issues (see the AirBnb disaster earlier this year).
Aim to give your entire pitch without slides - then use slides to increase clarity where needed.
5. Tell me exactly what you’re doing.
During some of the pitches I was still trying to work out exactly what they were making. Tell me in plain terms - don’t dress it up in buzzwords or marketing speak - let me know how as a potential consumer I would use your app/service - or what the end result of using it is.
For example, PretaWeb were pitching a product called PretaCloud but they didn’t explain what it was. I had no idea whether it would be something I could use or if it was a CMS.
Similarly, Alex North from Posse (a great idea with a great team) only spoke in abstract terms. While this was acceptable because it was clearly a recruiting style pitch rather than an investment pitch, at the end of the presentation I still didn’t know how Posse worked or what exactly it did, or why I would visit the website.
You need to have a single sentence describing how I will experience your product as a consumer - otherwise you’ll have people not really knowing what you do and not really caring either.
6. Just do it.
While the above criticism may be unwelcome for some of the presenters, overall they all did really well, and most importantly they are out there testing their ideas and doing what they love. Everyone who pitched put themselves out there - and it can be incredibly tough to pitch for the first time - so congratulations if you’re reading.
A few notable mentions of the night: Handshake (B2B sales/transaction app for iPhone and iPad - think Square for B2B, PhotoMerchant (online ecommerce sites for photographers), and Sneaking Duck (online fashion stores with a bunch of verticals - ie. Sneaking Duck is for eyewear).
iPhone applications cannot talk to each other. As lonely as they get, it’s worse for usability. After reading The App Wall, I’ve realized that the current siloed approach, where no application can communicate with another, to iOS applications is flawed. I have to go to a different application to access data that is semantically the same but provided by a different vendor.
iOS limits the number of ways applications on a device can interact. They are completely unaware that any other application exists - if I click on a restaurant in the Maps application, there is no way it can open up the Restaurant Review application I’ve bought. This means that if an app developer wants to integrate with another service, they either have to provide a link to a web app (if it exists) or reimplement it themselves. If I want Twitter functionality - I have to redevelop it myself rather than simply reusing the Twitter app. My apps can’t work together - my phone can never be more than the sum of its parts. A new application cannot add new functionality to any others.
Applications can integrate ‘in the cloud’ where I could give it the login details - but this still doesn’t let me open up the native app, only the poorer HTML5 web application. This also causes another issue: fragmented identity. Every time a new app is installed, I have to enter my login details for any service it wants to use. It can’t pick these details up from a central repository - for example, it can’t automatically connect to my twitter account. Sometimes I won’t want an app to get access to my Facebook or Twitter, but often I’ll just want to allow it to access it.
The Hubs Approach.
Windows Phone 7 has the idea of hubs. All semantically similar content is available in one place. For example, the Messaging hub could contain all my twitter messages, facebook messages, emails and SMS’s. If I installed a new app, I wouldn’t have to open up the new app, its messages would simply arrive in the new hub. Unfortunately I don’t believe the API’s are exposed to allow this to happen yet. This doesn’t solve cross-app communication however, I can’t click on an address in a tweet and have it open in the Maps Application.
Intents allow an application to specify a desired action and then to let the system decided which application should open it. This would allow a Maps application to call an intent DISPLAY_REVIEW, which the Restaurant Review app could capture and open. This isn’t perfect because the developer of the Maps application needs to know during development which intents are available and likely to be used, but it is better than not letting applications interact at all.
Intents may fragment the marketplace however - there are a few standard intents, but for most uses a new intent will have to be made. As you can imagine, not every developer will choose the same name, and until a name is standardized through use, you’ll have apps which will work with only a few others. It is understandable why Apple hasn’t gone down this route - fragmentation is not something they ‘do’.
Every application offers a small feature - but the lack of integration means that my phone can never be more than the sum of its applications. Conceivably in the future, when I add a Restaurant Review application, I could access its contents from a wide variety of apps (Foursquare, Twitter, Maps, etc). The Hubs approach is neat but only aggregates application content, however if combined with the Intention based approach this could provide a workable way so that I’m not limited to a few applications as M G Siegler was in The App Wall.
Computers are too formal - and anything on them is too permanent. Yesterday I was speaking to a Dell Support Technician and had to write down my case number. I scribbled it down in my paper notebook. I use a whiteboard as my ‘todo’ list. I keep track of my day in a diary. This is despite the fact that I have purchased/tried to use many applications to serve these purposes.
Many bits of information don’t need to be formally written - my task list doesn’t need to have perfect grammar, or make sense to anyone else. When I create a typed document however, I’m punished by the red squiggles if I make a trivial mistake or abbreviate it so that I can understand it.
Computers aren’t for informal bits of information. If it doesn’t fit the given schema, the computer will glare at you through red underlines, pop-up error messages or a refusal to save the information. After all, every letter is pixel perfect, the font is consistent and everything fits nicely into a distinct column of text. Why should it let you ruin the perfection of a document by not using proper English?
Look at handwritten notes on the other hand. They’re messy. I immediately know it’s a draft - it feels like a draft when I’m writing it. Mistakes don’t matter, I can just cross them out; I can fix them later.
Naming things is hard - the cognitive burden of categorizing and naming is often enough to put people off a task. Computers deal with files - if I have to store something, it’s going in a file. This means that for every piece of information I create, I need to think of a good name for it, and find a place in the hierarchy of my folders to put it. In my diary, I just find today’s page and write it down. The information naturally expires - I’ll never turn back to the page to look at it again unless I have to. My laptop on the other hand would end up with thousands of files with vaguely appropriate names.
If I had to store all the random things that came up from today alone, it would look something like this.
Psychologically, it’s much easier to chuck out a scribble on a piece of paper than it is to delete those files. For some reason, the excuse what if I need it later? is always more applicable to electronic files.
Making Computers Informal.
I don’t have a quick and easy solution to this problem. I wrote this post because I wanted to think through why I use my whiteboard and not my laptop. The formality of typed documents and the cognitive effort involved in organizing information on computers are just two facets of the problem. Before coming to a solution, I’ll have to discuss other issues, like the availability of handwritten notes (I can spread pieces of paper on my desk to create a much larger surface than my screen), but that is for another day.
Before Benjamin Zander’s TED Talk I used to think classical music was boring: no one I know listens to it; it’s stuck in the past; and it doesn’t connect with me emotionally.
Zander makes classical music interesting - if you haven’t, watch the video below. Quora’s community voted it as the second most must-see talk, with about 2,000 people liking it. Supported by over 340,000 views on Youtube (not including those from the TED page) the online community identify it as an interesting video. But that doesn’t mean he makes classical music interesting - to confirm it, you’ll just have to watch the video.
Zander speaks with passion - with the excitement and belief that he has something to share with the world; something that the world will love. Watch any other video about classical music (like this random video) and when you wake up again, think about why it didn’t interest you. It is similar content - but it doesn’t stick in your mind - the difference was Zander’s enthusiasm.
Enthusiasm is critical to a speech. Zander’s talk would have been dull if he didn’t believe in classical music - if he thought the situation was helpless. His passion didn’t change the content - it made it memorable. Do you remember the boring lecture at university, presented in a monotonous voice with the lecturer tiredly flipping through slides? Or do you remember the lecture where the speaker strode across the stage confident that they had something exciting to share with you? Enthusiasm can make dry content interesting, and it’s easier to remember something that is interesting.
Information can only change the world if you remember it. Something forgotten doesn’t affect you - how can it if you cannot think about it? If you remember, say that turning off a lightbulb for an hour everyday (when you leave a room) can save 22,000 W, you can then act. The information manifests itself through you - it influences the world by changing your behaviour. Your ideas can only change the world if they’re remembered - and making them memorable is about making them interesting.
The next time your presenting on a topic - think who am I being that the listeners’ eyes are not shining? If it really matters to you; if you really want to change the world; you’ll speak with passion and enthusiasm.
Have you ever sent an email asking for something? Did you forget since they never responded? I lent a book to a friend a long time ago. I sent them an email when I remembered it. They never returned my email and I soon forgot about the book.
Wouldn’t it be great if you could attach labels to your emails when you send them? I could have labelled it with ‘reminder’ so I could check up on the progress later.
Email has a fire and forget model. After it’s sent its confined to your Sent Mail folder - there’s no easy way to check for emails that haven’t been replied to. Why would you want that anyway? I don’t expect/want replys to some emails.
Implementing a drop-down menu on the send button in Gmail that allowed you to select labels to apply to the conversation would be trivial. You could easily have a label called waiting, for all the emails that need a reply.
Email for Task Management
I use my inbox to track the conversations that I need to be a part of. I’ll leave an email in there if a conclusion hasn’t been reached. Every time I check my email it reminds me that some action needs to be taken. My inbox is no longer just for conversations, it’s a primitive form of task management. I can quickly see if there is anything I need to do (all my unread mails), or if something is outstanding (all my read mails).
Email is effective for task management because it can reach everyone. I don’t need to invite people to the web app I’m using - I simply send the a message. I can quickly see the history of the task - and anyone who has worked on it. I can hand it off to someone else by forwarding it to them.
Dedicated Applications Fail.
Having a web application like Remember The Milk fails for me. Now I have to check my email, in case someone’s sent me something I have to do, and this web app for the things that I need to do. I also have to add or update entries in the web app whenever someone emails me an update about a task.
Similarly, it’s isn’t in my face. Forgetting to check another website is easy. My email is ubiquitously available, and I have to check it to communicate, not only to organise.
Task lists are inevitably a bad experience. They nag. There’s always a list of things that need doing and something that you should be doing instead of procrastinating. The mood of the website is negative. Here are the millions of things you need to do. Email can be a form of procrastination. Here are all the people that wanted to talk to you. I always want to check my email in case there’s something new - I fear checking my task list in case it’s even bigger.
Make Email Easier
Allow me to label emails I send. Don’t make me wait until they’ve replied.