It's pronounced vanilla-gee | Author of Mediabunny and Marble Blast Web. Love working on technically challenging projects that bring the best out of the web.

Joined July 2014
235 Photos and videos
Pinned Tweet
Mediabunny 1.42.0 is now out, adding THE most requested feature: full read/write support for HLS! 🚀 It's truly a game changer for client-side media processing. Here, I'm creating 5 renditions from a 40-second video in ~10 seconds, fully client-side, without a transcode server:
14
17
267
55,927
My custom WASM ProRes decoder is able to decode 8 (eight!!) simulatenous 30FPS 1080p ProRes HQ streams in the browser. Overkill for most people, but a great stresstest! There's still some choppiness, but that's caused by the canvases and not the decoder. I'll investigate.
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
3
5
101
6,999
I use this script for all of my TypeScript libraries. It goes through the entire project and throws if it can find any symbol that does not have a docblock attached to it. This FORCES me to document every last thing, and if I don't, the deploy fails.
6
1
84
6,424
My approach actually wasn't optimal. Turns out that esbuild unconditionally escapes all control characters no matter what. Unescaped control characters in JS strings are totally valid, so I adjusted my build plugin to circumvent this. Bundle size is even smaller now!
The final JS bundle looks absolutely fucking mental (it is valid JavaScript!!)
1
1
42
3,850
The only problem with this approach: Errors on functions that return void. People don't check the return values on those and would therefore miss the error completely. A solution I can think of is a TypeScript linting rule like "no-ignored-return-values" or smth like that.
For my ProRes decoder library, I'll be trying out "errors as values" on the TypeScript side for the first time. I think it's quite elegant!
4
1
20
2,124
Oh come on
Learned about "Cross-Origin-Embedder-Policy: credentialless" today and it is amazing!! It enables powerful features like shared-memory multithreading WHILE still supporting cross-origin resources like images or videos! Only condition is that those don't require cookies to load.
5
6
115
9,928
Learned about "Cross-Origin-Embedder-Policy: credentialless" today and it is amazing!! It enables powerful features like shared-memory multithreading WHILE still supporting cross-origin resources like images or videos! Only condition is that those don't require cookies to load.
2
1
40
12,972
Deno is such a beast, will definitely be using it over Bun for my next TypeScript backend. Bun's become too opinionated for my liking.
Deno 2.8.3 is out! Deno.serve() is faster: we shipped a new HTTP/1.1 fast path, plus fixes for streaming bodies, header handling, and compression negotiation. Also a big LSP cleanup, 170 fixes in total. `deno desktop` is coming soon!
9
4
148
17,718
The final JS bundle looks absolutely fucking mental (it is valid JavaScript!!)
The world's fastest ProRes decoders are developed in a McDonald's
6
2
122
20,693
I am inlining both the WASM and the worker code as raw bytes instead of Base64. Usually you'd expect uniformly-distributed bytes to do worse than Base64 (1.5 bytes on average in UTF-8), but WASM skewes HEAVILY towards bytes <= 127 so this is worth it. 25% smaller gzip size.
4
34
1,143
My decoder runs best with shared-memory multithreading which requires certain headers to be set. Setting them isn't hard but they aren't on by default, so, my question: how should my library behave? 1. Throw an error if the headers aren't set, forcing the user to engage with the problem. To fall back to the slow path, they must set an option explicitly. 2. Automatically fall back to the slow path but show a warning in the console. Less friction, but users might miss the warning entirely and get only a fraction of the potential maximum performance.
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
13
36
5,223
18 kB gzipped bundle size btw
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
46
1,401
Another instance of Google sucking. There's a much better match for this in the current Vite docs, but it decides to show me the v3 docs instead??
1
39
2,722
For my ProRes decoder library, I'll be trying out "errors as values" on the TypeScript side for the first time. I think it's quite elegant!
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
4
1
34
4,318
Even if you remove the context, the video makes me feel... something. Makes me appreciate the complexity of the world. Very well done
Introducing Claude Fable 5: a Mythos-class model that we’ve made safe for general use. Its capabilities exceed those of any model we’ve ever made generally available.
3
1
21
1,302
The world's fastest ProRes decoders are developed in a McDonald's
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
6
131
24,129
Vanilagy retweeted
why am I not seeing more hype about this? do you understand what this means? In browser ProRes decoding with mediabunny is faster than NATIVE ffmpeg. NATIVE FFMPEG!!! NATIVE!!!!!
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
1
18
921
When your decoder makes your laptop hot to the touch, you know you made a proper decoder
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
3
66
3,229
Vanilagy retweeted
Challenge every assumption 🤯
After adding shared-memory multithreading to my ProRes decoder, it now decodes a 130-frame 1080p video in ~200ms, right in the browser. This is 3x faster than multithreaded NATIVE FFmpeg, and 60% faster than Apple's hardware ProRes decoder. Relentless optimization pays off :)
1
9
984
Next one
This is one of those areas of software where bugs lead to kinda cool-looking results
1
21
797
This one is wild
I really like this one
2
18
537