MindMeTo
Published on 15/05/2009MindMeTo is a reminder service which makes use of Twitter to introduce the concept of social task management. We launched the service earlier this week and so far reception has been great. It was my first time working with Alexander Kohlhofer and Filip Visnjic, and I enjoyed the project immensely.
Perhaps the most interesting aspect of working on projects such as MindMeTo is that problems will come along that totally knock you out of your comfort zone. In terms of web programming, it’s pretty easy to get yourself in a groove. You create countless websites which essentially use the same techniques, the same database and session abstraction classes, the same schema and queries, etc.
One of our major goals with MindMeTo was to make a service which was both quickly accessible, but also highly extensible. It became clear that, in order to allow the service to feel instantly familiar for new users, we would have to rely on a human-readable command structure. Take the following MindMeTo request as an example:
@mindmeto buy some cat food tomorrow.
Even if you had no comprehension of what MindMeTo was all about, you’d still understand the request. What’s really interesting is the social implications of running a reminder service through Twitter. Given that reminders can be set via @reply (as well as Direct Message and through our web interface), the request is already framed within a particular context. When put in context, the full command reads a little something like this:
Remind me to buy some cat food tomorrow
Now ask yourself how many times you’ve said something similar to a loved one, and hopefully you’ll see what I’m getting at. Reminders are largely a social construct, and I think it’s interesting to see how they’ll behave on a service like Twitter.
Of course, the problem with introducing a service to such a social environment is that people naturally expect to communicate as if they were talking to a person. Specifically when setting a time and date for reminders. To tackle this problem, I considered timestamps in two basic capacities: specific and vague. It’s possible to set the following reminder:
@mindmeto pickup milk on May 16th at 4:35pm
But it’s also possible to do something like this:
@mindmeto pickup milk tomorrow afternoon
Perhaps the hardest aspect of developing a system devoid of any form of syntactical delimiters is that our parsing engine has to make an informed decision based on a number of potential results. Firstly, we must figure out where a reminder finishes and it’s timestamp begins. To do this, our parsing engine relies on what I call contextual flags. Let’s take another look at our two previous examples:
@mindmeto pickup milk on May 16th at 4:35pm
@mindmeto pickup milk tomorrow afternoon
While they differ greatly in the level of detail used to set the reminder timestamps, both carry contextual flags that MindMeTo recognizes and acts upon. Contextual flags also (as you may have guessed) help us to put the timestamp in context. A contextual flag of ‘in’ suggests that the timestamp we’re receiving is relative to the current time, for example:
@mindmeto pickup milk in an hour
Is the system perfect? Far from it. But it doesn’t need to be. The beauty of introducing a human-readable format is that we accept the possibility of error (to err, after all…). After all, if you were to ask someone to remind you of something and they didn’t understand the request, they’d simply ask again. Provided the service fails gracefully, the user’s given another opportunity to express themselves. It’s our job to give them enough options so that hopefully they eventually find a way that is most suitable for their personal usage.