Media that behaves
A video player with subtitles, Vimeo, fullscreen and resume, and audio courses that play on into the next chapter with lock-screen controls.

The Expo app built for the web, signed in to my own account from a read-only snapshot.
Skillify sells courses, books and audiobooks, and runs white-label learning portals for partners. I joined when the app was a scaffold and became its main developer.
My part. 70% of the app's commits; 35% of the web and 49% of the CMS. Media players, learning screens, streaks, subscriptions, push and analytics are mine.
−23%
mobile LCP on the web (8.3 → 6.4 s)
Source: Lighthouse lab
−11%
app cold start on iPhone 11
Source: QA report
−5.4 MB
app download size
Source: QA report
A video player with subtitles, Vimeo, fullscreen and resume, and audio courses that play on into the next chapter with lock-screen controls.

An AI learning-path onboarding, streaks with celebrate, restore and share, a diamond store, subscriptions through RevenueCat, leaderboards and a badge collection.

A web lesson player with custom subtitles, double-tap seek and a mobile unmute prompt; the web's account pages moved to server rendering on Next 16 with the React Compiler.

The learner website, built from its source and signed in to my own account from a read-only snapshot.

Screen recording
After a timeout, a read counts as 'not charged' only 60 seconds after the POST, so a late server success never meets a second tap.
A failed or hung keychain read becomes 'unknown' and retries instead of signing the learner out, and new tokens stay readable after the first unlock.
A single-flight refresh: the first caller refreshes and every other request and tab awaits the same promise, so rotating tokens never race.
Credit. The app scaffold and UI library, the multi-tenant domain system and most of checkout were built by teammates.