Before we dive into the technical stuff — Happy March 8th! 🌷 Today is International Women's Day, and I want to take a moment to celebrate the women in tech, in open source, in every field — your strength, brilliance, and contributions shape the world we build in. Thank you. 💐
The future is built by those who refuse to wait for permission.
Alright —
Last time, the BaseContext was wired up — ctx.expose() and ctx.query() working for real, the GlobalRegistry holding exposed APIs, and makeRegistryObject keeping registry keys sane. The unit communication layer was done. But the system that feeds config into those units? That was still a rough sketch. A few notes in a spec page, no real pipeline, no contracts.
That had to change before anything else could move forward.
Here is the thing about building a meta-framework — eventually every unit, every adapter, every runtime needs to ask the same question: "what is my config, and where did it come from?"
And until this point, Velnora did not have a real answer. There was a vague idea of "find a config file and parse it" — but no defined order of precedence, no merge rules when two layers disagreed, no way to share presets between projects, and no validation at all. Every time I tried to wire up something new, the same question came back: which config wins? What if there is a workspace config and a project config and they both set the same key?
I kept working around it. Hardcoding values here, passing things manually there. But that only works until it does not — and with integrations, adapters, and runtimes all needing config at the same time, the duct tape was running out fast.
Oh, and the type system issues from the last post? 😅 To be honest, still there. Not blocking anything, so I kept moving. I will circle back and clean that mess up — but config was the fire that needed putting out first.
So I sat down and designed the full resolution pipeline. The goal was simple: config resolution should be deterministic, layered, and frozen before any unit sees it.
The result is 7 layers, each overriding the previous:
velnora.config.ts at workspace rootvelnora.config.ts in project rootpackage.json fallback — "velnora" key, but only if no project config exists--log-level=verbose and friends