Inspiration

I was inspired to build Guap after having an annoying time shopping at a supermarket in Santo Domingo and having to constantly reload Google in not-so-great network conditions. I thought to myself, "it'd be really nice for my Apple Watch to do this..." and, well, here we are.

Guap is a minimal watchOS and iOS application that provides realtime (hourly) exchange rates for 170+ currencies/commodities/special units on your wrist or in the palm of your hand. It is inspired by minimal applications such as Onigiri - Minimal Timer (https://apps.apple.com/us/app/onigiri-minimal-timer/id1639917298?mt=12) and the world-renowned Clear (https://apps.apple.com/us/app/clear-minimalist-todo-lists/id493136154); apps with low-density interfaces that do one thing really well and feel good to use.

What it does

Guap converts between 170+ currencies. It works offline. It is powered by Open Exchange Rates (https://openexchangerates.org) the leading provider of exchange rates on the web. It runs on watchOS and iOS. Both applications contain feature parity and offer flexible weekly and monthly plans for a very low price.

How I built it

Guap is a native app built with SwiftUI. The backend is written in vanilla Javascript and entirely serverless, powered by Fastify on Vercel with Upstash used for distributed caching. A cron job is executed hourly and updates the Redis cache. Each response to the client is outfitted with a cache header containing the TTL of the cached data. The client refreshes data 8 minutes after every hour. This ensures the backend remains lean, scalable, and most importantly FREE (as in, free-tier). Each time the client receives new data, it stores it in a SQLite DB using Core Data for offline purposes.

As previously mentioned, in terms of design, Guap is heavily inspired by minimal low-density applications that allow some customization. Aesthetically it's inspired by the Air Max 97 sneaker and the Kazaa P2P software for the early 2000s. Despite this, it boasts a truly native interface that feels right at home in the iOS ecosystem. In keeping with the early 2000s theme, I created a number of medium-fidelity 3D models and use them across the UI. I also got a chance to use Veximoji, a little emoji flag Swift Package I wrote a few years ago (github.com/roz0n/veximoji).

I originally designed the Guap logo in 2021 after my first bout with COVID, I posted it on Dribble but never did anything with it: https://dribbble.com/shots/15122893-Guap-iOS-Currency-Converter

Challenges I ran into

  • Keeping everything running on the free tier (Vercel, Upstash, Open Exchange Rates)... an effective caching strategy was key.
  • Just as the RevenueCat documentation warns, StoreKit promo codes are pretty much broken in sandbox. I can't get the input field to show for some reason. I settled for a 15 minute timer on the application.
  • App Store Connect... it is a bleak, lonely place :(
  • Working full-time and building something like this outside work hours is an endeavor I may be getting too old for!

Accomplishments that I'm proud of

What I’m most proud of is that I built something that solved a problem I actually had -- regardless of how minute. It feels highly satisfying to actually finish something. Implementing the RevenueCat SDK and has gotten the wheels turning re: app-monetization and ASO. I feel a little bit rejuvenated regarding mobile development both as a side-hustle and as a craft.

Also, there was zero generative AI used in the creation of any visuals outside of the custom mineral emojis.

What I learned

I learned why it's important for mobile developers to release at least one app to the actual stores. I've been practicing mobile development for over half a decade now and I'd never released anything to either store (I've worked heavily with other distribution methods though.) Just dealing with app review in and of itself was an eye-opening experience.

From a technical perspective, I learned a metric ton about in-app purchases and caching. I'm also getting really good with the WatchConnectivity framework and watchOS development in general.

Looking forward, I hope to add crypto currencies and historical data such as charts. I was not able to complete development of the latter two before the deadline.

Getting "Sherlocked"

I've been made aware Apple added a currency converter to the calculator app in iOS 18. I honestly didn't even know about it until two days ago. Regardless, I feel there's a place for something like this to exist despite any new OS integration judging from what I've seen.

Built With

  • fastify
  • nextjs
  • swift
  • swiftui
  • upstash
  • vercel
  • xcodecloud
Share this project:

Updates