← Back to projects

Solo Developer · 2021

Moeda Hoje - Mobile App

TypeScriptReact NativeReactContext APIStyled Components
Moeda Hoje - Mobile App

About

Moeda Hoje is a side project I built and shipped to the App Store on my own — design, code, release, and the updates after it. It answers one question quickly: what is a currency worth in reais right now?

The Moeda Hoje home screen: a last-updated timestamp above each currency quoted in reais

The project

The app is very straightforward to understand: Users can see currencies' worth in reais at the moment, with some minutes of delay maximum, set notifications and see the chart with the price over time.

The Moeda Hoje home screen: a last-updated timestamp above each currency quoted in reais

The rate list

The home screen is a flat list of the world's major currencies quoted in reais — euro, US dollar, Canadian dollar, Australian dollar, pound, yen, Swiss franc, yuan — alongside crypto like Bitcoin and Litecoin, each with a flag, the current value, and the direction it has moved. Nothing to tap through: open the app, read the number, close the app. There is a timestamp at the top so you always know how fresh the data is, which matters more than it seems when rates move fast.

The Moeda Hoje home screen: a last-updated timestamp above each currency quoted in reais

API and Scraper

The source of truth for this project was the Google website: Not the API, the site itself, since I built a scraper to fetch this information every 15-30 minutes. This implementation by itself has some challenges, since Google, although they are scrapers, don't like projects to extract their data. One solution designed was to randomize the requests as much as possible to avoid being captured by their bot blockers :)

All the data was stored in a PostgreSQL database, keeping the record across currencies and being simple enough that users got a really fast response when opening the app, since building a cache layer on top of this API was very straightforward, just invalidating the cache when triggering the scraper again.

Designing the interface

Before AI, we needed to design the interface by hand in Figma and understand concepts like the 8px rule, something that is way more abstracted now with AI. I got some apps I liked as reference, made some tests, and built the UI in a way that opening the app and checking the values was very simple, focusing on performance to avoid being that app that should be simple, but takes enough time to load that the user prefers to type the quotation in Google directly rather than opening the app.

Configurable alerts

The feature I use most. You pick the currency to compare against the real and how often you want to hear about it, and the app pushes the rate on that schedule.

If you have worked with iOS, you know that setting a background task is not as easy as on Android. The iOS notifications were not consistent in the beginning, which made me spend a good amount of time until I figured out the right permissions and configurations needed to ensure that the app worked and the background tasks were not killed by the OS.

The Moeda Hoje home screen: a last-updated timestamp above each currency quoted in reais

Monetizing the app

This app gave me about $200-$250 in total during the roughly one year it was live. I used Google AdMob to monetize, showing ads at the bottom of the page without impacting the user experience. To be honest, that was not the best approach, since the user opened the app several times a day, but spent just a few seconds with it open. Maybe providing more premium features and charging them for it would bring more money than showing ads for a short period of time. Still, this brought me more money than I expected for such a small utility app.

Conclusion

Even small utility apps can hide challenges and real opportunities to learn. I'm very proud of this project, the reviews and how it behaved. I decided to remove it from the store just because the focus at that time was not on building new or expanding this app, and just the Apple license was half of the money earned with the app. Removing it from the store to clean up any maintainability time was the right choice to focus on other things like my new job at that time.