LOCAL-TRUE · not on-chain

Confidential credentials · selective disclosure

Veil Passport Studio

World-class educational studio for Midnight-style private credentials: issue a passport with sealed claims, present a public commitment, selectively disclose only what a verifier needs, then run predicate proofs (age ≥ N, membership ∈ set) — without claiming on-chain settlement, Lace, or a real Compact runtime. By @kshot9000 · nightdream.xyz.

I Issue S Disclose P Predicate ? Shortcuts D Donate
Honest scope: local HTML/JS simulation only. Does not run Compact, a proof server, Lace, or real ADA / DUST transfers. Does not claim GitHub Pages is live until Actions are enabled. Commitments, issuer signatures, and predicate π blobs are teaching stand-ins — verify against official Compact / Zswap crypto before shipping.

Passport journey

Labeled phases from idle → issued → presented → proven → revoked. Over-disclose and tamper are first-class teaching fails.

  1. 1
    Idle Compose claims
  2. 2
    Issued Commit + issuer sig (sim)
  3. 3
    Presented Public surface only
  4. 4
    Proven Predicate π · selective
  5. 5
    Revoked Nullifier burned

Phase: idle — issue a passport to begin.

What a confidential passport is really saying

Observers see the credential commitment, issuer stamp, and optional disclosed claims / predicate results. Raw age, role, membership, and salts stay local until you choose otherwise.

Private vault

Never leave the client in the dual-state model. Teaching stand-in: values you type below.

  • Claim openings (name, age, role…)
  • Credential salt & holder secret
  • Full issuer witness material

Public surface

What the simulated verifier / registry is allowed to see.

  • Credential commitment hash
  • Issuer signature (simulated)
  • Selected disclosed claims
  • Predicate results (age≥N, etc.)
  • Revocation nullifier (if burned)

Claim veil

How veiled individual claims stay after the last action.

100% veiled (no disclose)

Public rail

How much the verifier learned from commits + proofs.

0% public surface

Issue & seal a passport

Private claims → credential commit + simulated issuer stamp. Press I to focus.

Claims (vault)

Binds openings into the commitment without publishing them.

Live passport card

Midnight Veil Passport Idle

Issue a passport to seal claims into a commitment. Fields stay veiled until selective disclose.

commit: —

Selective disclosure

Pick only the claims a verifier needs. Over-disclose is a teaching warn. Press S.

Reveal set

Default: all veiled. Check claims to open locally (simulated selective disclose).

Disclosure theater

  1. 1
    Bind reveal set
    selected claim keys
    —
  2. 2
    Open selected
    openings stay scoped
    —
  3. 3
    Keep rest veiled
    vault retains salts
    —
  4. 4
    Update public rail
    meters refresh
    —
Awaiting disclosure…

Predicate / prove theater

Prove age ≥ N or membership ∈ set without revealing the raw claim. Simulated π only. Press P.

Choose predicate

Verifier learns only whether age ≥ this number.
  1. 1
    Load witness
    claim + salt local
    —
  2. 2
    Evaluate gate
    predicate true/false
    —
  3. 3
    Bind to commit
    credential hash
    —
  4. 4
    Emit π
    SIMULATED · SHA-256
    —

0% — idle

No predicate yet

—

LOCAL STUB · simulated certification only.

Verifier view

Waiting for presentation Issue and present a passport. The verifier sees commit + issuer stamp — not vault claims — until you disclose or prove.
Awaiting prove…

Passport board

Schema v2 localStorage · BroadcastChannel sync · JSON export/import. LOCAL-TRUE ≠ on-chain. Clear anytime — nothing left the browser.

Issued: 0 Presented: 0 Proven: 0 Revoked: 0

Anti-pattern vs safe pattern

Teaching sketches — not deployable Compact. Always verify against official docs.

✗ Anti-pattern — publish all claims
// BAD: verifier sees every attribute
ledger {
  holder: Bytes<32>;
  age: Uint<8>;       // exact age leaked
  role: Bytes<16>;    // role leaked
  membership: Bytes<8>;
}
✓ Safer sketch — commit + selective + predicate
// BETTER (sketch): public commit only
ledger {
  credCommit: Bytes<32>;
  issuerSig: Bytes<64>;
  revokeNull: Bytes<32>; // optional
}
witness age: Uint<8>;
witness salt: Bytes<32>;
// prove age >= 18 without publishing age
// selectively open role only when needed

These snippets are educational illustrations. Official Compact syntax, circuits, and Zswap commitments may differ — check Midnight docs before shipping.