ducmai.me · LinkedIn · X · Viblo · Email
Some behaviour only feels possible inside a big native app: hero transitions, waveform scrubbing, frame-accurate video editing, a Node runtime with no server. I build that behaviour one layer below where product code usually stops, and ship it as open source.
As of 2026-10-12, from the public GitHub, npm and Viblo APIs. ↓ One layer down: L1 · Now
Since February 2024 I have worked on client performance for TikTok Search in Singapore: how fast the first screen appears, how smoothly results scroll, and what the image and video pipeline costs inside a very large iOS and Android app. I can describe the discipline; the numbers stay inside, which is why everything below is my own code.
A lot of that work sits on Lynx, and a regression rarely lives in one layer: the job is following it from a component, across the bridge, into Kotlin or Swift, and down to the frame that dropped. I also run AI agents like a small team, with the guardrails doing the real work.
Swift and Kotlin on React Native's New Architecture, with no animation on the JS thread. All of them are still maintained, which is the part most side projects fail.
The rest of the family
| Module | What it does | Stars | Installs / month |
|---|---|---|---|
| react-native-zalo-kit | The Zalo SDK for React Native. | 59 | 827 |
| react-native-pointer-location | Android's pointer-location developer overlay, as a module. | 3 | 1.7k |
| react-native-new-feature | A lightweight "What's New" screen for your app. | 20 | 102 |
| react-native-textflow | Native fluid text reflow. | 4 | 56 |
| react-native-tooltipster | Truly native tooltips. | 3 | 108 |
| ffmpeg-kit | A community-maintained rebuild of ffmpeg-kit for Android, iOS and React Native, with 16 KB page support. |
↓ One layer down: L3 · Runtime
Below the framework there is a runtime, and below the runtime there are syscalls, memory and wires. Boot the first one on vivari.run.
↓ One layer down: L4 · Rendering
The bottom of the stack: frame budgets, vsync, and what actually gets redrawn.
The lab: famous behaviours, rebuilt from first principles
- youtube-heatmap: YouTube's "most replayed" heatmap above the scrubber.
- youtube-video-preview: hover-to-preview thumbnails, the YouTube way.
- youtube-smooth-progressbar: a progress bar that stays smooth between time updates.
- InstagramImageGallery: Instagram's pinch, pan and paging image gallery.
- iOSCompass: the iOS Compass app, dial and haptics included.
- HardwareVideoDemo: blocking screen recording of hardware-rendered video, the way Netflix does it.
- twitter-hacking: taking apart Twitter's view-source prevention.
- devtools-frontend-demo: Chrome's own DevTools frontend, driven over Chobitsu.
- wasm-hybrid-build: one C codebase, a hybrid WebAssembly build.
Everything else lives on my repositories page.
A million article views on Viblo, none of it in English. It is an archive rather than a current signal: Docker, Kubernetes, micro-frontends and Vue, which is how a lot of Vietnamese developers first met those tools.
Working on browser runtimes, React Native internals, or something that has to hold at scale? Email me or find me on LinkedIn.
Watch a snake eat my contribution graph
How this page is made
Every image here is an SVG drawn by scripts/render.mjs: no GIFs, no JavaScript, no image service. Motion is CSS keyframes, the Geist font is subset to the exact characters each image uses and inlined, and with reduced motion turned on everything rests on its final frame.
The numbers come from the same public snapshot that ducmai.me refreshes every week. A scheduled workflow re-renders the images and this README from README.tmpl.md and commits the result, so nothing on this page depends on a third-party server when you view it.





