City services · credential verification
JRPermit desk operator

Privacy by design

Verify less.
Trust more.

Confirm a resident’s permit without collecting the rest of their identity. Every request is narrowly scoped, consented to, and cryptographically verified.

1Define policy
2Holder consent
3Trust decision

Step 1

What does this interaction need?

SD-JWT VC

Choose only the claims necessary to confirm a valid food-handler permit. Credential expiration is checked as signed metadata.

Requested claims

No resident data is stored by this demo

Under the surface

A real protocol path,
made legible.

The browser is the product surface. Rust carries the trust boundary. Every arrow below corresponds to a real local request or cryptographic check.

01VerifierPolicy → DCQL request
→
02WalletMatch → consent → disclose
→
03Trust engineSignature → binding → policy

Open-source integration

SpruceID on the critical path.

{ }

openid4vp

Authorization request, DCQL types, session correlation, wallet validation, and direct-post response.

⌁

ssi

SD-JWT parsing, ES256 issuer verification, and holder key-binding JWT validation.

✓

Application policy

Trusted issuer, credential type, expiration, freshness, and exact disclosure checks.

9:41
City Services WalletDemo
CP

Verification request

CivicProof is asking for information

Review what will be shared from your Food Handler Permit.

◉

Your date of birth and address stay in your wallet.

Bound to this request with a one-time nonce

Wallet credential

All signed claims

Only checked policy claims leave the wallet. Expiration is signed credential metadata evaluated by the verifier.