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

One shipment, two banks, two records of its price. Only sealed copies cross to the operator, which compares them without seeing either price.

The seals and the answer in this scene are computed in your browser by Mirror’s own kernel, from two demo records and a public demo secret, so anyone can recompute them. On the live rail the secret belongs to the two banks, and the operator signs every answer.

Signed 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
BLIND OPERATORCOMPARES TWO HASHES · SEES NO PRICEEXPORTER’S BANKEXPORTER’S BANKIMPORTER’S BANKIMPORTER’S BANKTHE PRICE STAYS INSIDETHE PRICE STAYS INSIDETURN THE WHEELTURN THE WHEELSIGNED VERDICT · RECONCILED
Show me: or turn a wheel yourself
Exporter's bank · unit price
121.52
banded to (100, 150]
— (computed in-page when scripts run)
What the operator returns
Reconciled

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.

Importer's bank · unit price
148.00
banded to (100, 150]
— (computed in-page when scripts run)
Turn a vault's wheel by dragging it round, or tab to it and use the arrow keys; or pick a band on a bank's table. Raw prices sit only on each bank's side - on the card above its vault and in its column of the readout. What crosses the floor is a commitment of the band, computed with real SHA-256 in this page. The demo salt is public, so these demo commitments are guessable; a real salt comes from a corridor secret that belongs to the two banks and is never held by the operator. On the live rail a clear also needs a witness with no stake in the price.
What comes back

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 →

Reconciled

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.

Divergent

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.

Undetermined

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 problem

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.

EXPORTER'S BANKCUSTOMSIMPORTER'S BANK SEES THE INVOICESEES THE DECLARATIONSEES THE PAYMENT MIRROR CREATES THE JOIN,NEVER THE DOCUMENTS
Also between banks

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 financing
How it works

Three steps. Only one of them leaves the bank.

01

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.

Runs on your own machine
02

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.

Runs at the operator
03

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.

Checkable by anyone, offline
Your bank YOUR MACHINE · THE PRICE STAYS Mirror, blind SEES ONLY SEALED CODES The signed answer APPEND-ONLY PUBLIC LOG 121.52 sealed code (of the band) SIGNED VERDICT

The full walkthrough, live →

The operator compares commitments. It never receives a price, a unit, or a band.

Proof, not adjectives

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.

ES256 · ECDSA P-256 over canonical JSON · in-browser kid …
The signed record

          
          
How the check runs
  1. 1Canonical byteskeys sortedthe exact bytes that were signed
  2. 2SHA-256a digest of themwhat ES256 signs
  3. 3Signaturer ‖ sbase64url to 64 bytes
  4. 4Public keyP-256chosen by its kid
  5. 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 →

Signature
…
Not checked
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.

A rail that only signs its accusations is a rail whose silence means nothing.

Safeguards

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.

What it catches

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.

Against the trade-based laundering typologies FATF names The full typology map →

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.

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 →

Questions a risk desk asks

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?
They do not exchange a key per shipment. When two banks ratify a corridor together, they establish a shared corridor secret. For a shipment, each bank independently derives the salt as 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?
Mirror bands a price on the basis the corridor fixes, and that basis — currency, unit, and terms — is part of what the two banks ratify when they agree the corridor. Converting an invoice to that agreed basis happens on each bank's own machine, before banding, with one public rate file the pair ratified: both banks fetch the same publisher's file, convert with exact arithmetic, and commit the file's hash with the leg — so two conversions made with different files are held undetermined instead of diverging by accident. The operator performs no conversion, and Mirror supplies no FX rate or freight offset of its own, because a rate it made up would be exactly that — a number it made up, which it refuses to do. A corridor is an agreement about the basis as much as about the bands (how the FX basis works).
We received a Divergent verdict. What is our workflow?
A divergence is a reason to look, routed into the review process you already run — never a filing decision. Mirror structurally cannot make that decision, because tipping-off is a criminal offence and a rail that held the decision would be a rail that could leak it. What you hold is a signed, offline-verifiable record of exactly what was flagged, under which ratified table, and when: defensible evidence for your file, not an instruction. A clear is the same in reverse — a record you can prove, never a guarantee of innocence.
Where is our data processed, and can we hold you to it?
Your trade values, documents and customers never reach the operator at all; it receives commitments, signatures and governance data. What it does receive is processed only in the EU, in a Cloudflare Durable Object restricted to the EU jurisdiction, and stored in Frankfurt (AWS eu-central-1). If that object cannot be reached, a request is refused rather than processed elsewhere. The operator signs this statement at 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 →
Where to go from here

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.

01 · When you have a counterparty

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 →
02 · When you want to try it alone

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 →
03 · When you are still deciding

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.