The last time Hackerfall tried to access this page, it returned a not found error. A cached version of the page is below, or clickhereto continue anyway

Spendy

Spendy

An expense-and-income tracker with a focus on minimalism and ease of use.

Motivation

I decided to build this app because I've never found an app in this category that I either liked, or kept using for more than a short amount of time. My thought was that, since I am a developer without, at the time, a clear project to take on, I'd finally put some effort into making something I'd use. And so I did.

Other apps

There are lots of other apps kind of like this app of varying quality. Even though there are great apps none of them did what I wanted. They either tried to feed me to much information or features or did not have that key feature I needed.

Have a look at the picture below. The general trend seems to be pure functionality, display everything and store everything. For me this is just too much.

I will be honest though, most of these apps are rather budgeting apps and not purely tracking apps. These usually require me to create certain accounts, balances and so on. This is something I am not interested in. All I want is to track what I spend, and that's it.

This app

And below you see Spendy. As you can tell, it is easy on the eyes while still presenting you with the information you need.

So what makes this one "better" (for me, at least) that the other ones. I'll break it down into the screens you can see in the picture (full resolution here).

Starting with the first screen. This is the main area you will see when opening the app, this is where your logged entries are stored. I tried to make it skimmable and I feel I succeeded with this. Each day gets an alternating color, making them easy distinguish while still not dedicating a whole element to it, like a separator. The amounts are either red or green to, again, be easy to find or distinguish. And for the last part, something I never found in any other app, is the converted amount. See, I am traveling a lot lately and with that I use different currencies as you can see. But I am from Sweden so to think in SEK is what feels natural for me. With Spendy I don't even have to think, because it is just there, sure it is muted and a bit hidden, but it is there. And it is great.

Continuing to the second screen. Adding or editing an entry takes you here, this is one of the screens I also never found any other app did good enough. They all had at least two steps when adding an entry, usually first choosing a category and then adding price and so on. Some even opened different screens when adding tags and such info, shudder. Now my screen is simple, at first glance you will be directed to the two crucial elements, the amount and the categories because they have some contrast with their black text. But the screen consists of four more elements, hidden in plain sight. You can change the type by pressing the navigation bar, it will toggle the Expense and Income. You can change the currency, by pressing the currency. You can hide the keyboard by pressing the calendar icon, it will reveal a date picker. And last, and probably most visible, is the note field. By taking advantage of as much space as possible I actually have lots of space over.

The third screen is a work in process. Other apps seems to focus a lot on statistical screens, and I am not sure I agree with this. In my app you can only see 14 days worth of calculated incomes and expenses. It has been sufficient for me as to keep an eye on my general direction with my spendings, but I feel I can improve this with some more types of statistics. I just need to find how I can do this without just throwing in everything like other apps do. I want each pixel to be meaningful, and I believe using the app and seeing what I'd like to see before implementing it is the way to go here.

Regarding the fourth screen, there is not too much to say about this one as it is a simple options screen. I will go through some of the important ones though below.

Let's count these as the 5th, 6th, 7th and 8th screens just for continuity's sake.

Looking at the fifth screen we see the interface for managing your currencies. As you see there is one dedicated main currency which the others set their exchange rate towards. This is to be able to calculate in the first screen above, as well as for the charts and so on.

The sixth screen is simple, it only consists of the saved categories. I made each row a different color to give the illusion of not looking so empty.

For the seventh and eighth screens you may see some similarities. That's because they are the same control reused. In case it is not obvious they are used to add currencies and categories. They do have some things different, the font is bigger/smaller and the error-handling is different. For example, the currencies must be 3 letters and CAPS while the other one can be more letters and small letters. They send the entered data back to the controllers via delegates.

Data

With the data I wanted it to be as simple as possible. Since there is only one type of entry that is always the same it is all done in a plain text file (CSV). It is managed via a singleton object.

The data is in the form of:

Timestamp,Category,Amount,Currency,Note

As you can see, there is no "exchange rate" here. I decided to keep as much data separated as possible since a user may want to change their currencies around. The currencies and their rates are stored on the device with the help of NSUserDefaults.

The data is synced to a users Dropbox account, currently it is a one-way sync that can act as a backup. Two way sync will be worked upon at a later stage.

For the future I might reconsider using this method (plain text) in favour of CoreData or something similar. Because I already have an interface where I manage the entries (my singleton) I expect any change will be relatively painless. Currently plain text is fast enough though, stress-testing the app on an old iPhone 4 I found that once the number of entries gets closer to 3.000 it will start to take a noticeable time to load. But since this is a lot of entries, and I use an old device I feel I should avoid premature optimisation.

Libraries

Maybe libraries are not the correct term here, but I will list some of the technologies I've used in Spendy, apart from Apples that is.

Wingerlytics is what I use to record user sessions. It is a small class I wrote myself after feeling overwhelmed by giants such as Flurry, Google Analytics and so on. No doubt are those better, but it was interesting to write something like this. I will have a bigger post about this once I actually finish it.

RMStore is a wrapper for in app purchases. I decided to use it after wrestling with my own implementation for a while.

AppIRater will open a "rate this app" after a set amount of usage of the app. I decided to just use a drop-in library for this because it seemed pretty boring to write my own logic.

Dropbox's SDK is obviously used.

SWRevealViewController will let your relatively easy set up the slide-in menu that I use for my, well, slide-in menu.

Icons are mostly from icons8.com.

Colors

Now that the main aspect of the app is gone through, I'll mention some other details I liked implementing. First up, the colors. I am a big fan of customizability so why not let my users choose their own color. And so I did, the app currently allows four different colors, it could be more but the space on my button (see the settings above) ran out, hehe.

The thing I like about this is that it changes a lot of small details, thanks to iOS7 (I guess) it even changes the cursor in textfields. This is evident in the leftmost screen below. Lots of details are changed.

The icons in the screens to the right, the little bar-chart, wallet and cog, are all the same icons with a color overlayed. It took some time to get just right but in the end it was a neat detail that I am kind of proud of.

Animations

I try to use animations to make the app feel smooth and "alive". Below is one example, when you tap an entry in the main log screen. I like working with animations, but frankly this app does not need a lot of them.

The gif-capture did not produce very smooth animations in this case but I think it will get the point across anyway. Also, for some reason it keeps making the "Delete" button a different color from the red that it is supposed to be in the second capture (right). Odd.

Old vs. new

For fun, I like to keep old pictures while I develop so that I can see the progress I made. So here is a comparison between version 1.0 and the first screens I posted online for feedback, I think these are the first ones anyway.

The main takeaway here is that I, in my opinion, nailed the "add entry" screen pretty quickly. I remember that this was the screen I worked on first because I got inspiration from an app I no longer can remember the name of.

Thoughts

While I am very satisfied with the app, and have used it for more than three months, usually multiple times per day, it is by far perfect. I'll see if I can gather some thoughts about it, and the development in general.

It is a good app for me. This doesn't mean it is this for other people, I have not yet received any feedback from the ~120 downloads. I know from my analytics that some people are using it (yay!), I have not yet analyzed the data but I can see a few IDs here and there popping up again and again. I hope they like it.

Sometimes the navigation when going to a different screen is annoying because you have to tap the menu icon. I had a swipe gesture before but I know something made me take it away, I will go back and see what that was.

There are some implementations that towards the end became, well, bloated. They are kind of few and isolated so that's something positive at least. One example is the "add currency" and "add category" control. It is supposed to be reusable but because of some currency-or-category specific code that needs a slight re-write.

The data is in plain text, but it still consists of UNIX timestamps and each entry is saved with its original currency and amount. This caused problems when I wanted to do things with it in Excel. The solution I have now is to send the data via the "send data via email" button, which formats it with correct dates and coverts the amounts into the main currency. Maybe I should just save that version to Dropbox in addition to the raw data? Hmm.

I use the singleton pattern for my data. I'v been looking for some proof that, in this case, it is a bad pattern. Because I've read so much about how "horrible" the pattern is. I am happy with it though.

I mentioned this one before. About the statistics screen. While I don't feel there needs to be any advanced analytical tools on the little iPhone, I do think there should be more than I have now. I just have not figured out exactly what I need to see there, yet.

Now, the things I've just now written are primarily negative but the project as a whole is in my opinion a huge success for me. Sure, there are a few annoyances but that's just a drop in the ocean as far as I am concerned right now. This is my first actual app I've made, from the ground up and off into the App Store, even though I've been "doing" iOS development for over a year, including some employments. It might not lead anywhere in terms of App Store success but that was never my goal.

You can actually download the app from this App Store link.

Feel free to contact me on

jontelang@gmail.com

or maybe Twitter via

@jontelang

. And here is my current

portfolio

, which I am still working on getting together nicely.

Continue reading on dl.dropboxusercontent.com