41554 blogs · [ { "id": "01a08219-5703-724a-b3f2-65715903f513", "title": "LangGraph for complex workflows", "url": "https://surma.dev/things/langgraph/", "published_at": "2025-06-17T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571595cc118", "title": "[Video] Nix explained from the ground up", "url": "https://surma.dev/things/nix-explained/", "published_at": "2024-09-06T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571599abad5", "title": "Rust to WebAssembly the hard way", "url": "https://surma.dev/things/rust-to-webassembly/", "published_at": "2023-02-13T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657159dffc42", "title": "I turned JS into a compiled language (for fun and Wasm)", "url": "https://surma.dev/things/compile-js/", "published_at": "2022-10-03T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715a75b12e", "title": "The cost of convenience", "url": "https://surma.dev/things/cost-of-convenience/", "published_at": "2022-06-17T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715b6ad965", "title": "WebGPU — All of the cores, none of the canvas", "url": "https://surma.dev/things/webgpu/", "published_at": "2022-03-08T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715b8fdc5e", "title": "My approach to coding interviews: Optimize for iteration", "url": "https://surma.dev/things/spreadsheet/", "published_at": "2022-01-24T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715c193e2a", "title": ", HTTP range requests & WHATWG streams", "url": "https://surma.dev/things/range-requests/", "published_at": "2021-12-28T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715c4e5c4d", "title": "Is WebAssembly magic performance pixie dust?", "url": "https://surma.dev/things/js-to-asc/", "published_at": "2021-04-13T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715c68ecf2", "title": "Why your phone’s portrait mode fakes the blur", "url": "https://surma.dev/things/portrait-mode/", "published_at": "2021-02-26T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715cfeba10", "title": "Ditherpunk — The article I wish I had about monochrome image dithering", "url": "https://surma.dev/things/ditherpunk/", "published_at": "2021-01-04T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715d747cbe", "title": "Case study: Moving a Three.js-based WebXR app off-main-thread", "url": "https://surma.dev/things/omt-for-three-xr/", "published_at": "2020-01-27T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715de7e43e", "title": "Streams for reactive programming", "url": "https://surma.dev/things/streams-for-reactive-programming/", "published_at": "2020-01-16T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715e48cd1a", "title": "React + Redux + Comlink = Off-main-thread", "url": "https://surma.dev/things/react-redux-comlink/", "published_at": "2019-07-30T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715e659161", "title": "Is postMessage slow?", "url": "https://surma.dev/things/is-postmessage-slow/", "published_at": "2019-07-15T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715ea462af", "title": "When should you be using Web Workers?", "url": "https://surma.dev/things/when-workers/", "published_at": "2019-06-14T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715ee755e7", "title": "Compiling C to WebAssembly without Emscripten", "url": "https://surma.dev/things/c-to-webassembly/", "published_at": "2019-05-28T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65715fd32f35", "title": "Raw WebAssembly", "url": "https://surma.dev/things/raw-wasm/", "published_at": "2019-05-17T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716047d508", "title": "Less Snake Oil, More Context", "url": "https://surma.dev/things/less-snakeoil/", "published_at": "2018-11-05T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657160b43c8d", "title": "Headless Web Development", "url": "https://surma.dev/things/headless-web-development/", "published_at": "2018-10-05T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571617c2c48", "title": "Lights, Camera, Action!", "url": "https://surma.dev/things/lights-camera-action/", "published_at": "2018-09-27T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657162130132", "title": "The 9am rush hour", "url": "https://surma.dev/things/the-9am-rush-hour/", "published_at": "2018-09-21T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657162679ea5", "title": "My most useful RegExp trick", "url": "https://surma.dev/things/regexp-quote/", "published_at": "2018-05-02T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571629b86c2", "title": "Layers and how to force them", "url": "https://surma.dev/things/forcing-layers/", "published_at": "2018-04-19T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716375aa46", "title": "Deep-copying in JavaScript", "url": "https://surma.dev/things/deep-copy/", "published_at": "2018-01-25T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657163805a44", "title": "“An Actor, a model and an architect walk onto the web...”", "url": "https://surma.dev/things/actormodel/", "published_at": "2017-12-27T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657164095132", "title": "2018: 120fps and no jank", "url": "https://surma.dev/things/120fps/", "published_at": "2017-11-15T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657164efc1ed", "title": "Comlink + WebRTC — An Intro to WebRTC", "url": "https://surma.dev/things/comlink-webrtc/", "published_at": "2017-10-06T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571658fb4e2", "title": "DOM2Texture: Abusing Arcane APIs", "url": "https://surma.dev/things/dom2texture/", "published_at": "2017-04-24T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571662e3d1c", "title": "DIY Web Animations: Promises + rAF + Transitions", "url": "https://surma.dev/things/raf-promise/", "published_at": "2017-02-14T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657166ee2b96", "title": "Chromium Bug Tracker: All bugs with >32 stars get fixed?", "url": "https://surma.dev/things/32-stars/", "published_at": "2017-02-13T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657167af3df7", "title": "DevDiary Underdash: Progressive Enhancement, Graceful Degradation and Accessibility", "url": "https://surma.dev/things/devdiary-underdash-pe-and-a11y/", "published_at": "2017-01-04T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716824f2cb", "title": "How to read web specs Part IIa – Or: ECMAScript Symbols", "url": "https://surma.dev/things/reading-specs-2/", "published_at": "2016-11-22T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-6571683c6108", "title": "How to read web specs Part I – Or: WebVR, how do you work?", "url": "https://surma.dev/things/reading-specs/", "published_at": "2016-10-10T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-657169354e8f", "title": "Compositor Worklet evolves into Animation Worklet!", "url": "https://surma.dev/things/animworklet/", "published_at": "2016-09-26T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716a2e681b", "title": "Lazyloading", "url": "https://surma.dev/things/lazyloading/", "published_at": "2016-04-08T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716b04573e", "title": "New ways to make your web app jank with Houdini – An introduction", "url": "https://surma.dev/things/houdini-intro/", "published_at": "2016-02-01T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716b96d8b7", "title": "Setting up HTTP/2", "url": "https://surma.dev/things/h2setup/", "published_at": "2016-01-15T00:00:00+00:00" }, { "id": "01a08219-5703-724a-b3f2-65716ba04256", "title": "Maelstrom Gaming and 12 fps", "url": "https://surma.dev/things/maelstromgaming/", "published_at": "2015-11-11T00:00:00+00:00" } ] posts Claim your blog
Back to Surma
Blog · corpus.blog/blogs/surma.dev/posts

Surma

surma.dev

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015