Declare the world as it should be; Reactor keeps it true.
Quickstart ·
The shape ·
Examples ·
The SDK ·
Honest status ·
Send us an eval
What this is
OpenProse is a declarative language for AI sessions. Instead of scripting a sequence of instructions and hoping the run lands where you wanted, you declare the world as it should be: an ideal world state, written as familiar structured Markdown contracts (*.prose.md). You say what must stay true, and the system works out how much model work it takes to keep it that way. When order, loops, or exact choreography genuinely matter, optional imperative ProseScript plans drop in. Declarative by default, imperative where you want the control.
This is the oldest good idea in software, pointed at agents. SQL, Terraform, Kubernetes, React: you declare the desired state, and a reconciler is responsible for making reality match it. A thermostat is the one-sentence version. You set the temperature you want and it holds the room there; you never tell it when to fire. OpenProse brings that contract to model work, and it runs on any Prose-Complete agent harness (it shipped first as a Skill).
Reactor (@openprose/reactor) is the runtime that keeps the declaration true. It holds a composed world-model (your declared truth, on disk), watches the world for change, and re-renders only the declared facets whose inputs actually moved (memoized agent sessions wired into a DAG). Every decision leaves a content-addressed receipt behind. Reactor is the recommended fast path for running OpenProse.
Declarative is the through-line. OpenProse is the language you declare in; Reactor is the host that reconciles. One idea, two layers: you declare the ideal world state, the Reactor keeps it true. And because the reconciler acts only when reality drifts from what you declared, the bill follows real change, not the clock:
Inference cost that scales with surprise, not wall-clock time.
In plain terms: you declare what should stay true, the system watches the world, and it does expensive model work only when something material actually moved.
New here? Start with the Quickstart below. One keyless command proves the whole idea in under a second, no model key and no spend.
Coming from OpenProse? Reactor is the dependency-across-runs layer your contracts kept asking for: the natural next step, not a turn away. The same .prose.md you already write is what Reactor runs.
The shape: OpenProse → Reactor
You author Responsibilities, standing goals written as Markdown contracts. This is where declare it, the Reactor keeps it true becomes concrete:
### Maintains is the world-model schema: what truth this node keeps current, which fields are material (and so move the fingerprint) vs immaterial, optional #### facets that split the truth into independently-subscribable parts, and the postconditions a render must satisfy before it may commit.
### Requires names the upstream facets this node subscribes to. Forme (the wiring layer) matches Requires.<facet> ↔ Maintains.<facet> and draws the subscription edge. Structure is subscription; the graph wires itself from the contracts.
### Continuity declares the wake source: input-driven by default, self-driven on a freshness cadence, or external-driven (a gateway turning an ingress event into an edge).
Reactor compiles that set of contracts once (intelligently: Forme topology, a per-node canonicalizer, postcondition validators, all frozen), then runs them forever (dumbly: compare fingerprints, skip / render / propagate). The reconciler that decides whether to wake is deliberately deterministic: there is no judge step. The memo key has no clock in it. A render that can't satisfy its postconditions commits nothing; the prior truth stands and a failed receipt records why.
You do not need React to use this. Reactor is React-flavored, not React-gated: the contracts are Markdown, and the CLI, the receipts, and the keyless replay are entirely React-free. The whole product in two sentences: you declare what should stay true, the system watches the world, and it does expensive model work only when something material actually moved. The table below is an optional mental model for the people who already carry one; skip it freely.
Optional: the React metaphor (skippable)
If you know React, you already know the shape. Substitute three nouns: