zkTLS credential layer   v0.2   testnet

Verifiable facts from any HTTPS session. Zero disclosure.

REDACT notarizes a live TLS session, commits to the full response, and emits a zero-knowledge proof of a single predicate over it. The verifier learns that the predicate holds. The page, the credentials, and the underlying value never leave the client.

Proof systemGroth16 on BN254
Verification210k gas, 4 ms
IntegrationNone required
instagram.com/api/v1/users/self
session a1f3
00.000tls handshake, notary attached
00.412response committed (sha256)
00.880selective disclosure: 1 field
02.140proving predicate (groth16)
02.960verified, minted
idle
Protocol

The web is already an oracle. It was missing a proof format.

Every authenticated page you load is a signed response from a server that only you can see. REDACT makes one field of that response provable to a third party without an API, without OAuth, and without trusting REDACT.

01 Session

Notarized TLS

The client opens a TLS session to the origin with a notary participating in the MPC. Neither party holds the full session key alone, so the client cannot forge the response.

MPC-TLS 1.3, ECDHE, AES-GCM
02 Commit

Response commitment

The notary signs a commitment to the complete plaintext without seeing it. This binds the proof to what the server actually returned.

H(response), notary_sig
03 Disclose

Select one field

The client chooses a single field to reason about. Everything else remains committed and undisclosed, including headers, cookies, and the rest of the body.

path: $.user.follower_count
04 Prove

Predicate proof

A zero-knowledge proof attests that the field satisfies a predicate. The value itself is never revealed. The proof is written onchain as a non-transferable credential.

field ≥ threshold, output: proof
Read the full protocol
Use cases

Gate, underwrite, and port reputation without collecting data.

Verifiers receive a predicate and a proof. They never hold the data that produced it, so there is nothing to leak, subpoena, or breach.

Creator gating

Admit accounts above an audience threshold to a drop, a beta, or a partner program without seeing follower counts or handles.

instagram.com follower_count ≥ 100000

Underwriting

Lend against verified revenue or account equity. The borrower proves the threshold. The lender never sees the books.

dashboard.stripe.com mrr ≥ 5000

Reputation portability

Carry a driver rating, a host status, or a seller score to a competing platform that has no relationship with the original one.

drivers.uber.com rating ≥ 4.9

Sybil resistance

Prove control of a long-lived, verified account on an established platform without linking that account to a wallet.

coinbase.com kyc_status = verified
Disclosure

What the verifier receives. What it cannot.

The disclosure boundary is defined by the circuit, not by policy. Hover the right column to inspect what stays on the client.

Disclosed

  • Origin domaininstagram.com
  • Predicatefollower_count ≥ 100000
  • Session timestampblock 4201338
  • Notary signaturesecp256k1
  • Holder address0x8a4e...c41f

Not disclosed

  • Session cookies and auth headersclient only
  • Exact field valuecommitted
  • Remaining response bodycommitted
  • Account identifieroptional
  • Linkage between credentialsnullifier
REDACT operates no storage. There is no server-side record of any session.
Threat model and audits
Verify

One call from a contract or a backend.

Proofs are fixed-circuit Groth16 over BN254. Onchain verification is a single precompile-backed pairing check. Offchain verification takes a few milliseconds.

verify.tstypescript
import { verify } from "@redact/verify";

// gate on follower_count ≥ 100k, proof no older than 7 days
const result = await verify(proof, {
  origin:    "instagram.com",
  predicate: "follower_count >= 100000",
  maxAge:    "7d",
});

if (result.valid) admit(result.holder);
Full verifier documentation

The data stays with the holder. The proof does not.