Posts
Building Ursprung in the open, one day at a time.
- Start here: what Ursprung is, and how it gets decided A standalone primer rather than a daily update, for somebody who has read none of the log: what Ursprung is, how the wayfinder map plans it, and where the whole thing stands after five days. It covers the settled axioms, the five-step build, the rules an app author follows, and what is still open. Two warnings first — almost none of it exists as code yet, and the plan keeps getting smaller.
- Day five: nothing in Ursprung transpiles Asking who the transpile was actually for produced no answer, so the transpiler left and the three oxc wasm packages went with it. What reads the module graph is now a single 27-kilobyte lexer, Tailwind became a command the producer runs, and five tickets were ruled out of scope in one day. It is the first time the map has been redrawn rather than extended.
- Day four: the build moves inside the Worker, and stops editing your source Production Cloudflare does hand a Worker a SharedArrayBuffer, so the toolchain held under the hardest constraint anyone had put on it — and then the build-host axiom inverted to workerd only. The day's largest decision produced no ticket at all, because it is an axiom: Ursprung never edits your source. Almost everything else was subtraction — no bundler, no codegen step, no extraction transform, no scope analyser.
- Day three: the build has to run inside a Worker A new requirement arrived in the middle of the day's largest ticket: an Ursprung app must build in Node, Bun and inside a Cloudflare Worker as equals, on one code path. It reversed a day-two recommendation and now outranks the dependency budget. The build got its shape anyway — four stages over (module, realm) pairs, an explicit route table, and capnweb delegated for the wire but not for resumability.
- Day two: a map, four surveys, and a spike that said no Nine hours spent deciding what to build, and on purpose no framework code at all: a wayfinder map, four research surveys of roughly 4,800 lines, one throwaway spike, and nineteen tickets. The spike settled the riskiest decision by building rather than arguing — the realm boundary is a filename suffix, refused at resolution time, and per-export granularity is out. The only change outside the planning directory was one line of formatter configuration.
- Day one: from empty repo to a deployed Worker Ursprung went from an empty repository to a Bun monorepo that lints, type-checks, publishes to npm with provenance, and deploys itself to Cloudflare on every push. Along the way it picked up Wrangler's experimental TypeScript configuration, a release-tag guard on publishing, and 22 vendored agent skills. The Worker still returns "Hello, world!" — the plumbing got built first, on purpose.