This sounds exciting! I am sad I will miss FF this year (conflicts with App.js)
This sounds exciting! I am sad I will miss FF this year (conflicts with App.js)
I am very curious about all things optimization. How you optimized the library, what you optimized, how you measured performance, how you knew what bets to take. What techniques you used.
I appreciate when computer says please and thank you
I will be there too! Excited to see everyone in person!
Yesss
tchayen.com
Programming, gamedev, reinventing things from scratch, maths (computational geometry), lots of research
Then every couple months I ask ChatGPT deep research to find something. And it works great so far! I often end up on exact store page where I just have to make an order and I am done.
A use case for LLMs where they shine the most for me is doing research for non-urgent online shopping.
Sometimes I have very specific requirements, like Japanese rice cooker that cooks rice for a single person not a village and ships to Finland. Or a 5K IPS screen, ideally >60Hz
For me it's usually for simulations where low level code with manual memory control makes a difference between unusable and real time.
Not long ago I played with triangulations: tchayen.com/handmade-pat...
For the same data, the most optimized JS code I could write took 900ms, Zig version 25ms.
/// <reference types="vite/client" /> let wasm: { exports: { version: () => number; }; memory: WebAssembly.Memory; }; async function loadWasm() { const init = (await import("./bin/lib.wasm?init")).default; wasm = (await init()) as typeof wasm; console.log(wasm.exports.version()); } loadWasm(); if (import.meta.hot) { import.meta.hot.accept("./bin/lib.wasm?init", () => { console.log("🔄 WASM rebuilt, re-loading…"); loadWasm(); }); } console.log(new Date());
And this is all it took on the JS side.
function zigWasmPlugin() { const zigDir = path.resolve(__dirname, "zig"); return { name: "zig-wasm-watch", configureServer(server) { server.watcher.add(zigDir); server.watcher.on("change", (file) => { console.log(file, "changed"); if (file.startsWith(zigDir)) { exec("npm run wasm", (_err, _stdout, stderr) => { console.error(stderr); }); } }); }, handleHotUpdate({ file, server }) { if (file.endsWith(".wasm")) { const mods = server.moduleGraph.getModulesByFile(file); if (mods && mods.size) { return [...mods]; } } }, }; }
I have a 'wasm' command declared in package.json which compiles the binary and places it in web/bin. Plugin is listening for changes in zig/ and runs that command. Finally handleHotUpdate() notices that a *.wasm file changed and sends HMR to the browser.
Screenshot of the browser demonstrating HMR reload of the WASM module.
I don't know how I survived this long recompiling WASM binary after every change but I finally wrote a mini Vite plugin for HMR.
Now when I change anything and save the file, WASM module is automatically compiled and reloaded.
Wow! Excited about this
It's crazy how Cursor packs two opposite user experiences in one app. Tab autocomplete is reading my mind, while chat agent mode feels like trying to get the dumbest coder I have ever met to fix my code without giving him ability to run it.
I am slightly biased but this blogpost is great
Killer feature, would download
⚙️ Over-the-air updates made easy by @expo.dev team! Learn the ins and outs of EAS Update, including native fingerprints, preview deployments, and the latest JS API features at the App.js 2025 workshop.
🎟️ appjs.co/tickets#Work...
My watch told me my sleep goal was met but then I checked the app and turns out it included yesterday evening nap. Well, explains why I don't feel like my sleep goal was met
Great point! I can fix that
Thank you! It means a lot coming from you
Let me know your thoughts! I made so much progress this time to the point that I'd rather delete the last year's one. Feels completely surface-level in comparison 😅
But end of Feb 23 what timezone? CET? PT? You might be several hours late if you send at midnight your time!
That’s true. That’s also the case with the engine Sebastian Aaltonen is working on – they don’t use textures yet.
I read that some WebGPU contributors want to make bindless finally happen but that probably means it’s more than a year away.
Everything needed to re-create it can be found in this talk: www.youtube.com/watch?v=m3bW...
Check it yourself here: wasm-draw-stream.expo.app. Runs in 250fps on M3 Air. 120fps on Samsung Galaxy S25.
Requires WebGPU so it won't run on iPhones.
I was working on a WebGPU demo and decided to try how fast I can make it. Zig in WASM generates a buffer with command stream sorted to minimize GPU state changes.
This is 10k individual draw calls, unoptimized, no instancing, no render bundles. Every object is controlled separately.
Asked gemini for WebGPU setup with several cylinder models and orbiting camera. Got interstellar scene (unfortunately had to first spend 15 minutes to fix it).
Many of us from @expo.dev will be there
Friday is the day of hard decisions: which food that makes my tummy hurt should I order.
Today it will be… drumroll 🥁 … chicken wings