github.com/wonghanz

Wong Hanz

Systems & AIoT engineer — sensor to socket to screen.

Native mobile, embedded telemetry and agentic AI pipelines running in production: a transit terminal with 300+ daily riders, a 300-head livestock farm, and an exam-prep app with 100+ monthly students. This surface is real fluid — the profile README can only fake it.

Drag to disturb the water · click to drop · space to start droplet · turn the sound on and stay long enough for the sun to go down

🎮 Droplet

30 seconds of reflex. Every catch raises your combo up to ×8 — miss one and it resets to ×1.

×8 combolocal best
Press space →

🌇 The day arc

Time of day advances while you are here, and faster while you play. Golden droplets only appear once the light turns warm.

gold = ×5midday → night
Watch it set →

🎧 Spatial ocean

Not an audio file. A procedural swell plus HRTF-panned one-shots, so a ripple on the left of the screen happens to your left ear.

Web AudioHRTF panner
Sound on →

🪼 Mind the jellyfish

Pink and pulsing means do not touch. Stinging one breaks your combo and costs 20 points, so the risk is real.

−20 ptscombo reset
Learn the tell →

Under the hoodWhat is actually running

  1. Wave simulation on the CPU. A two-buffer height field solves the discrete wave equation (neighbours × ½) − previous at 240×N with 0.9715 damping and two substeps per frame, so ripples propagate and interfere instead of being a canned texture.
  2. Refraction from the surface gradient. The field uploads as a LUMINANCE texture; the fragment shader samples four taps to get a normal, then bends the light field by the local slope — that is where the glass thickness and the chromatic split come from.
  3. Specular tied to the sun. The light vector interpolates with the day phase, so the highlight direction, the caustic colour and the horizon band all move together rather than being a colour filter.
  4. Sound built from oscillators and noise. A looping filtered-noise swell with slow LFOs, and one-shots through PannerNode in HRTF mode, positioned by mapping screen coordinates into audio space.
  5. The game clock is wall time, not requestAnimationFrame. rAF is throttled to about 1 fps in a background tab, which would freeze a round mid-play; the rules run off a 60 ms interval and the render loop is only decoration.

Selected workThings in production

Eloquent Lab

Native iOS + Android exam-prep SaaS. WaveRider prosody scoring on AVAudioEngine, DeepSeek-graded CEFR essays, hybrid RevenueCat + AdMob monetisation.

100+ MAU−90% latencySwiftUICompose
Open source →

NodiGuard

Zero-trust local AI proxy for Cursor, VS Code and Aider. Intercepts leaked API keys, tokenises prompts on-device, and reclaims 16 GB of Ollama VRAM.

Leaked-key DLPPythonTLS
Open source →

Liquid Glass on iOS

Where this page came from: refraction shaders backported across iOS 13–18 inside a Telegram fork. Six OS generations, one material language.

This designSwiftMetal
Open source →

PlantX · CapriGuard

Champion, EcoRise Southeast Asia 2026. Agricultural telemetry cutting farm water 30% and lifting growth 50%, plus RFID livestock triage on a working farm.

EcoRise ChampionESP32Petrosains
All repositories →
Score0
Combo×1
Best0
Time30
DayMidday