Introducing: Moodlogger

As a programmer I tend to be a perfectionist (aren't we all?). For projects that I do in a non-professional environment I always tend to spend a lot of time on getting things perfect. It's also the reason I never release anything. Until now: moodlogger.net is online and the Moodlogger iPhone app is available in the app store! This post is not meant to describe what moodlogger is about; for that, just check out the site, and my own moodlogger profile that shows my current and past moods for an example of how it works. But I thought I'd tell a short story of how it came into life.

Moodlogger took exactly one week to develop. I started working on the app on Monday two weeks ago. I submitted the app for review on Friday. On Saturday I spent some time finalizing the website, and on Sunday I re-submitted the app because I forgot to add some error messages. One week later the app was approved and available on the app store. My first personal project out in the open. It's quite exciting, even though it is only the bare minimum product.

Developers always want to try out the latest gadgets, programming languages, version control systems and whatnot. I'm no different, but for this project I had clear time constraints: only 2 weeks until the start of a holiday, and after that I probably won't be in an ideal development environment for quite some time. So I decided to go only with technology that I already knew. For the server-side that meant Python+Django and MySQL. I chose to build an iPhone app because I had got the developer license earlier this year and haven't used it at all yet, and one of my goals for my 'break period' is to have an app in the app store. When I set that goal I didn't think I would have been able to accomplish it in only one week. For version control systems I chose SVN because I've been working with it all of my professional career. It's is a choice I slightly regret because I want to learn more about git, and git seems to integrate with the new xcode better than svn.

Having to do absolutely everything in a development cycle yourself is one of the most valuable experiences you can have as a programmer. I never knew there was such a huge list of things to get right before submitting my app to the store. Creating icons in all dimensions, meticulously preparing the property list file, compiling for the right target, testing under different versions and on real devices. If you've only ever done projects that were never released then you'll suddenly realize that there's a lot of little only trivially-related things that need to be taken care of. Lesson learned. And fortunately you only have to learn it once.

I had some trouble in the iPhone app because my knowledge of Obj-C (and it's libraries) is limited. I had to learn a couple of new libraries in order to get the right functionality for my app. The most praiseworthy library I want to mention is ASIHttpRequest, which makes it really easy to do anything with http connections. Thanks to that library and JSON the client-server communication was ridiculously easy to implement. No fuss with manually opening connections, cookies, sessions and whatnot. It just works straight out of the box. On the server side I kept the libraries to a bare minimum, sticking to Django's standards libraries to manage sessions and users.  The part of the database schema that contains the core business logic is only two tables.

The most difficult part was by far the UI design, both for the website and the app. My first issue was: where do I get emoticons for the moods that I want to display? I don't have a lot of artistic talent, so I decided to find a set of free emoticons that I could use. I found a whole bunch of them but none of them were really suitable for my idea. That's the problem if you can't (or won't) design your own material. I weighed the amount of time it would take me to create suitable emoticons myself versus using the best match I found so far, and decided to use the emoticon set I found online. It's lacking some moods that I would like to include, but I'll worry about that in the future.

Designing the UI and the website happened in pretty much the same way. I thought of the fastest way to accomplish what I wanted to accomplish, and never looked back when I did. There's a ton of things I'm still not happy about and that I would have tweaked if I had more time to work on it, but the sudden deadline meant that I didn't give myself the time to look back. The main idea was: "Stop worrying about if there's something better. If you can do it right now then just go with that.". That's how I got the domain name, the icon pack, the UI design and everything else too. For hosting I just went with my shared hosting provider. I won't worry about dedicated hosting until it really becomes necessary.

There's a ton of features I still want to implement. I want to add a history view to the iPhone app so that users can see a calendar view of their moods. I want to make the app work offline and synchronize with the server when internet is available. I want users to publish their moods to Facebook and Twitter. I want users to be able to add friends and import friends from Facebook. I want to make an Android app! But perhaps the coolest thing is: I will have a lot of mood data to work with in my database. Add some demographics and I'll be able to generate some pretty interesting statistics, both for each user independently as well as in a global sense. But that'll be version 2.0.

You may note that the app is free, registration is free and there are no ads on the website. So where do I make my money from? The answer is: I don't. Making a free app and a paid app separately would've cost more time, and the functionality of the app is still very limited, so I don't really feel like charging people money to use it. The website will hopefully become a garden of wonderful statistics in the future, which could become a source of income if I added ads to it. But I hate ads, so that's not going to happen. Consider it donationware for now.

All in all I'm quite happy with the result. I realized once again how absolutely vital it is to release something. Even if it's just the barebones, after it's released you'll have everything in place to start incrementally improving it. I'll be on holiday for a couple of weeks, but I'll definitely pick this up after I get back. It's one of the most fun projects I've ever worked on.

Posted in Tech | Tagged