Know what breaks when your AI stack changes.
Moonwire records the data, policies, prompts, models, tools, and code behind AI-generated artifacts. When one changes, it identifies the memories, decisions, and pending actions that may need review before reuse or execution.
supplier-risk:v182payment-policy:v7finance-agent:v31finance-model:2026-08pricing:v12git:abc123Deterministic recall demo
Manifest. Change. Impact. Block.
No LLM key. No external service. In under 90 seconds, create a payment decision manifest, change one supplier-risk version, inspect the exact blast radius, and watch a critical pending payment refuse execution.
Run the demo →Problem
Every durable AI artifact needs an ingredient label.
A decision can survive long after its data, policy, prompt, model, tool, or code version changes. Without a manifest, the application cannot reliably recall everything produced from the changed dependency.
When an ingredient changes, Moonwire performs the recall.
{ "canonical_ref": "mw://acme/prompt/payment", "kind": "PROMPT", "version": "sha256:…", "metadata": { "owner": "finance-platform" } } No prompt or decision text is stored.
How it works
Label. Recall. Gate.
The graph engine remains evidence lineage. Typed dependencies expand it into deterministic AI change control without evaluating model reasoning or storing customer content.
30-second code example
Record what produced the artifact.
Your application keeps the content. Moonwire receives references, kinds, exact versions, criticality, selectors, and lineage.
import os
from moonwire import Moonwire
with Moonwire(api_key=os.environ["MOONWIRE_API_KEY"]) as moonwire:
with moonwire.execution() as run:
run.evidence(
ref="mw://acme/policy/refunds",
kind="POLICY",
version="v7",
selector={"fields": ["refund_window_days"]},
)
result = my_agent(...)
artifact = run.commit(
type="decision",
criticality="HIGH",
external_id="payment-decision-9281",
)
moonwire.require_valid(artifact.id)Deliberately narrow
Moonwire vs observability vs evals
Fit
Should I use Moonwire?
Use Moonwire if
- Generated outputs persist beyond one request.
- Outputs depend on mutable data, policies, prompts, models, tools, or code.
- A stale decision or pending action has meaningful consequences.
- You need auditable dependency manifests and blast-radius analysis.
- Regenerating everything constantly is impractical.
You probably do not need it if
- Every response is fully ephemeral.
- Every request fetches current dependencies and nothing is reused.
- Dependency change has no meaningful consequence.
- You already implement equivalent explicit lineage and invalidation.
Self-hosting
One service. One database.
$ git clone https://github.com/pycarrot/moonwire
$ cd moonwire
$ docker compose up -d --build --wait
✓ postgres healthy
✓ moonwire healthySDK · CLI · REST
state · outbox · audit
Security and privacy
Infrastructure that minimizes what it knows.
Documentation
Everything needed to evaluate and operate Pulse.
Early users
Using Moonwire? Tell us what breaks.
What does your agent persist? Which sources change? How do you detect stale state today? What would block adoption?
Open source · local first
Dependencies change. Know what needs attention.
Apache-2.0 licensed change-control infrastructure. Self-host it with PostgreSQL; keep prompts, policies, customer records, code, and generated outputs in your own systems.