One substrate · three products

Record everything your agents and systems do — and prove it.

fasten is the open-source substrate that records what happened — typed, correlated by one request_id, tamper-evident. membrane governs what your agents believe; fasten fleet carries the fleet and the compliance. One record, three lenses.

fasten · one request_id
audit PAYMENT_CAPTURED who=svc whom=usr_42 req=3a7b1c api GET /v1/checkout · 200 · 12ms req=3a7b1c sys payments level=info "captured" req=3a7b1c # one request_id threads three streams · typed · hash-chained
One request_id7 Anchors6 LanguagesApache-2.0Python · Go · Rust · Node · TypeScript · C++ · Swift

One Substrate · Three Products

Audit · Open Source

fasten

The substrate. Record what happened — correlated across every transport, hash-chained so it can't be quietly rewritten.

Python
fasten.emit( code="PAYMENT_CAPTURED", target="usr_42", ) # → 7 anchors · req=3a7b1c · hash-chained
Explore fasten →

Belief · Commercial

membrane

Built on fasten, for AI agents. mbnl normalizes any model's output, then membrane computes what the agent believes — which source won, what drifted, what's stale — and the control tier enforces policy before a bad action lands.

Explore membrane →

Data Plane · Commercial

fasten fleet · aka cloud

Aggregate the whole fleet into one queryable plane — compliance reports, tamper-evident archive, tiered retention. Hosted or air-gapped.

Explore fleet →
The Base Layer

membrane and fleet are built on the fasten substrate — one typed, correlated, tamper-evident event model. A layer below agent-orchestration frameworks (LangGraph · CrewAI · AutoGen) and above per-call tracing, where every framework leaves state to you.

How it works

One request_id, from event to belief to correction.

Every stream — across agents, services, and transports — threads into one typed substrate. On top sit two lenses and a control tier; the model is Audit → Belief → Correction:

01

Audit

fasten

Record what happened — typed, correlated by one id, tamper-evident across every transport.

02

Belief

membrane

Compute what the agent believes and reconcile it against your systems of record. Catch drift.

03

Correction

membrane · control tier

Decide and enforce — block the action on stale or contradicted state before the side-effect lands.

mbnl sits in front of all three — normalizing any model or vendor's output to one typed event before it enters the substrate. control is membrane's enforcement tier, not a separate product.

Why fasten

A substrate built for evidence, not just telemetry.

A software system is more than AI agents. Logs, metrics, and traces tell you what is happening. fasten is the connective tissue across AI and non-AI components — the fourth pillar, joining all three with the tamper-evident record of what happened, who changed it, who can prove it.

One request_id correlates typed audit events, structured logs, HTTP access, and system events into a unified 3-pane view. Seven anchors (5 Ws + H + correlation) typed at the source. fasten treats AI agents as one kind of actor, alongside users, services, schedulers, and integrations. Same primitive for every actor.

Three tiers sit on the same hash-chained record:

One substrate, three tiers, no second sensor in your code path.

The same primitive serves any system that does anything consequential — banks, hospitals, industrial control, mobile apps, SaaS backends, regulated manufacturing, and AI agents. Most teams already run a great observability platform and a great compliance platform. They still carry a gap that fills with a homegrown audit table, glue code, and quarterly log scraping. fasten fills that gap natively.

Every adjacent surface gets the substrate it ought to be reading from — observability tools that want to chat with the record, governance toolkits that want to refuse a bad action before it lands, GRC platforms that want to attest against a framework after the fact. Same hash-chained rows, three lenses.

Typed at the source

Registered code catalogue

Every audit event is a value in a finite catalogue you ship with the code (fasten.codes.register(...)). The reader, the agent, and the auditor share one closed vocabulary. Hallucinated field names are structurally impossible.

Correlation at the type level

Seven anchors, one request_id

Every audit row carries who, what, when, where, why, how, and the correlation id. Joins across audit · sys · api · across the fleet are not inferred — the schema does them. One request_id threads everything.

Independently verifiable

Per-row SHA-256 hash chain

Each audit row carries prev_hash and hash. Tampering surfaces at first_break_at with a reason string. The chain is verifiable without the LLM in the loop — the row either matches or it doesn't.

What this unlocks

One substrate, two reasoning lenses on top: fasten fleet's /investigate reasons over audit history and returns cited rows; Membrane reasons over agent beliefs and blocks bad state at write time. Same hash-chained rows — different surfaces. The evidence is the same row both lenses cite.

membrane · Drift Reconciliation

Stop the Agent Acting on State That's Already Wrong.

An agent holds plan = Growth, active. Billing cancelled them three days ago — a missed webhook, or a value cached at session start. membrane reconciles the belief against the source of record and flags the divergence before the refund goes out.

  • Per-field provenance — which source won, and when it was last verified.
  • TTL and decay — "verified 40 days ago, low confidence" instead of a confident wrong answer.
  • A tamper-evident trail — the drift event recorded for the auditor.
See How Drift Works
membrane explain
$ membrane explain usr_42 plan # belief plan = "Growth" // cached source = session_start verified_at = "40d ago" confidence=low # reconcile → Stripe (system of record) stripe.plan = "cancelled" ⚠ DRIFT belief ≠ source_of_record action = blocked (refund)
fasten trace
$ fasten trace req=3a7b1c mqtt ingest t+0ms scheduler enqueue t+12ms service charge t+41ms stripe api.capture t+210ms service PAYMENT_OK t+228ms # 5 hops · 3 transports · one id · hash-chained

fasten fleet · The 2 a.m. Incident

One request_id Across the Whole Fleet.

Two hundred instances; one misbehaves; the request crossed MQTT → scheduler → microservice → an external API. Jaeger sees HTTP spans, Loki has unstructured logs, the audit table is local and homegrown. fasten threads one id end to end; fleet aggregates every node into one queryable plane.

  • Cross-transport correlation — not just HTTP spans.
  • Append-only hash chain plus Sigstore Rekor — the auditor accepts the pack as-is.
  • Tiered retention and WORM for the full retention period.
Explore fleet

Start With the Substrate.

Open source, six languages, your first hash-chained event in five minutes. Add membrane and fleet when you need belief and the fleet view.

fasten

The audit substrate for distributed systems — and the belief layer for the AI agents on top of them.

Products
fastenmembranefasten fleetmbnl · control — part of membrane
Resources
DocsHow It WorksQuickstartWhy fastenContact
© 2026 fasten · nerdAppLabs Software Solutions Pvt. Ltd.SDK Apache-2.0 · membrane & fleet commercial