Pittsburgh, Pennsylvania, United States
2022 — 2024
Toronto, Ontario, Canada
Bunch Unicorn:
Implemented UI + P2P synchronization logic for watching YouTube together in a party
Lead the clubs project, which allows up to 50 people to join a club and chat
◦ Worked on club creation + deletion flows, club presence, club roles, club chat, push and in-app notifications, analytics
Worked on status profile customizations (weather, emote, pose)
Added AI avatar generation through text (dictation), selfie, gallery upload, Bitmoji
Implemented games tab and catalog, including search and all related screens to select and launch into a game from a party
◦ Created app installation scanner and tracker on both platforms to suggest games
Implemented space tab, including search, recent spaces, joining party by code
◦ Includes gRPC API, repository, view model, view, caches
Added batch DB writes to improve search performance
Added temporary and permanent ban logic as part of toxicity model
Created in-app review flow for iOS and Android
Built expanded and minimized video overlay + party controls
Built parental controls system to control various actions kids can take in Bunch
Created a PoC to update Bunchie status and pose based on live status update from Discord and Line
Bunch Game SDK:
Lead the iOS SDK that provided voice and video chat integration with games, used by Miniclip.
Designed every layer, including API, persistence, repository, view model, UI
Added 70% test coverage for all relevant business logic
Added programmatic controls for video bubble, and expandable / collapsable state
Implemented Session handover between SDK and Unicorn app
Added automatic party restoration in boot path
Wrote extensive sample app for testing out all SDK features
Built presence system to notify friends when user is playing the game
Bunch iOS Widget:
Lead the widget extension project to view friend statuses from home screen
Added all networking logic (retrier, auth), custom SwiftUI components
2021 — 2022
Toronto, Ontario, Canada
Bunch Presence SDK:
Implemented the iOS UI + KMM business logic for most of the presence matrix between the user and a friend, handling the following combinations:
◦ online / offline, alone vs in a party, public vs private party, full party
Refactored business logic out many existing friend list views and into KMM view models, conforming to MVVM
◦ Increased testability across iOS and Android by leveraging JUnit and Mockk for view model tests
Introduced UserDefaults to the SDK for persisting configuration options, and Keychain for storing auth credentials
Rewrote existing event bus architecture:
◦ Fixed retention cycle issues due to events having reference to queue
◦ Implemented event logger as event observer
Set up CI/CD pipeline with BitRise, with automated notifications to Slack
Added various in-app and push notifications (Eg. Friend online, etc.)
Bunch Palette:
Lead the project to create a CocoaPod for Atomic Design based design system
Allows testing components in isolation, rapidly iterating without compiling KMM
Supports dark mode, standardizes constraint spacing, colors, fonts, etc.
Has both SwiftUI and UIKit support, with SwiftUI extensions to bridge to KMM flows
Used to prototype party overlay with dynamic video feed layout
Bunch Unicorn:
Implemented the original onboarding flow, with support for Apple login, phone number auth, Facebook auth, and Snap login. Supports Firebase deferred deep link for express onboarding
Added friends list feature, which includes ranking, search, presence session events, profile page, suggested friends, caching for search results
Bunch Chromecast Extension:
Allows friends to play games on their devices, while having the party’s video streams displayed on the TV similar to Jackbox.TV
Ethereum Wallet Connect:
Built as an internal hackathon project, allows users to connect their Ethereum wallets to Bunch so that we can read transactions into Bunch avatar clothing
Toronto, Ontario, Canada
Returned to TunnelBear again (surprise!?) to design more elegant solutions and solve problems. This time, with a bigger emphasis on CI and macOS.
TunnelBear iOS + macOS:
Replaced MirrorDiffKit with a custom solution to dynamically identify and log differences in AppState. Uses code generation via Sourcery framework.
Wrote extensive unit tests for VPN connection queue, Keychain accessor, and Store + Actions (Redux) systems
◦ Discovered and fixed various miscellaneous + control flow bugs in connection queue
◦ Fixed existing logout issues related to API keychain token not deleting. The parameter list in SecItemDelete was incorrect.
Created FilePersistence, a disk persistence system that supports custom crypts (AES256-CBC), serializers, and IO managers to persist models without UserDefaults or Core Data
Refactored all App identifiers, bundle identifiers, and app metadata into a standardized library
Updated CocoaPods + codebase to follow updated dependencies (Alamofire, BrightFutures, CocoaLumberJack, TrustKit, etc)
Updated analytics architecture to support multiple frameworks. Re-added AppsFlyer and added Kibana integration
◦ Created EventsManager to synchronize analytics events, preventing race conditions caused by receiving new events while uploading old events
Restructured persistence system to fallback to API calls on disk load failure during app launch
TunnelBear macOS:
Redesigned launch flow to use window coordinators
◦ Split onboarding responsibilities into LoginCoordinator, OnboardingCoordinator, and EmailVerifyCoordinator
Rewrote notification logic in macOS without BrightFutures, with support to receive in-app messages via MessageService
Fixed all AppCoordinator window animation bugs
Implemented CloudFlare captcha support
CI:
Integrated SwiftLint as CI job, running only on branch diffs against master on commit
Decreased build time (~3 minutes) by only running tests affected by branch changes, as well as dependency tests
Toronto, Canada Area
Returned to TunnelBear after McAfee acquisition to work on both iOS VPN app "TunnelBear" and "PolarBear" VPN SDK for McAfee clients. I became the lead developer for June - July on the TunnelBear iOS project, responsible for shipping and maintaining v3.0 - v3.1.2. This represents the biggest update in TunnelBear history, with the app being completely re-platformed with "PolarBear" SDK.
PolarBear SDK + Networking (Swift):
Added local notification support and connection timeline feature to SDKDemo app
Added connection error handling feature to PBTunnel + SDKDemo
Added send message capability to TunnelBear SDK
Updated iOS client to support BlueBear v2 gateway, with lots of BlueBear connection / synchronization logic improvements
Fixed connection issues (ex. Removing incorrect reachability logic from certain parts of codebase, etc.)
Fixed critical bug which continuously spammed analytics endpoint with app state refresh
TunnelBear iOS (Swift + Objective-C):
Implemented custom app rating framework to replace deprecated ”iRate” dependency.
Rewrote app migrator to properly handle account and connection state transition for existing v2.x users
Rewrote existing in-app messaging feature to support re-platform infrastructure
Standardized logging, remove all print / NSLog, introduce dynamic logger injection between modules
Implemented support for multi-part form data requests for uploading logs
Implemented a fallback log upload solution with custom cryptosystem to encrypt logs
Fixed re-platform crashes (TBIntent, heightForLabel crash)
Rewrote entire logging library in Swift, with cleaner code + decoupling other parts of codebase
Removed "objective-zip" dependency framework which fixes macOS unarchiver issues with zipped logs
TBMapKit improvements and fixes (Smoother panning, fix incorrect animation states)
Education
2016 — 2021
University of Waterloo
Bachelor of Computer Science
2016 — 2021
2012 — 2016
William Lyon Mackenzie Collegiate Institute
High School
2012 — 2016