Experience
2024 — Now
2024 — Now
Pittsburgh, Pennsylvania, United States
2022 — 2024
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
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
2020 — 2020
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
2019 — 2019
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
University of Waterloo
Bachelor of Computer Science
2016 — 2021
William Lyon Mackenzie Collegiate Institute
High School
2012 — 2016