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.