About this drop
Everything that moves runs in one Reanimated useFrameCallback worklet on the UI thread. A raced Gesture.Pan and Gesture.Tap only write shared values; each frame the engine reads them, steps the spin (it follows your finger, coasts, then springs to a side) and the rock and flutter springs at 240 Hz, ray-casts a tap against every card plane, encodes the WebGPU passes and records the Skia frame that composites them. After 0.6 s of stillness it stops drawing. Skia v3 renders through Graphite on Dawn, and react-native-webgpu wraps that same device with importDevice, so the 3D passes and Skia share one queue and textures cross with no copy: a 2048 px shadow map from the sun, a 4x MSAA HDR scene pass, then a 41-tap bokeh depth of field, Khronos PBR Neutral tone mapping and sRGB encode, all in WGSL. Every postcard, front and back, is painted in Skia as an SkPicture, so there are no image assets, and scripts/check-rack.mjs proves no card ever touches another card or the rack. The JS thread only plays Pulsar haptic ticks and re-renders the HUD when the scene is at rest. The title blur is a local Expo module over iOS's private variable-blur filter: it renders nothing on Android and, being a private API, may draw App Store review attention. It needs a development build (npx expo run:ios), not Expo Go, and was built on Expo SDK 57, React Native 0.86 and Reanimated 4.5.