Turn claims about your skills, experience, projects and achievements into
W3C Verifiable Credentials signed by a real issuer and anchored on BNB Smart Chain,
which anyone can check, even without our server.
Live demo · Try it · How it works · Architecture · Getting started · Docs
Built for the Indonesia Web3 Hackathon by BNB Chain · track Consumer Apps
Anyone can write "Expert in Solidity" on a CV. Recruiters, campuses and clients can't tell which claims are real. Proven-ID links every claim to evidence, has a trusted issuer sign it, and anchors a fingerprint on-chain. Verifying a claim takes one click instead of a phone call.
|
Each credential is a W3C VC 2.0 / Open Badges 3.0 document, signed with EIP-712. Its |
Zero personal data on-chain: only |
Claude helps you write summaries, tailor your CV and classify evidence, using only your own data. Deterministic guardrails stop invented skills: "Skill detected — evidence not found." AI never grants Verified. Only issuers do. |
No wallet needed. Demo mode creates a sandbox account just for you.
- Open proven-id.vercel.app.
- Click Coba sebagai User. You get a profile (e.g. Salsa Maharani) with claims, an encrypted certificate and a pending verification request.
- Click Beralih ke Issuer demo and approve the request as XYZ Community. This sends a real transaction on BSC Testnet.
- Switch back to the user. The achievement now shows Terverifikasi with a QR code, a public verification page and an on-chain proof.
- Open the verification page and press Periksa ulang to verify independently, straight from the blockchain.
Or browse the sample profile: /p/arya-pratama.
flowchart LR
A["✍️ CLAIM<br/>skill · experience · project<br/>achievement · community"] --> B["📎 EVIDENCE<br/>PDF/PNG/JPG ≤ 4 MB<br/>SHA-256 + AES-256-GCM"]
B --> C["🧑⚖️ VERIFICATION<br/>registered issuer<br/>reviews the evidence"]
C --> D["📜 CREDENTIAL<br/>W3C VC 2.0 · Open Badges 3.0<br/>EIP-712 signature"]
D --> E["⛓️ PROOF<br/>sha256(JCS(vc)) anchored on<br/>BNB Smart Chain"]
E --> F["✅ PROVEN<br/>profile · QR · CV PDF<br/>verify anywhere"]
sequenceDiagram
autonumber
actor U as User
participant W as Proven-ID (Next.js + Fastify)
actor I as Issuer
participant C as BNB Smart Chain
U->>W: Sign-In with Ethereum (EIP-4361) or demo mode
U->>W: Add claim + upload evidence (hash, encrypt, custody log)
U->>W: Request verification from an issuer
I->>W: Review claim + evidence (optional AI hint)
I->>W: Approve
W->>C: CredentialRegistry.anchor(credentialHash, subjectRef) — bytes32 only
W-->>U: Signed VC (EIP-712) + tx proof
Note over U,C: Anyone: /verify/{id} → recompute hash in browser → read chain directly
| Status | Meaning |
|---|---|
UNVERIFIED · CLAIM_WITHOUT_EVIDENCE |
Claimed, no proof yet |
EVIDENCE_ATTACHED |
Evidence linked, not yet reviewed by a third party |
PENDING_ISSUER |
Waiting for the issuer |
VERIFIED |
Credential issued by a registered issuer and anchored on-chain |
EXPIRED · REVOKED |
Past validUntil, or revoked on-chain by the issuer |
Everything runs in the cloud on free tiers. No Docker, no servers to babysit.
flowchart TB
subgraph Browser
UI["Next.js 14 UI<br/>user · issuer · verifier"]
IV["Independent verifier<br/>(viem, in-browser)"]
end
subgraph Vercel["Vercel (sin1)"]
WEB["apps/web<br/>App Router"]
API["apps/api<br/>Fastify, mounted at /api/*"]
end
DB[("Neon Postgres<br/>Prisma")]
BSC[["BNB Smart Chain Testnet<br/>IssuerRegistry · CredentialRegistry · CredentialSBT"]]
LLM["Claude (optional)<br/>or deterministic mock"]
UI --> WEB --> API
API --> DB
API --> BSC
API --> LLM
IV -- "public RPC, no Proven-ID server" --> BSC
GH["GitHub Actions<br/>CI · E2E · ops (deploy, register, seed)"] -.-> Vercel
| Package | What's inside |
|---|---|
apps/web |
Next.js 14 App Router: landing, user dashboard, issuer dashboard, public profiles, verifier |
apps/api |
Fastify 4: SIWE auth, profiles, evidence vault, issuer flow, verification, AI, chain adapter |
packages/contracts |
Foundry: IssuerRegistry, CredentialRegistry, CredentialSBT + typed ABIs |
packages/vc |
Isomorphic VC toolkit: schema, JCS + SHA-256, EIP-712, verifyVC |
packages/ai |
LLM client (Claude / mock), versioned prompts, guardrails, eval set |
packages/db |
Prisma schema + migrations (Postgres 16) |
packages/ui |
"Ledger & Seal" design system: green theme, status badges, icons |
| Contract | Address |
|---|---|
IssuerRegistry |
0x69d3961b65dcfff10bf7a71d93375cAe4bE70dC3 |
CredentialRegistry |
0xcCbC054C107405F0BB8d7adCE3f780914e9Bf0d4 |
CredentialSBT |
0x5AaD146A14357a1ad91bBFEecB065e173cFc2811 |
- No PII on-chain. Only
bytes32,address,uint,bool. A system-level E2E test scans every registry log. - AI never invents. No skill or experience may appear that isn't in the user's own data.
- The issuer is the authority. Verified only comes from an issuer-signed credential.
- Private keys stay on the server. Never in the browser or in
NEXT_PUBLIC_*. - Deterministic hashes.
credentialHash = sha256(JCS(vc without proof)), with golden test vectors. - Human in the loop. AI output is never saved without the user's confirmation.
| Suite | Tests | Notes |
|---|---|---|
| Smart contracts (Foundry) | 46 | 100% coverage, fuzz tests on CredentialRegistry |
| API (Vitest + Postgres + Anvil) | 129 | ~96% coverage of services, real chain in CI |
| VC toolkit + AI guardrails | 36 | Golden vectors, prompt-injection and negative datasets |
| Web unit | 13 | CV model, explorer helpers, avatar route |
| End-to-end (Playwright) | 15 | Full core loop via UI, independent verify with the API down, tampering, revoke, privacy, demo mode |
Every pull request runs lint, typecheck, unit + integration tests (Postgres + Anvil), Foundry and Playwright on GitHub Actions.
You don't have to run anything locally. CI and the Vercel preview check every change. To hack on it:
# Node 22, pnpm 9 (corepack enable), Foundry, Postgres 16
pnpm install
cp .env.example .env # fill in values (never commit .env)
pnpm db:migrate && pnpm db:seed # local database + demo data
pnpm dev # web on :3000, API under /api/*
pnpm lint && pnpm typecheck && pnpm test
pnpm test:contracts # Foundry
anvil & pnpm contracts:deploy:local
pnpm e2e # Playwright (needs Postgres + Anvil)Deploying your own instance on BSC Testnet: see docs/DEPLOY-BSC-TESTNET.md.
| Doc | |
|---|---|
| PROVEN-WAVES.md | Product spec (§S1–§S17) and delivery plan in waves W0–W8 |
| DECISIONS.md | Architecture decision log (D-001 …) |
| PROGRESS.md | What shipped, wave by wave |
| DEPLOY-BSC-TESTNET.md | Wallets, secrets, contracts, Vercel, seed |
| DEMO-SCRIPT.md | 3-minute pitch demo script |
Docs are written in Bahasa Indonesia; code and comments are in English.
- SIWE login · encrypted evidence vault · issuer flow · on-chain anchoring · revocation
- Independent in-browser verification · public profiles · QR · verified CV PDF
- Honest AI assistant with guardrails · demo mode for judges
- Soulbound credential mint (
CredentialSBT) from the UI - Multi-issuer onboarding and issuer reputation
- Profile photo upload · recruiter-only visibility
- BNB Smart Chain mainnet / opBNB
Contributions are welcome! Please read CONTRIBUTING.md. For security issues, see SECURITY.md.
Avatars: DiceBear "Notionists" by Zoish (CC0 1.0) · Standard logos: Simple Icons (CC0 1.0) · Fonts: Plus Jakarta Sans (Tokotype, OFL), Instrument Serif (OFL). All people shown in the demo (Arya Pratama, Salsa Maharani, …) are fictional.
MIT © 2026 MrPrinceAli and Proven-ID contributors.







