Face Value is a currency conversion app that does things differently: instead of converting arbitrary amounts it shows you the actual denominations in the country you're visiting. It lets you think in your home currency even with a foreign currency in your pocket.
I saw an app that had a similar functionality while I was travelling in Brazil, but it was lacking polish and, more importantly, Brazilian Reais. Because the app was iOS-only and wasn't backed by open data, it was impossible for me to add the data for Brazil myself. Heck, even if I could've added Brazilian Real data, I still would have had to wait for the app to be approved in the App Store. Instead: I built my own version.
Outside of Canada and the United States, cash is much more common. You can often use credit cards at fancier places and hotels, but your debit card will not work at point-of-sale. So you go to the ATM and withdrawal a bunch of bills. Then you end up with coins from making change. And you have no idea what any of these coins or notes are worth.
With Face Value we draw banknotes and coins how they look--does a coin have a silver ring around it like the Canadian Toonie? We'll show you that. And then we say what it's worth in your native currency. I think it's an easier way to deal with foreign currency than doing the exchange rate math in your head. You start to think in Euros slowly, with the help of this app. Eventually, you stop having to look at your phone to figure out what a ten Euro note is worth. I think that's what makes Face Value special.
Making it open source means people can add a currency in a Pull Request on GitHub and the app can be updated in a few hours instead of days (or weeks). I can't cover every currency myself, but it's the perfect opportunity for crowdsourcing data.
And it's also pretty, in my opinion.
I figured doing the currency calculations would be difficult, but it turns out there are lots of APIs that will let you convert tonnes of currencies. Using Yahoo's Finance API, I make a single JSONP call once every day and store currency's worth, relative to USD. The code that does it is pretty straightforward; I'm considering abstracting it out into a separate library soon.
The biggest technical challenge for me was doing lightweight testing of the app and the design; I wanted the app to be bulletproof because I would use it myself while travelling and without a data connection. And I wanted a fun, whimsical design that made you feel more confident when travelling; landing in a foreign country can be intimidating. I liked the idea of the app making you feel like a road warrior who had a bit more grounding than you thought.
I ended up using casper.js to test the front-end of the app. I ran into some weird race conditions in my testing but ironed them out. I also built tests that were design-focused; currencies can be created via Pull Requests on GitHub, but the tests will fail unless there are all necessary graphics for every currency (including Retina graphics for iOS). I don't see a lot of testing like that in web programming, but I think it's an awesome way to automate some of the more mundane stuff we do in web development.
The casper tests are quite cool. Rather than explaining them here I encourage you to check out the code. They test when and how many elements appear on a page, the contents of text nodes, and even if resources are being loaded. It's very powerful to have the ability to test your JS code in JS without having to add a clunky Java dependency (I'm looking at you, Selenium).
Test your front-end code! Use casper.js to do your testing! I'm using Travis CI because Face Value is open-source, but they have a pro version available too. It's really handy to test on a platform that isn't your computer.
And keep things simple whenever possible. Face Value doesn't need a server, so you'll notice it exists as an entirely client-side app. One bonus of this approach is that I easily added PhoneGap support.
And use a grid system and a responsive layout from the start. Making this app work on multiple screen sizes has been a pain, but grid systems make it a lot easier.
You can see the app running at facevalueapp.com. It works offline and can be installed as a web app on iOS, Android, and Firefox OS via the Firefox Marketplace. There's even a "native" iOS version in the works. You can also see the code on GitHub. If you have a currency that's missing, just open a pull request and send it through!