Mint, share, and verify verifiable credentials entirely in the browser. Colleges issue certificates to students; anyone can verify a certificate by its SHA-256 hash or by scanning its QR code.
Core features work fully client-side (no server, no database). Certificate hashes can additionally be anchored on Aptos, making verification tamper-proof and cross-browser via the Move smart contract in move/.
- Mint certificates with student ID, name, course, title, details, and issue date.
- Every certificate gets a unique SHA-256 hash at mint time.
- Search and filter issued certificates by name, ID, course, title, or hash.
- Print or export any certificate as a PDF (with QR code) via the print dialog.
- Look up certificates with a Student ID.
- See all certificates issued to that student.
- Copy a shareable verification link for each certificate.
- Verify any certificate via a URL query parameter:
?verify=<hash>. - Every certificate carries a QR code that points to its verification page.
- Connect an Aptos wallet (Petra) in the College view.
- Anchor any certificate's hash on-chain with one click; share links then carry the issuer address.
- The verification page checks the on-chain registry in addition to local storage.
- React + TypeScript + Vite.
- Three.js WebGL scene behind the landing (particles + floating credential cubes).
- Framer Motion for smooth entrance and scroll animations.
- Custom cursor, glitch text, and a dark cinematic theme.
- Aptos Move smart contract (
@aptos-labs/ts-sdk) for on-chain anchoring. - Lucide icons and QRCode.react for QR generation.
- LocalStorage for client-side persistence.
- Landing — choose your role (College or Student) over an animated Three.js scene.
- College — fill the mint form, then search/filter the issued list, copy share links, print a PDF, or anchor hashes on-chain with your Aptos wallet.
- Student — enter your student ID to see your certificates and share/verify them.
- Verify — open any share link (or scan any QR code) to confirm the certificate's integrity.
git clone https://github.com/Jayram2204/proofly.git
cd proofly
npm install
npm run devOpen http://localhost:5173 to use the app.
npm run build # type-checks and builds to dist/
npm run preview # serve the production build locallymove/
sources/credentials.move # Aptos Move anchoring contract
deploy.sh # deploy helper
src/
components/ # UI views: Landing, College, Student, Verify, Three.js scene
context/ # certificates state + persistence
hooks/ # wallet state
lib/ # hashing, search, links, aptos, wallet
types.ts # shared data types
The Three.js scene is lazy-loaded and only renders on the landing view. The Aptos SDK is also lazy-loaded — it only downloads when you anchor a hash or verify one on-chain.
Anchoring requires publishing the Move module in move/ to an Aptos account, then pointing the app at it.
curl -fsSL "https://aptos.dev/scripts/install_cli.py" | python3
aptos --versionaptos init --network devnet --profile proofly
# Faucet (devnet): https://aptos.dev/en/build/get-started/faucetaptos move compile --named-addresses proofly=default
aptos move publish --named-addresses proofly=default --profile proofly --assume-yesOr run ./move/deploy.sh devnet proofly.
Copy .env.example to .env.local and set the deployed module's address:
VITE_APTOS_NETWORK=devnet
VITE_MODULE_ADDRESS=0x<your-account-address>move/sources/credentials.move exposes:
anchor_hash(owner, hash)— stores a 64-char SHA-256 hash under the caller's account.has_hash(owner, hash): bool— on-chain lookup used by the verification page.
The SHA-256 digest is computed over a canonical form of the certificate data (student ID, name, course, title, details, issue date), so the same certificate always produces the same hash. Verification compares the hash in the URL/QR against the certificate store and, when anchored, against the Aptos registry.
- Revocation support.
- Bulk minting from CSV.