A Membrane program consists of:
Programs that expose data and functionality do so by exposing a graph of nodes.
To expose a graph, programs declare a schema that determines the shape of its nodes and how they related to each other.
A schema is composed of types, and each type is composed of fields, actions and events (collectively refered to as members).
A program's schema must always define a type named
Root which serves as the entry point into the rest of its graph.
Programs must have an
index.js exporting resolver functions.
Programs declare ahead of time the nodes needed from the graph.
These handles are then available as variables in the
nodes object from the
Programs have a
state object that can be used to persist state between updates. This object can be accessed from the
Technically, since the entire JS heap is continually persisted, you could just use module-level variables to store
state. But since each update creates a new ES Module, prior values are not accessible from newer modules, hence the need
state to share state across different version of the program's code (i.e. different ESM modules).
Each Membrane program has its own publicly available domain name which they can use to respond to HTTP requests.
Programs can declare that they recognize certain text expressions and are able to turn them into corresponding node handles.
This is what allows the browser plugin to scan a web page and find the corresponding handles.