Preview


My role
I developed and maintained the iOS app and keyboard extension, including performance work and releases.
- Investigated flickering during web text input and shipped a mitigation.
- Reduced image and GIF memory usage and shipped custom photo themes in two weeks.
- Introduced Combine, Swift Concurrency, OneWay, and Pure DI, and maintained the release pipeline.
Detailed development notes
Timeline
2022.01.03 - 2022.07.15
2023.07.03 - 2023.10.03
2023.12.27 - 2024.09.30
My work
2023.12 - 2024.09
- iOS typing rewards launch
- Launched a rewards feature that lets users earn points by typing on the keyboard.
- Led the introduction of PureDI, Combine, and OneWay to support more features as we prepared to add rewards and turn the app into a super app.
- Web Input Flickering Mitigation
- Investigated flickering during web input, a problem affecting all iOS keyboard extensions that everyone said was impossible to solve. After persistent work, I found and deployed a solution. (World's first)
Before and after comparison (left: before, right: after)
- Combine Introduction
- Removed legacy code and made views reactive to prepare for future SwiftUI transitions.
- Introduced Pin&Flex Layout to the Keyboard Extension
- Introduced Pin&Flex Layout to the Keyboard Extension to improve performance, raising stability from the low 60% range to 98-99%.
- Contributed to the FlexLayout open-source project during this work.
- Medium article (KR)
Preview

- Managing multiple threads
- Gained experience writing thread-safe code with Modern Concurrency and GCD to use the limited resources of iOS keyboard extensions efficiently and improve performance.
- Swift Concurrency & OneWay Introduction
- Introduced Swift Concurrency with Alamofire and a networking abstraction for more flexible use.
- Introduced the MVI architecture OneWay to organize Concurrency code and separate View and ViewModel responsibilities. Combined it with PureDI to help build a testable environment.
- PureDI Introduction & Storyboard Code Removal
- Designed a protocol-based PureDI service container to make it easier to build a test environment for TDD, and removed Storyboard code as part of the implementation.
- Keyboard Autocomplete Feature
- Helped build and deploy keyboard autocomplete using UITextChecker.
- BaseViewController Introduction
- Introduced BaseViewController to standardize view classes and reviewed overall code style.
- AirBridge integration & deeplink cleanup
- Introduced Airbridge to replace the problematic Firebase dynamic link and organized deeplink and deferred deeplink logic around link schemes.
- Keyboard ASCII Art Feature
- Helped build and deploy the feature for sending ASCII art from the keyboard.
- CI/CD Pipeline Maintenance
- Maintained the CI/CD pipeline and updated and optimized its environment.
- Improved build speed by 20% through build caching.
- Maintained the CI/CD pipeline and updated and optimized its environment.
- Realm Dependency Removal
- Removed the heavy Realm library dependency from keyboards to reduce app size and improve keyboard performance.
- SPM Library Migration
- Migrated libraries to SPM in preparation for adopting Tuist.
- Other bug fixes and maintenance
2023.07 - 2023.10
- My Theme Feature Launch
- Built and launched My Theme in 2 weeks, letting users create custom keyboards with their own photos.
- Used image downscaling to stay within the keyboard's 50MB memory limit.
- Used image composition to create thumbnails.
- Studied and applied Gif optimization techniques.
- Touch Area Correction
- Visualized hitArea to identify incorrect touch areas, then adjusted view spacing to restore the intended behavior.
- CI/CD Pipeline Construction
- Rebuilt the deployment automation with Fastlane and Circle CI after errors stopped the pipeline from working.
- RxSwift Code Removal and Migration to Combine
- Migrated some RxSwift code to Swift Concurrency and Combine to follow industry trends.
- 2022.01 - 2022.07
- Managing the iOS app with Firebase
- Used Firebase Crashlytics to detect crashes when opening the app's charging station and identify how many users were affected, then prioritized and fixed the issue. The API was being called incorrectly in layoutSubviews(); I moved the update to the appropriate point in the lifecycle.
- Collected user events through Firebase and worked to use that data to validate added features.
- Used Remote Config to change survey links and control versions for forced app updates without going through app review.
- Gift/Request Features
- Developed features following the design guidelines to increase the purchase conversion rate for keyboard products.
- 2 weeks after launch, 34% of sales came through the gift/request features.
- Implemented using Firebase Dynamic Links.
- RxSwift Migration
- Converted some legacy code to reactive programming using Rx.
- A single page was managing too many asynchronous events at once. RxSwift offered a cleaner way to organize them.
- Keyboard Optimization
- Replaced array searches with hashing to speed up indexing and responses in the live theme keyword response feature.
- Partially moved UI drawing from AutoLayout to PinLayout & FlexLayout, allowing work across multiple threads instead of only the main thread and improving keyboard loading speed.
- Theme Free Trial Feature
- Popular themes previously required a purchase. I thought that payment barrier was reducing active users, so I added Google Admob to offer free theme trials through ads.
- Adding a ranking system
- Added a ranking system to the app to increase free trials and purchase conversion rates.
- A comparison of users who visited the ranking page with those who didn't showed about 5.5x more free trials and about 2x more purchases.
- NUX Improvement Update
- Improved the app's NUX flow to reduce user churn.
- Overall churn didn't decrease, but the theme purchase conversion rate rose from 3% to 10-15%, and conversion to the main screen after keyboard activation rose by about 8%.
- Replaced some legacy storyboard code with a code-based UI to prevent conflicts.
- Keyboard Emoticon Feature
- Added the ability to use emoticons from downloaded live themes to increase the value of live theme products that respond to keywords.
- Previously, a live theme's stickers were available only while that theme was applied. I updated the feature so users could select any sticker from their owned themes, even while using another theme.
- Displaying all stickers (photos) directly on the keyboard would exceed the iOS keyboard's 30MB memory limit and cause it to terminate. Memory use rose to critical levels with each collection view scroll. I implemented the sticker feature, which had been considered impossible because of memory issues, using image downprocessing and gif frame loading management.
- Overall iOS App Maintenance
- Learned the existing project structure during handover and took responsibility for new features and maintenance.
- Ran internal QA testing and handled deployment.