Verify before · govern during · prove after

From observation to evidence.

Others observe the execution. We govern it before and during, then preserve verifiable evidence after.

membrane governs before and during. fasten proves what happened after: an open-source substrate, typed, correlated by one request_id, hash-chained. fasten fleet carries both across a fleet.

Audit · Syslog · API in one view.

A debugging workflow for system events and AI agents alike.

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 # three streams · one request_id · hash-chained · verify offline
Beyond observabilityState over timeOne request_id7 Anchors6 LanguagesApache-2.0Python · Go · Rust · Node · TypeScript · C++ · Swift

One Substrate · Three Products

Audit · Open Source

fasten

The substrate. Records 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. 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

Records 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

Decides and enforces. Blocks 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. It is 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.

Why the fourth pillar and not another log stream: the time axis. Observability is signal (sampled logs, aggregated metrics, point-in-time spans). fasten records the evolution of state: who held what belief at what moment, how the chain looked an hour ago, how an operation unfolded across audit, Syslog, and API.

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.

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 the three streams (Audit Trails · Syslog · API (HTTP) Access logs) and 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 enables

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

Move fast AND prove it.

Provable audit and shipping fast stop being a tradeoff.

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. 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