Color Swatch

July 9, 2017

Color Swatch stores and organizes colors from the camera.

Capture colors and view RGB from in realtime, store, organize and adjust color palettes, and share colors with your friends.

Available for iOS on the App Store!

Technical features:
– Real time camera video processing
– Core Data
– Table cell animation
– Social media sharing



iOS Deep Linking: URL Scheme Overview

October 11, 2016

If you are targetting iOS9+, you should consider Universal Links.

Deep links are links that can redirect to an app if you open them on your phone. They are powerful for sharing and leveraging apps as a content resource, as the links can open a specific screen. As such, deep links are growing in popularity, wielded in the never ending quest of cultivating users.

URL Schemes: A Serverless Past

Prior to iOS9, URL scheme deep linking was the main way to open and communicate with apps. URL schemes allow you to define custom parameters that allow the system to open your app. They are easy to implement and are defined entirely within your app, allowing developers to avoid the maintenance of pesky servers.

A common scheme is HTTP, which is used in web browsers: In, http is the scheme. In a custom URL scheme, you define the scheme and pass the url to your app. RFC 3986 defines Uniform Resource Identifiers syntax components as follows (though it is not required to follow this syntax):

The following are two example URIs and their component parts:
\_/   \______________/\_________/\_________/  \__/
|           |            |           |         |
scheme   authority      path        query    fragment

Interestingly, you cannot use http or https for the “custom” URL scheme in your app. These schemes will be claimed and handled by Safari. To use an http or https scheme, Universal Links will be necessary. This is a limitation because URL scheme links will not be launched when sharing in format such as e-mail: testapp://testdata may not be recognized and hyperlinked like http links are by many applications.

The URL is passed to your AppDelegate using an NSURL, using application:openURL:options as of iOS9. From there the source application can be verified and the url can be handled, at the mercy of the developer. Apple’s doc on Inter-App Communication explains the process by which the app is then launched:

"Waking a background app to open a URL".

“Waking a background app to open a URL”.

URL schemes are defined by your app so there is no guarantee it will be unique. Thus, caution should be used in passing sensitive data because it could be inadvertently used to launch another app. From Apple’s docs, there is no way to know which app will be preferred:

If more than one third-party app registers to handle the same URL scheme, there is currently no process for determining which app will be given that scheme.

While this seems like a scary drawback, using something specific, such as your app’s bundle (com.companyname.appname), will likely avoid this issue. Apple still can’t be sure where it’s sending you, so it will prompt the user before opening an app via a URL scheme deep link. The user experience will be stricken with an unfortunate alert.

A custom URL scheme being used to launch an app. In practice, this will be launched using openURL: or a hyperlink.

A custom URL scheme being used to launch an app. In practice, this will be launched using UIApplication’s openURL: or a hyperlink.

The user will be prompted to open a valid custom URL scheme.

The user will be prompted to open a valid custom URL scheme.

When no app with the custom scheme is found, nothing useful happens.

When no app with the custom scheme is found, nothing useful happens.











There is a solution: to prevent a prompt when the app is not installed, UIApplication’s canOpenURL: can be used to detect if an app can open the URL and provide logic to handle that case. Unfortunately, this creates additional work because you cannot depend on the resource you’re hoping to provide.


Though URL schemes are useful to launch other applications and very easy to implement, the interference of prompts, having to create a clickable hyperlink or launch from an app and looming possibility of same scheme collisions has this approach reeling. Universal Links were announced with iOS9 and capitalize on URL Scheme’s shortcomings. Stay tuned for the upcoming posts on Universal Links!


Developing Univore

September 27, 2016

Screen Shot 2016-09-07 at 11.37.00 AM

An app I developed, Univore, was recently released for iOS (you can also read the technical overview here)! Students (and dieticians!) seem to really be enjoying the recipes and simple instructions that Univore provides. It’s been wonderful to hear all the feedback.

When we were preparing for release, the Univore team organized for an article by the U of T MD Program to be released. This tells the origin story of the idea for Univore – but what about it’s development?!

I met Liz and Brandon while attending UHN OpenLab’s Open Rounds, a weekly forum to discuss current projects and new ideas. Liz and Brandon presented the Univore concept, but mentioned they were having trouble finding a programmer. “Hm…I’m a programmer”, I thought. After the meeting I introduced myself and got to know a little more about what they had in mind for the project.

Univore was created to assist with healthy eating choices.

Univore was created to assist with healthy eating choices.

Liz and Brandon had enlisted the design services of the extremely talented Karen Keung, who had already created much of the design for the app. It looked beautiful! The finished designs was a major selling point for me – it was much easier to visualize a great finished product, and having the UX and UI settled made my job a lot easier!

Despite the finished concept and designs, there were some challenges during development. I still had about a year left in medical school and had limited time to dedicate to development. The design, while exceptional, required extra work to implement some custom components. The late addition of the grocery list feature caused some interesting challenges (namely combining different custom quantities of ingredients, such as “a handful” and “a tablespoon”).

How many red peppers should I buy for "1/4 cup of chopped peppers"?

How many red peppers should I buy for “1/4 cup of chopped peppers”?

Fortunately, the app was finished by the end of the semester, in time for Brandon and Liz to organize a focus group for testing. The feedback sparked a couple last minute changes, the most important being the explanatory introduction screens, and we prepared for launch on August 22!

I find it incredibly gratifying to finish projects and see them grow in the wild; I’m very proud to see Univore on the App Store! Try it now!! And while the work is done for now, I’m already getting excited to start my next project!

Univore in the wild!

Univore in the wild!


Wine Snob

September 10, 2016

Wine Snob is your personal butler, judging bottles of wine to impress your friends!

Take a picture of your wine bottle and Wine Snob will read the label, generating a curated review based on the details. Sly, but poignant, the Wine Snob will convince friends, and enemies, that you are a remarkable connoisseur.

Please drink responsibly.
Technical features:
– In-app billing
– Advertising
– Camera usage
– OCR using custom pre-processing techniques
– Material Design transitions
– Firebase Analytics, Invites
– Proguard
– Social media sharing
– Background music


Home screen

Home screen

Camera acquisition of label

Camera acquisition of label



In-app Billing

In-app Billing














Available on Google Play!



August 22, 2016

Univore is an iOS app developed to teach how quick and easy it is to adopt healthy nutrition habits.

The iOS app includes a recipe generator based on common ingredients students have available, cooking tutorials, and much more. It’s a one-stop, hand-held solution to help students build confidence and experience as first-time cooks.


Technical features:
– Developed in objective-c
– CoreData
– Google Analytics
– Crashlytics integration and Beta distribution
– Custom widgets
– Custom design

Simulator Screen Shot Aug 16, 2016, 12.52.20 PM Simulator Screen Shot Aug 16, 2016, 12.21.09 PM Simulator Screen Shot Aug 16, 2016, 12.22.53 PM Simulator Screen Shot Aug 16, 2016, 12.24.05 PM Simulator Screen Shot Aug 16, 2016, 12.24.41 PM















Team Members:

Co-founder: Elizabeth Liao @lizzysfood
Co-founder: Brandon Tang @DrBrandonTang
Developer: Brad Kratky @bradkratky
Designer: Karen Keung
Mentor: Jen Recknagel
Mentor: Tai Huynh



July 28, 2016

BradColorPicker is an HSV/RGBA color picker written in Swift.

The picker allows selection of a color using an HSV palette, RGB sliders or hex code input. The tool can be launched using a view controller and closes once the user finishes selection.

Available on my GitHub.

Technical features:
– Released as a public CocoaPod
– Developed in Swift
– Custom widgets

Simulator Screen Shot Jul 27, 2016, 8.24.25 PMscreenshotSimulator Screen Shot Jul 27, 2016, 8.40.54 PM