Making Visual Codes

Visual Codes creates QR codes that anyone can scan using their iPhone camera app. Send links, add a contact or even connect to WiFi, just by scanning a code. Only the person who makes the QR code in the first place needs to download Visual Codes app; any iPhone or iPad running iOS 11 automatically scans the code through the native Camera.

That’s the pitch. Here’s the backstory. I have definitely mocked QR codes in the past so at face value, it’s a bit hypocritical to then go and make an app that centres around them as a concept.

However, what changed my view is iOS 11 integration of a QR code reader at the system level. Becoming a first-party feature helps a great deal and reducing the friction of using a QR code. No third-party apps to download and launch, users simply open the Camera (which is instantly accessible from the lock screen) and point it at the QR code.

The QR format space is messy; there isn’t really one official standard on how a message payload is encoded into a QR image. The design elegance of Visual Codes is that I picked Apple’s implementation in iOS 11 as the ‘standard’ to write against. I can promise to support what iOS does, and nothing else. I can test against the devices I own and comfortably address a large audience (any iOS 11 device).

If the generated codes work on other platforms, then that’s great. If they don’t, I’m not going against the app’s premise. Incidentally, most of the codes will work with Android which is a nice sweetener.

Visual Codes is a niche app with a couple of obvious use cases (like creating a QR code for your home WiFi network) and then a wide space of potential niche applications. Marketing such an abstract generic utility is hard. The app is freemium for precisely that reason: people can try it out without having to decide if it is worth paying for.

The app was a fun project to make. I pushed hard to make the 1.0 not require a web connection at all. It’s refreshing to work on apps that don’t need to worry about networking; there’s just a lot of boring stuff that I didn’t have to concern myself with. Instead, I used the extra development time to experiment and play around with features like SiriKit and rich keyboard list navigation.

I think that was a good decision. If I had forced myself into networking for the 1.0, I might not have ever shipped it. I probably would have got bored debugging a synchronisation issue and given up on it entirely. The flexibility to abandon something is a blessing and a curse when it comes to side projects.

Of course, the most-requested feature since the app launched yesterday is cross-device iCloud syncing of libraries. This is something I obviously want to add. At least now, I have the motivation of a (partially paying) user base to satisfy when I inevitably hit a wall in the CloudKit implementation.

In terms of the interface design, my limited resource budget stunted some of the things I wanted to achieve. I scrapped plans for a custom iPad layout (likely revolving around a grid view for the main screen rather than a stretched-out list) and limited myself to only small tweaks for the tablet size class. My compromise was to make the app look good on the iPhone and in the iPad floating multitasking window.

The transition from code library to detail view is hacked together but it looks great and smooths out the navigation experience. I’m really proud of the custom Print interface with dynamic previews, I think it looks great and exposes a lot of advanced functionality without getting lost in configuration panes.

A secondary motivation for releasing Visual Codes was to have a shipping app that uses my open-source frameworks, dogfooding as it were. Until this year, I had no open-source repositories to my name. Now, I have two meaningful contributions to the open-source iOS community in the wings. Although I am yet to formally announce them, they aren’t exactly hidden so if you are that interested you can check my Github profile. I want to properly ‘reveal’ one of them later this week.

In general, response and media coverage of Visual Codes was way higher than I ever expected it to be. I am really grateful to anyone that downloaded it, and especially thankful to those that have already bought the upgrade. I am aware of some teething problems in the 1.0 release (people use really weird names for their WiFi networks!) but I’ve already pushed a bug fix update through to App Review. Such is the life of an app developer. I love it.