Privacy-blind reconciliation for trade finance
Trade laundering hides between banks. Mirror compares without seeing.
Two banks check whether their records of the same trade agree on price — without either one revealing the price, the customer or the amount. Every answer is signed, so you can defend it to a regulator.
- No raw value leaves your bank
- Every answer verifiable offline
- No risk scores, ever
computed in-pagecomputed in-pageSigned facts instead of logos · as of 11 Oct 2026
- OperatorProcessing pinned to the EUA Durable Object in the EU jurisdiction; storage in eu-central-1 (Frankfurt).The signed statement
- CorridorsNone ratified yet5 of 5 founding places open.The signed registry
- Safeguards39 refusalsEach one fails the build the moment it stops holding.Read them
- ReleaseRebuilt byte for byteThe 11 Oct 2026 release, on Windows and on Ubuntu.The provenance
Both commitments are byte-identical, so both readings fell in the same band; the operator learned that and nothing else. On the live rail this clear also waits for a witness with no stake in the price.
Three answers, and never a fourth.
Whatever the dials say, the operator can return only one of three answers. Every answer is signed, including the clears, and a clear waits for a witness with no stake in the price.
Checked, not asserted: every configuration of up to three legs, five bands, two corridor tables and two tolerances — 48,384 cases, 0 counterexamples. The certificate →
The legs' commitments matched, and a party with no stake in the price, such as customs or a terminal, agreed. Worth knowing precisely because it is signed: a clear you can prove is an asset in an examination, and an unsigned one is a shrug.
A discrepancy, not an allegation. The legs landed in different bands, and the rail says nothing about what caused it — the review that follows is yours.
Something was missing, unauthenticated, or could not be scanned to the bottom, or only the parties with a stake in the price agreed. This is the state a promise-based system quietly turns into a pass.
The structural blind spot.
Each party to a trade sees one leg of it: an invoice, a customs declaration, a payment. Mispricing only shows when the legs are compared, and comparing them today means handing a competitor your customer list.
One document, financed twice. A borrower takes the same bill of lading to two lenders; each file is clean, and the fraud exists only between them. Each lender commits the document inside its own bank, the operator compares commitments it cannot reverse, and a lender asking about its own document learns how many institutions finance it at overlapping dates, naming none. Built and tested; no lender uses it today.
Duplicate financingThree steps. Only one of them leaves the bank.
Each bank seals its own price
Mirror’s software runs inside your bank. It places each price in a range both banks agreed in advance, then seals that range with a secret only the two banks share. The price itself never leaves.
Mirror compares the seals
Mirror receives the sealed codes and checks whether they match. It holds neither the banks’ secret nor their price table, so it cannot turn a code back into a price — there is nothing for a subpoena, an insider or a breach to take.
Every answer is signed
Each result — every clear included — is digitally signed and written to an append-only public log. Your counterparty, your auditor or a regulator can check it offline, without trusting Mirror.
The operator compares commitments. It never receives a price, a unit, or a band.
Check a real verdict, here, offline.
The same offline check a supervisor runs with the network unplugged, on a real signed verdict from the worked examiner pack. Change one character of the record and the signature refuses it — which is why a forged clear cannot pass.
- 1Canonical byteskeys sortedthe exact bytes that were signed
- 2SHA-256a digest of themwhat ES256 signs
- 3Signaturer ‖ sbase64url to 64 bytes
- 4Public keyP-256chosen by its kid
- 5ECDSA verifytrue or falsenothing in between
A valid signature becomes evidence once its kid matches a key the operator publishes. The bench checks that too →
// 1 · canonical JSON: keys sorted at every depth - the signed bytesfunction canonical(v) { if (Array.isArray(v)) return "[" + v.map(canonical).join(",") + "]"; if (v && typeof v === "object") return "{" + Object.keys(v).sort().map(function (k) { return JSON.stringify(k) + ":" + canonical(v[k]); }).join(",") + "}"; return JSON.stringify(v === undefined ? null : v);}var bytes = new TextEncoder().encode(canonical(record)); // 2 · SHA-256 of those bytes is what ES256 signs. verify() hashes// inside; this line only shows you the digest, and that it movesvar digest = await crypto.subtle.digest("SHA-256", bytes); // 3 · the signature: base64url to 64 bytes, r ‖ svar sig = fromB64u(proof.signature); // 4 · the public key, chosen by kid: a point on the P-256 curvevar key = await crypto.subtle.importKey("jwk", { kty: jwk.kty, crv: jwk.crv, x: jwk.x, y: jwk.y }, { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"]); // 5 · ES256: true only if these exact bytes were signed with that keyvar ok = await crypto.subtle.verify( { name: "ECDSA", hash: "SHA-256" }, key, sig, bytes);Press verify to run the check in your browser.
The matching key is one of the four the examiner pack's operator publishes (the live operator signs with its own); a verdict whose key is not published is not evidence of anything. This is the same check the offline examiner pack runs, and the same one a supervisor runs with the network unplugged.
The safeguards list, the roadmap, a signed time, a webhook delivery, the release provenance — check any of them step by step: open the verification bench →
A rail that only signs its accusations is a rail whose silence means nothing.
Safeguards you don’t have to take on trust.
A promise is a policy someone can change on a Tuesday. These are built into the rail itself: each is something it cannot be made to do, and a test fails the build the moment one stops holding.
Your filing decision stays yours
Suspicious-activity reporting carries criminal liability, and tipping off is an offence. The rail cannot hold a filing decision, so it can never make one for you or leak one — it rejects any field that would carry one, even disguised with look-alike or invisible characters.
No risk score to dispute
There are three outcomes, and none of them is a number, a probability or a rating. A score becomes a de-risking tool the moment it exists, and a counterparty cannot appeal one.
No money moves through it
No custody, no settlement and no fee on volume. Mirror earns nothing more when a trade is larger, so nothing in its incentives argues for looking the other way.
Doubt never clears
A missing leg, an unauthenticated signature or a scan that could not finish returns undetermined, never a pass. The failure direction is inverted on purpose.
No prices of its own
The price table comes from a cited source both banks sign, and its provenance is pinned inside every verdict. Mirror publishes no prices, thresholds or risk weights.
No league tables
Certificates carry counts and nothing else: no percentile, no peer comparison, no traffic light, and no route by which a correspondent could obtain one.
All 39, each with the code that enforces it and the test behind it: read the safeguards, then try to break them →
One signal, honestly scoped — including where it loses.
Mirror finds the price disagreement between institutions that no single bank can see on its own. It is blind, by design, to what no shared price table can show — and says so below in the same type as the wins.
Addressed 3
The cross-institution price signal is the core.
- Over-invoicing
- Under-invoicing
- Multiple invoicing
Partial 6
Works when the leg that sees it takes part.
- Phantom / short shipment
- Misdeclared goods / substitution
- Carousel / round-tripping
- Free-zone re-invoicing / transit manipulation
- Structuring / velocity games
- Related-party mispricing
Blind 4
Structural limits, stated as plainly as the wins.
- Collusion every party states the same lie
- In-band mispricing
- Off-rail / unratified / non-member leg
- Services-trade mispricing
Measured, not claimed: on a seeded synthetic corridor (mirror-autopsy, seed 42, 200 shipments) the kernel caught 18 of 18 anomalies the table can express, with 0 false positives across 162 clean trades — and missed all 20 planted inside bands, as it is built to.
What Mirror gives up: it compares bands, not exact prices, so even a clear is only same-band agreement; it needs a corridor table both banks have ratified first; and a clear waits for a witness with no stake in the price. What it buys: no trusted party, no special hardware, no key ceremony, and a verdict any examiner can check offline. When the requirement is a result you can defend to a regulator without asking them to trust the operator, that trade is the point.
Against MPC, zero-knowledge proofs, a trusted data pool and a document registry, row by row: the full comparison → · The legal bases that opened the door: the board brief →
Stated plainly, and repeated in the record: Mirror is not zero-knowledge and not multiparty computation; it compares bands, not exact values; it needs a corridor table both banks ratify first; and a clear is a defensible reconciliation, never a verdict of innocence. It claims no regulator's endorsement and no pilot it has not run. The coverage above is a property of the architecture, not a badge.
The corridor-table standard, draft → · How Mirror composes with the stack →
The mechanism, where it actually gets hard.
Four questions a serious evaluator reaches within five minutes. Each answer is the mechanism as built — including the parts Mirror deliberately does not do.
How do two banks that never talk produce a matching commitment?
HMAC-SHA256(corridor secret, "mirror:" + shipment reference) and commits sha256(salt + ":" + band). Same secret, same reference, same salt — so identical inputs yield an identical digest, with no message between them and nothing about the counterparty or the trade reaching the operator. The shipment reference itself travels as a blinded locator commitment, so the operator cannot correlate two legs by it either. It is a per-corridor shared secret both banks already hold, not a per-shipment exchange.Our documents are in different currencies, units and Incoterms. Won't legitimate trades diverge?
We received a Divergent verdict. What is our workflow?
Where is our data processed, and can we hold you to it?
GET /residency, and a fail-closed check, meets(record, "eu"), ships in the verification kit and every SDK, so it is a commitment your team verifies, not a sentence to trust. The record also lists what it does not cover: the first network hop can be outside the EU, and it forwards the request unread. Data residency, in full →Three ways in, in order of how ready you are.
Bring a counterparty, run it alone on your own book, or read it first. There is a path whether you are standing up a corridor with a partner bank or evaluating the idea this afternoon.
Start a corridor pilot
Pick the template for your goods, find a table you both already hold, and ratify it with an end date. Enquiries are taken by direct introduction while the contact channel is being set up — there is deliberately no dead mailbox here.
The first-pilot runbook → The corridor library → How to reach the maintainer →Run it on your own book
One readable file, no network. Try candidate tables on your own multi-leg shipments in shadow mode: nothing is submitted, and you get counts and each table’s blind spot. Its sha256 is its identity, so you can verify the exact bytes you ran.
Get the bander, with the checksum → Start with the pilot in a box →Read the mechanism
The protocol spec, the threat model your security team will ask for, and the worked examiner pack you can re-verify offline. Everything the argument rests on, in the open.
Read the protocol spec → Read the threat model → Read the boundary register →A trade the whole world can see, checked by nobody who can read it — that is the rail we are building.