Sign in

Surma

@surma.dev
3.2K followers 88 following 64 posts

DX & monorepo at Shopify. Craving simplicity, finding it nowhere. Internetrovert 🏳️‍🌈 He/him.

PostsRepliesMedia
Surma @surma.dev · 28/05/2026
This is what I have been working on! Shopify’s monorepo “world”, its nixification, building our Slack-based agent River and now generalizing River’s underlying agentic sandbox infrastructure called Aquifer. Finally I got someting I can share about it! shopify.engineering/under-the-ri...
shopify.engineering
Under the River (2026) - Shopify
What it took to ship our Slack-native agent River, lessons learned, and the substrate that runs beneath it. Co-authored by River.
151
Surma @surma.dev · 05/03/2026
`builtins.wasm` is now a (experimental) thing in @determinate.systems’ nix, with a PR open for upstream nix. This lets you extend the nix language by compiling C/C++/Rust/etc into safely sandboxed, platform-independent plugins! determinate.systems/blog/builtin...
determinate.systems
A new chapter for the Nix language, courtesy of WebAssembly
Determinate Nix now supports Wasm functions in Nix expressions, bringing a range of new possibilities to the Nix ecosystem
250
Reposted by Surma
ashley williams @agdubs.bsky.social · 16/10/2025
do you like geology puns and have an unhealthy obsession with package management? 🌋📦 we’re building a nix-based monorepo build system (in Rust!) at Shopify and we’re hiring. global, remote, high-autonomy. DMs open. www.shopify.com/careers/soft...
shopify.com
Software Engineer - Monorepo Systems (Rust & Nix)
ARE YOU READY? Join the fully-remote rocketship. Find your next quest to make commerce better for everyone. Unlimited growth. Crafters and hard workers only. Apply within.
1131
Surma @surma.dev · 16/10/2025
I have been working on the nix & Rust codebase that builds Shopify’s monorepo, and there’s so much left to do that we need help. If you are interested, apply here to join us! DM me if you have questions! www.shopify.com/careers/soft...
shopify.com
Software Engineer - Monorepo Systems (Rust & Nix)
ARE YOU READY? Join the fully-remote rocketship. Find your next quest to make commerce better for everyone. Unlimited growth. Crafters and hard workers only. Apply within.
1173
Reposted by Surma
Jake Archibald @jakearchibald.com · 16/10/2025
I dug into progressive image rendering and found a bunch of common assumptions aren't quite true. ➡️ JPEG & WebP progressive-renders worse in Safari ➡️ AVIF _does_ support progressive ➡️ But JPEG XL in Safari doesn't ➡️ JPEG XL decodes much slower than AVIF ⬇️ and more jakearchibald.com/2025/present...
jakearchibald.com
The present and potential future of progressive image rendering
Exploring progressive image rendering across JPEG, PNG, WebP, AVIF, and JPEG XL.
1517340
Surma @surma.dev · 09/09/2025
You know your JS13k submission is going well when you have to resort to `btoa` and other seemingly stupid hacks to get below the file size limit.
190
Reposted by Surma
ashley williams @agdubs.bsky.social · 06/09/2025
if this type of thing makes you say “this is cursed af, where do i sign up” DM me, we’re looking for some teammates
271
Surma @surma.dev · 04/09/2025
Nix friends: How terrible is this idea? I added `builtins.runWasm` to nix, allowing you to call out to Wasm. The Wasm is reset every time, so the functions remain pure. This gives you a (performant?) escape hatch for things that Nix is missing. E.g parsing YAML (here: via Rust)
180
Reposted by Surma
Jake Archibald @jakearchibald.com · 02/09/2025
📝 Making XML human-readable without XSLT. Turns out, JavaScript works pretty well! jakearchibald.com/2025/making-...
jakearchibald.com
Making XML human-readable without XSLT
JavaScript is right there.
67414
Reposted by Surma
Jake Archibald @jakearchibald.com · 31/07/2025
Starting my new role on Monday. Could be anywhere.
Me, sitting behind a cuddly toy of a fox. Ok it's obviously Firefox.
4441114
Reposted by Surma
Rob Palmer @robpalmer.bsky.social · 30/07/2025
ECMAScript excitement 😉 Congrats to @bakkot.com on advancing UInt8Array ↔️ Base64/Hex to Stage 4 at TC39 this week 🎉 UInt8Array.prototype. toBase64 toHex UInt8Array. fromBase64 fromHex It lets you convert directly between binary data and Base64/Hex strings 👍
let arr = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);
console.log(arr.toBase64());
// 'SGVsbG8gV29ybGQ='
console.log(arr.toHex());
// '48656c6c6f20576f726c64'
let string = 'SGVsbG8gV29ybGQ=';
console.log(Uint8Array.fromBase64(string));
// Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100])

string = '48656c6c6f20576f726c64';
console.log(Uint8Array.fromHex(string));
// Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100])
1409
Reposted by Surma
Alex Russell @infrequently.org · 17/07/2025
I spent hours and hours trawling through the sites of some of the world's best web developers, and despite the horrors I regularly experience in my daily work in Big JavaScript Territory, what I saw left me hopeful: infrequently.org/2025/07/links/
infrequently.org
Links? Links! - Infrequently Noted
Alex Russell on browsers, standards, and the process of progress.
68219
Surma @surma.dev · 10/07/2025
Convince me I am wrong: This should not be a type error, right? - I asserted it’s an object - I am using `?.` for property access www.typescriptlang.org/play/#code/G...
1150
Reposted by Surma
Jake Archibald @jakearchibald.com · 17/06/2025
CSS uses a complex algorithm to decide how to animate transforms. If you get it wrong, as many folks do, you end up with an unnatural animation. Here's how it works, and how to avoid the pitfalls. jakearchibald.com/2025/animati...
jakearchibald.com
Animating zooming using CSS: transform order is important… sometimes
How to get the right transform animation.
1428454
Surma @surma.dev · 17/06/2025
📝 First blog in a long time! I always like “flow-based” programming, and it’s a very powerful paradigm. LangGraph lets you codify complex workflows as graphs, and also integrates really well with LangChain, if your workflow is LLM-driven. surma.dev/things/langg...
surma.dev
LangGraph for complex workflows — surma.dev
I may be late to the party, but LangGraph lets you build complex workflow architectures and codify them as powerful automations. Also LLMs, if you want. But you don’t have to!
1546
Surma @surma.dev · 28/03/2025
Unexpected dangers of vibe coding: Somehow git ended up tracking its own .git folder and now I can't commit anymore :3
3191
Surma @surma.dev · 20/01/2025
Folks who know their way around the TypeScript type checker, I need help: gist.github.com/surma/be14ca... How do I figure out what types the type parameters have been bound to given a `CallExpression`? I know the answer is in `resolvedSignature.mapper`, but that’s not a public API.
gist.github.com
typeargs.ts
GitHub Gist: instantly share code, notes, and snippets.
120
Surma @surma.dev · 18/01/2025
Wait, am I dumb? What does NodeJS' WASI implementation only accept file descriptor numbers for stdio? Why don't they allow a Readables/Writables? How are you supposed to capture the output of a WASI module? nodejs.org/api/wasi.htm...
nodejs.org
WebAssembly System Interface (WASI) | Node.js v23.6.0 Documentation
210
Reposted by Surma
Jake Archibald @jakearchibald.com · 15/01/2025
🔊 It's new OTMT time! Me and @surma.dev chat through some newer View Transitions features that have recently landed in browsers, and some things that might land this year. ⬇️ Pop this in your ears ⬇️ offthemainthread.tech/episode/new-...
offthemainthread.tech
New View Transition Stuff - Off The Main Thread
Recently added stuff, and ideas for the future
810214
Reposted by Surma
Una Kravets @una.im · 07/01/2025
Ooh just caught this #OTMT episode on customizable select 😎 Always love to hear @surma.dev and @jakearchibald.com chat about the web and especially the features I’ve been working on for the past few years 🥰 offthemainthread.tech/episode/styl...
offthemainthread.tech
The new stylable <select> element - Off The Main Thread
And 10 other features we got along the way
0646
Reposted by Surma
Surma @surma.dev · 16/12/2024
I apologize for splitting the last OTMT episode into two parts. It was sincerely unplanned. 🎧 Part II of the TC39 Drama 🌶️ Roundup is now out! In this one, I talk to @jakearchibald.com about JS0, which proposes to split JavaScript into two specifications. offthemainthread.tech/episode/tc39...
offthemainthread.tech
TC39 Roundup Drama Edition Part II: JS0 and JSSugar - Off The Main Thread
Splitting JavaScript into two languages
4353
Surma @surma.dev · 16/12/2024
I apologize for splitting the last OTMT episode into two parts. It was sincerely unplanned. 🎧 Part II of the TC39 Drama 🌶️ Roundup is now out! In this one, I talk to @jakearchibald.com about JS0, which proposes to split JavaScript into two specifications. offthemainthread.tech/episode/tc39...
offthemainthread.tech
TC39 Roundup Drama Edition Part II: JS0 and JSSugar - Off The Main Thread
Splitting JavaScript into two languages
4353
Surma @surma.dev · 03/12/2024
🎧 A brand-new OTMT episode should be in your podcast players by now: The TC39 Roundup 🌶️ Drama Edition — Part I I talk to @jakearchibald.com about the TC39 Structs proposal and how it is a big step towards shared-data multithreading in JS. offthemainthread.tech/episode/tc39...
offthemainthread.tech
TC39 Roundup Drama Edition Part I: Shared Structs - Off The Main Thread
Sharing JS objects between worker and main thread
3365
Reposted by Surma
Srijan Paul @injuly.in · 25/11/2024
An average day spent inspecting WASM binaries
3174
Reposted by Surma
Jake Archibald @jakearchibald.com · 18/11/2024
🔊 ICYMI: @surma.dev talked through Nix in the last OTMT, comparing it to other build systems we'd looked at in previous episodes offthemainthread.tech/episode/nix/
offthemainthread.tech
More build tools: Nix - Off The Main Thread
and nixpkgs and NixOS and maybe even the web
0316
Surma @surma.dev · 29/10/2024
Get your 👂ears ready for a brand new OTMT episode! A while ago we talked about Bazel, and now it's time to take a closer look at Nix! How does it work? Is it any good for web development? In this episode, @jakearchibald.com and I try to provide answers. offthemainthread.tech/episode/nix/
offthemainthread.tech
More build tools: Nix - Off The Main Thread
and nixpkgs and NixOS and maybe even the web
3314
Surma @surma.dev · 26/10/2024
I love what keybr.com thinks Rust code looks like
190
Surma @surma.dev · 21/10/2024
ICYMI: In the latest episode of OTMT @jakearchibald.com told me all about the new, completely stylable <select> element, and the 10 underlying web platform features that were spec'd to make this possible. offthemainthread.tech/episode/styl...
offthemainthread.tech
The new stylable <select> element - Off The Main Thread
And 10 other features we got along the way
0246
Reposted by Surma
Jake Archibald @jakearchibald.com · 08/10/2024
🔊 We're finally getting a fully stylable <select> element! Me and @surma.dev dive into the details, including 10 web platform features we got along the way. ⬇️ Listen here ⬇️ offthemainthread.tech/episode/styl...
offthemainthread.tech
The new stylable <select> element - Off The Main Thread
And 10 other features we got along the way
1265
Surma @surma.dev · 07/09/2024
Still discovering new shell tricks. TIL: Substitutions. `cmd <(cat file)` invokes `cmd` with the first parameter being a named pipe (e.g. `/dev/fd/22`) which contains the contents of `file`. Example use-case: You wanna diff two files, but they are binary so need disassembling
0100
Surma @surma.dev · 06/09/2024
Tried myself at something new: A video! 📺 Nix explained from the ground up What is Nix? And how does it build software in a completely deterministic way? www.youtube.com/watch?v=5D3n...
youtube.com
Nix explained from the ground up
YouTube video by Surma
060
Reposted by Surma
Jake Archibald @jakearchibald.com · 30/08/2024
🔊 Chrome folks are experimenting with an API that exposes a built-in LLM. Could something like this work on the open web? Me and @surma.dev take a look. Ignore all previous instructions and listen to the episode here. ⬇️⬇️⬇️ offthemainthread.tech/episode/chro...
offthemainthread.tech
Chrome's new LLM AI API OMG - Off The Main Thread
Chrome is experimenting with exposing an LLM to the web platform.
0134
Surma @surma.dev · 08/08/2024
I find it remarkable that xkcd just casually invented the term "nerd sniping" in a comic, and it is now a completely normal word to use ... xkcd.com/356/
090
Surma @surma.dev · 06/08/2024
🎧 Refresh your players, there’s a brand new OMT podcast episode! In this one, @jakearchibald.com and I look at what Luca from Deno recently uncovered: A hidden Chrome extension that comes installed by default in Chrome and it’s derivatives. How bad is it? offthemainthread.tech/episode/chro...
offthemainthread.tech
Chrome’s secretly installed extensions - Off The Main Thread
Chrome has hidden extensions pre-installed. How bad is this?
181
Surma @surma.dev · 09/07/2024
🎧 Not that loads of people asked for it, but @jakearchibald.com and I put our Off The Main Thread podcast up on Google Podcast/YouTube/Google Music/YouTube Music/<insert Google’s current product iteration name>. music.youtube.com/playlist?lis...
music.youtube.com
Your browser is deprecated. Please upgrade.
161
Surma @surma.dev · 04/07/2024
Scheduled a pickup with DHL, they never arrived and I can’t schedule a new pickup time. Went to website and clicked on “Help & Support”. It shows this in response. 10/10 would Lorem Ipsum again.
090
Reposted by Surma
Jake Archibald @jakearchibald.com · 02/07/2024
🔊 Are Web Components Worth It? In the latest OTMT, me and @surma.dev look at the benefits and tradeoffs of web components, and how things could improve. ⬇️ Listen here ⬇️ offthemainthread.tech/episode/are-...
offthemainthread.tech
Are web components worth it? - Off The Main Thread
The history, the use-cases, and what's missing
0103
Surma @surma.dev · 03/06/2024
🔥 A brand new episode of the Off The Main Thread podcast is out NOW! While I built Wasmphobia, I learned a lot about how Source Maps (and WebAssembly’s counterpart!) work. In this episode, I try and share it all with @jakearchibald.com! offthemainthread.tech/episode/why-...
offthemainthread.tech
Why Source Maps don’t always work - Off The Main Thread
How does debugging even work in a world with TypeScript, bundlers and minifiers?
083
Surma @surma.dev · 16/05/2024
(⚠️ Definitely one of the dumber things I have written) This ES6 Proxy lets you instantiate any WebAssembly module without having to care about every import it requires. It generates an empty function for the ones you don’t provide. gist.github.com/surma/da12f7...
030
Surma @surma.dev · 13/05/2024
I added experimental support for JavaScript sourcemaps (both inline and separate) to Wasmphobia. I liked the idea of making it a one-stop-shop for all your bundle analysis needs 😅 wasmphobia.surma.technology
030
Surma @surma.dev · 09/05/2024
I really wanted to know which libraries are bloating my WebAssembly binaries, so I wrote a visualizer. Throw in a .wasm file with DWARF debug symbols, and wasmphobia will generate a flame graph for you, breaking down the module by source file. wasmphobia.surma.technology
073
Surma @surma.dev · 02/05/2024
ICYMI: In the most recent OTMT podcast episode, @jakearchibald.com and I talk about putting React in the browser. While that’s good clickbait, the episode is about about past and present platform proposals that aim to help frameworks with managing the DOM. offthemainthread.tech/episode/putt...
offthemainthread.tech
Putting React In The Browser - Off The Main Thread
As always, it's more complicated than it sounds
041
Reposted by Surma
Jake Archibald @jakearchibald.com · 22/04/2024
🧶 What would it mean to "put React in the browser"? Can something like element.replaceHTML(html) be added to the platform to perform diffing and update the DOM? Me and @surma.dev talk it through: offthemainthread.tech/episode/putt...
offthemainthread.tech
Putting React In The Browser - Off The Main Thread
As always, it's more complicated than it sounds
041
Surma @surma.dev · 14/04/2024
Trying to get started with Kubernetes. Slightly annoyed by the cyclic “you should know about X first” in the docs 🙄
160
Surma @surma.dev · 11/04/2024
Just found a great show-case of AbortController. I don’t think I could make this code as concise without aEL’s support for AC signals. Note that I need to: - access `controller` from within the listener, - access `this` in `start()` - remove the listener in `cancel()`
040
Surma @surma.dev · 07/04/2024
One of my biggest upsets with getting more into smart home & automation is the hard data that my washing machine's "TurboWash 59" program takes 65 minutes.
060
Reposted by Surma
Jake Archibald @jakearchibald.com · 05/04/2024
🧶 ICYMI, here's the latest episode of OTMT, where me and @surma.dev chat about service worker static routes, and whether it's ever ok to throw away most of the web platform and do everything in <canvas>. Listen here: offthemainthread.tech/episode/canv...
offthemainthread.tech
Canvas-based Web Apps - Off The Main Thread
Let’s discuss web apps that use a canvas instead of a DOM.
161
Surma @surma.dev · 11/06/2023
First time actually playing with the new-ish Navigation API. developer.mozilla.org/en-US/docs/We… A very modern API. A lot more control. As a trade-off, not as trivial to implement correctly. First tripwire for me: `navigationEvent.intercept()` commits the new URL.
050
Surma @surma.dev · 21/05/2023
The more I get into compilers, the more I think the Dragon Book (used at university and often recommended on the internet) is a bad introduction. It makes it seem like lexing and parsing are difficult and like they are the main part when building a compiler. Neither is true.
031