Case studies, screens and motion from projects I shipped. Where an animation is a pure function of time, it runs live here on the app's own curves at your display's full refresh rate: ported from SwiftUI and checked against it, or, for a web app, the same CSS timings and Motion springs it ships. Where it depends on the app's own views, it is a recording of the app itself.
Hold Shift for slow motion
Splitty
Shared expenses, split and settled. A SwiftUI app and its landing page.
Settled coinLiveEveryone is square: the two halves of the mark come back together into one coin.Amount displayLiveEach digit is its own view, so only the one that changed moves.SplashLivePicks up from the launch screen: one coin, cut and slid apart into the mark.LoaderLiveThe brand as a loading state: the halves meet and part again.ChartsLiveRanges, lenses and headings: the donut eases between them, every figure rolls to its new value.
Listas
Shared checklists in real time, opened by a secret link, no account needed. A Next.js PWA on a Rust API.
Ticking offLiveThe box pops and draws its check, the strike follows the text, and the row holds its place until both land before it sinks under the open ones.Live presenceLiveWho is here, who is typing and which item each person is on, all over the list’s own socket.Swipe to deleteLiveShort of the threshold the row springs back; past it, it leaves and collapses, and Undo brings it back to its place.ReorderLiveHeld by its grip, the row stays under the finger; each neighbour slides out of the way once the row passes its middle, and on release it settles into its slot.Someone else, liveLiveAna moves an item to the top, then swipes one away and takes it back. Her drags stay on her phone; Gabriel sees her colour on the row she touches, then each change landing as it reaches him.