Skip to content
Builds
Native Lab experiment, designed and built solo

A wave of light when money moves

When money arrives a warm wave of light rises behind the glass and the balance rolls as it passes; send money and a cool one washes back down.

React Native Skia · Reanimated · Expo Glass Effect · Expo UI (SwiftUI) · Expo Sensors · Expo Haptics

1Demo

  • The balance lands at $9,867 as the warm wave passes

Scripted simulator take with sample money and generated faces: the tilt and the tap are scripted. Not yet tested on a phone.

2Flow

  1. 1Tilt the phoneYouthe card's foil band slides with it
  2. 2Mom sends $1,217Appa glass notice drops in with a soft haptic
  3. 3A warm wave risesApplight washes up behind the tiles; as the crest crosses the balance it rolls to $9,867, with a success haptic
  4. 4Tap Dad's faceYou$200 goes, with a light tick
  5. 5A cool wave washes downAppthe balance rolls to $9,667 as the crest passes, with a firm tap
Money in rises warm. Money out washes down cool.

3How it fits

System
send /receivescripted tapscripted tilttiltuniformsrefractedfrontland(delta)arrived / sentYoutap a faceDemo scriptdemo-script.tsCore Motionuse-tilt.tsWave timingfront · dir · amp · warmCard foilshaders.ts · cardEffectWave shadershaders.ts · waveEffectCrest checkuseAnimatedReactionHapticsfeedback.tsLiquid GlassGlassView tilesBalanceNumericText · SwiftUI
Shared values drive two shaders. The number waits for the crest.

4Code

  const balanceY = insets.top + 150;

  // The new balance lands when the crest of the wave passes the number.
  const land = useCallback((delta: number) => {
    setBalance((b) => b + delta);
  }, []);
  useAnimatedReaction(
    () => (front.value - balanceY) * dir.value < 0,
    (passed, previous) => {
      if (passed && previous === false && pending.value !== 0) {
        const delta = pending.value;
        pending.value = 0;
        scheduleOnRN(land, delta);
        scheduleOnRN(delta > 0 ? feedback.arrived : feedback.sent);
      }
    },
  );

  const wave = useCallback(
    (direction: 1 | -1, delta: number) => {
      dir.value = direction;
      warm.value = direction === 1 ? 1 : 0;
      pending.value = delta;
      front.value = direction === 1 ? height + 260 : -260;
      amp.value = withSequence(withTiming(1, { duration: 200 }), withTiming(1, { duration: 1700 }), withTiming(0, { duration: 900 }));
      front.value = withTiming(direction === 1 ? -420 : height + 420, {
        duration: 2600,
        easing: Easing.bezier(0.25, 0.1, 0.25, 1),
      });
    },
    [amp, dir, front, height, pending, warm],
  );

Tapping doesn't change the number. A reaction on the UI thread waits for the crest to cross the balance, then lands it with the haptic.

5Decisions

  • Landing the balance when the crest crosses it over updating it on tap

    the digits roll at the moment the light reaches them

  • Real Liquid Glass tiles over a faked blur

    the glass refracts the wave for free, so the effort goes into timing

  • SwiftUI's numeric text through Expo UI over a hand-built rolling counter

    it is the system's own digit animation, not an imitation of it

  • One wave, warm in and cool out over a different effect for each event

    one effect timed to one meaning: money in, money out

More builds

  • Dragging a bottle of Chianti off the receipt onto Everyone

    Split the bill by dragging

    Drag each item off the receipt onto whoever had it, and their share rolls up, service included.

    Native Lab experiment, designed and built soloDemo · Flow · System · Code

    24 Oct 2026

  • Buddy cheering the last task with confetti

    A mascot rigged in code, not animated

    A to-do list mascot who watches your finger, giggles when poked, flies when flung, leans when you tilt the phone and cheers your last task.

    Native Lab experiment, designed and built soloDemo · Flow · System · Code

    23 Oct 2026

Meer's mascot, waving a peace sign

Have an app in mind?

Tell me what you're building. Replies within 24h. It's in Chittagong.

Booking new projects for Q4

Free 30-minute call

Talk through your app with me. You leave with a plan and a fixed price.

Video callShown in your time zone in Chittagong