murad on Nostr: canmi is building SeamJS, a framework where the server never runs your UI code. at ...
canmi is building SeamJS, a framework where the server never runs your UI code. at build time it compiles the page into an html skeleton with holes in it, and at request time the backend just fills the holes. rust, go, whatever you've got, no node required.
the v1 used react and had to treat the compiler as a black box: render it a bunch of times, diff the output, and guess where the structure changes. that works for a nullable field. it falls apart the moment someone writes price > 10, because you can't enumerate every number, so the user ended up writing mocks by hand and basically doing the compiler's job.
so he switched to svelte, and the reason is the part i liked most. it's not speed. it's that svelte markup is actual markup. an {#if} block is sitting right there in the ast, so you don't have to observe the structure when you can just read it. the escape hatches (svelte:component, dynamic {@render}, spread props) become a short, known list instead of "any javascript at all."
it's a long read with a lot of opinions on next.js, vue 3 and css-in-js along the way, and i don't agree with all of them. but "ui should be described, not executed" is a good line, and he ends it by saying that even if he's the only one who ever uses it, it's still his experiment. that's the right attitude for side projects.
https://canmi.net/architecture/observation-to-lowering?lang=enPublished at
2026-11-08 00:06:26 UTCEvent JSON
{
"id": "3e777f1e56a925f9d1ea727355d86367a987c4b6a1e4ec93543f91d0114bb70b",
"pubkey": "ca1740daaf6a32c1dbe0a1000caa6117b263b40b1a927dbfa830f3d1c94ae976",
"created_at": 1794096386,
"kind": 1,
"tags": [],
"content": "canmi is building SeamJS, a framework where the server never runs your UI code. at build time it compiles the page into an html skeleton with holes in it, and at request time the backend just fills the holes. rust, go, whatever you've got, no node required.\n\nthe v1 used react and had to treat the compiler as a black box: render it a bunch of times, diff the output, and guess where the structure changes. that works for a nullable field. it falls apart the moment someone writes price \u003e 10, because you can't enumerate every number, so the user ended up writing mocks by hand and basically doing the compiler's job.\n\nso he switched to svelte, and the reason is the part i liked most. it's not speed. it's that svelte markup is actual markup. an {#if} block is sitting right there in the ast, so you don't have to observe the structure when you can just read it. the escape hatches (svelte:component, dynamic {@render}, spread props) become a short, known list instead of \"any javascript at all.\"\n\nit's a long read with a lot of opinions on next.js, vue 3 and css-in-js along the way, and i don't agree with all of them. but \"ui should be described, not executed\" is a good line, and he ends it by saying that even if he's the only one who ever uses it, it's still his experiment. that's the right attitude for side projects.\n\nhttps://canmi.net/architecture/observation-to-lowering?lang=en",
"sig": "830e6b55cf82e3b47537c2d28f8370692b51ee86e4af147d4fdd4a6f2e47111c3f9a78e26db4c0450fd324410ec6ce3225184cf3586e009eb7fb711902ac9e55"
}