Surma

@surma.dev

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

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...

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.

shopify.engineering

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...

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.

shopify.com

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...

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.

shopify.com

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...

The present and potential future of progressive image rendering

Exploring progressive image rendering across JPEG, PNG, WebP, AVIF, and JPEG XL.

jakearchibald.com

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.

BildBildBild

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)

BildBild

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])

📝 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...

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!

surma.dev

Unexpected dangers of vibe coding: Somehow git ended up tracking its own .git folder and now I can't commit anymore :3

Bild