Why Markout exists
Reactivity arrived in the browser as something you bolt onto HTML with JavaScript. A framework takes the page over, the markup becomes its output rather than the document, and every page pays for a runtime, a build step and a mental model before it can react to anything.
I kept wondering what the other order would look like — reactivity in the markup itself, so that a page stays a page and gains the two things a static document cannot do for itself: recurring markup becoming a tag you name once, and the page keeping itself in step with its own data.
What the 2000s got right
The idea is not mine. OpenLaszlo had it in the 2000s, and the part worth inheriting was not its syntax or its runtime — both of which belong to their decade — but what an attribute was allowed to mean. An attribute stated a relationship, and the relationship stayed true. You did not write what to do when something changed; you wrote what was the case, and the framework's job was to keep it so.
That is a smaller idea than a framework and a larger one than a
feature. It says a property is not a box holding whatever was last
put in it — the assumption plain JavaScript entails and almost
everything since has kept, hedged with a
signal(), a
ref() or a dependency array to
re-introduce by hand what the assumption removed.
The JavaScript frameworks that followed, from React onwards, went the other way. They got a great deal right — components, one-way data flow, an ecosystem — and I think threw out the baby with the bathwater. I waited a long time for someone to bring that vision up to date. Nobody did.
What is different now
Everything that dated OpenLaszlo is gone, and none of it was the idea. There is no plugin, because the browser is the runtime it needed. There is no proprietary player and no XML dialect to learn, because the platform grew into the job: HTML is the syntax, the DOM is the scope chain, and JavaScript is the expression language. Nothing here is a language of its own.
The scope chain is the part people find surprising, and it is the
one that needs no invention at all. A value declared on an element
is visible to everything inside it, because that is what nesting
already means — so there is no
provide/inject,
no Context, and nothing to wire.
The document tree was a scoping model the whole time.
And because the whole of it compiles ahead of the browser, the same page renders on the server and comes alive in the browser from the same source — which is the third thing the original vision wanted and the decade could not give it.
What it is not
It is not an application framework, and the distance matters. Markout is the presentation layer: the DOM is the view, your data is the model, and Markout is the logic between them. Anything framework-shaped — a datasource, a router, a theme switcher — is written in Markout as a kit rather than built into the language, which is what lets the language stay a handful of rules.