Eliminate credential fraud with blockchain-powered Soulbound Tokens (SBTs)
CredVerify provides educational institutions with a modern, gasless, and fraud-proof way to issue verifiable digital certificates.
Unlike traditional NFTs, CredVerify certificates are non-transferable tokens bound to the recipient's identity. Built on ERC-721 with transfer restrictions, these credentials cannot be sold, traded, or transferredβensuring authentic ownership.
- No crypto knowledge required: Students claim certificates using familiar Gmail/Twitter login
- Gasless claiming: Institution sponsors all blockchain transaction costs
- One-click verification: QR codes and public URLs for instant credential verification
- Mobile-optimized: Full QR scanning support for on-the-go verification
- Email hashing: Student emails are hashed using deterministic salting before blockchain storage
- Selective disclosure: Only authorized parties see full credential details
- IPFS metadata: Decentralized storage ensures data persistence without central servers
- Encrypted storage: Sensitive data encrypted at rest using DEK/KEK hierarchy
- Async queue processing: BullMQ-powered background job system handles thousands of certificates
- Batch issuance: CSV upload supports bulk credential generation
- Redis-backed caching: Sub-100ms verification response times
- CDN-optimized: Certificate images served via IPFS gateway with caching
- Drag-and-drop editor: Visual template builder for branded certificates
- Dynamic field positioning: Place recipient name, date, and custom fields anywhere
- Multi-template support: Gold, Silver, Bronze, and unlimited custom templates
- Per-credential customization: Override templates on individual certificates
- Renameable fields: Double-click custom field names to rename them
- Auto-injected credential ID: QR codes automatically include credential IDs for custom templates
- CredVerify branding: Prominent logo placement with bordered QR codes for easy scanning
- Supabase Storage integration: Templates and backgrounds stored in cloud storage
- Granular revocation: Instant on-chain revocation with public/private reasons
- Audit trail: Immutable blockchain event logs for compliance
- Role-based access: Super admin, institution, and student permission levels
- Approval workflow: Admin-approved institution onboarding process
- CSV Batch Upload: Issue hundreds of certificates at once via spreadsheet
- Manual Entry: Single credential creation for special cases
- Custom Fields: Add institution-specific fields (honors, major, license numbers)
- Template Selection: Choose from standard templates or create custom designs
- Real-time Preview: See exactly how certificates will look before issuing
- Progress Tracking: Monitor batch processing status in dashboard
- Certificate Type Analytics: View distribution by certificate type (degrees, licenses, diplomas)
- Issuance Statistics: Track certificates issued, claimed, and pending
- Time-series Graphs: Visualize credential distribution over time
- Certificate Type Breakdown: Bar charts showing credentials by type (not just degrees)
- Audit Logs: Complete transaction history with blockchain verification
- Verification Counter: Track how many times your credentials have been verified
- Recent Activity: Real-time feed of certificate issuances and claims
- Search & Filter: Find credentials by recipient, date, or type
- Revocation System: Instantly revoke credentials with reason logging
- Status Monitoring: Track minted, pending, and revoked states
- Batch Operations: Bulk actions on credential sets
- Template Management: Create, edit, and archive certificate templates
- Email Notifications: Automatic claim emails with secure links
- One-Click Claim: Mint credentials to Web3Auth wallet with zero gas fees
- Profile Dashboard: View all earned credentials in one place
- Modern Statistics: Clean 3-card layout showing Total, Claimed, and Pending certificates
- Download Options: Export as PDF or high-resolution PNG
- Social Sharing: LinkedIn-optimized credential cards
- Real Activity Feed: See recent certificate issuances and revocations (no placeholders!)
- Full-Screen Preview: Zoom, pan, and download certificates in a lightbox viewer
- Privacy-First Public Profiles: Secure shareable URLs using random IDs (e.g.,
credverify.com/u/aB3xF9k2pQ1m) - Enhanced QR Codes: Prominently bordered QR codes with embedded credential IDs
- Live Status: Real-time blockchain verification on every view
- Revocation Awareness: Clear indicators if credential is revoked (expandable section in My Credentials)
- Blockchain Explorer: Direct links to Polygon Amoy Testnet transactions
- One-Click Share: Copy secure profile link to clipboard from dashboard
- QR Scan: Mobile camera verification in under 3 seconds
- URL Lookup: Paste credential URL to verify authenticity
- Blockchain Proof: View transaction hash, block number, and timestamp
- Institution Verification: Confirm issuing institution's identity on Polygon Amoy Testnet
- Tamper Detection: Automatic IPFS hash comparison
- Credential ID Display: Every certificate shows its unique identifier for manual verification
website/
βββ app/ # App Router pages
β βββ student/ # Student dashboard, certificates, profile
β βββ university/ # Institution dashboard, issuance, templates
β βββ admin/ # Super admin panel
β βββ verify/[id]/ # Public verification pages
β βββ claim/[id]/ # Gasless claiming flow
βββ components/
β βββ templates/ # Template editor components
β βββ certificate-card.tsx
β βββ clipped-card.tsx # Custom UI components
βββ context/
βββ AuthContext.tsx # Web3Auth + role-based auth
Key Technologies:
- Next.js 16: App Router, Server Components, React 19
- shadcn/ui: Accessible component library (Radix UI + Tailwind)
- Web3Auth: Embedded wallet (no browser extension required)
- ethers.js: Smart contract interactions
- Tailwind CSS: Utility-first styling
server/
βββ src/
β βββ routes/ # API endpoints
β βββ services/
β β βββ certificate-generator-puppeteer.ts # PDF/PNG generation
β β βββ email.service.ts # Nodemailer integration
β β βββ storacha.service.ts # IPFS uploads
β βββ workers/
β β βββ credential-worker.ts # BullMQ job processor
β βββ queues/
β βββ credential-queue.ts # Job queue management
βββ assets/
β βββ templates/ # Gold, Silver, Bronze HTML templates
βββ migrations/ # Supabase SQL migrations
Key Technologies:
- Express.js: RESTful API server
- BullMQ: Redis-backed job queue for async processing
- Puppeteer: Headless Chrome for certificate rendering
- Storacha (w3up): IPFS client for decentralized storage
- Nodemailer: Email notifications via Gmail SMTP
- jose: JWT verification for Web3Auth tokens
contracts/
βββ contracts/
β βββ CredentialSBT.sol # ERC-721 Soulbound Token
βββ scripts/
β βββ deploy.ts # Hardhat deployment script
βββ test/
βββ CredentialSBT.test.ts # Contract test suite
Smart Contract Features:
- Soulbound: Overrides
_beforeTokenTransferto prevent transfers - Gasless: ERC-2771 meta-transaction support (Biconomy)
- Revocable:
revokeCredential()function for institutions - On-chain metadata: IPFS CID stored in contract events
- Enumerable: Query all tokens owned by an address
Deployed Contract: 0x96a16c773b5EA4A9A3d0bD56D7e4C0cb989D3d39 (Polygon Amoy)
-- Core Tables
certificates # Certificate records with encryption metadata
institutions # Verified institutions
users # Students, institutions, admins
institution_templates # Custom certificate templates
invite_tokens # Institution invite system
audit_log # Immutable action history
certificate_views # Verification analyticsKey Features:
- Row-Level Security (RLS): Fine-grained access control
- Real-time subscriptions: Live dashboard updates
- Storage bucket: Template backgrounds and assets
- Full-text search: Certificate lookup by name/email
β
Private Public Profile URLs: Profile URLs now use secure NanoID-style random IDs (/u/aB3xF9k2pQ1m) instead of exposing email addresses
β
Auto-generated public_id: Database trigger auto-assigns secure IDs to new users
β
Masked Wallet Addresses: Public profiles show only first 6 and last 4 characters (0x742d...5f9a)
β
Legacy URL Redirects: Old email/wallet-based URLs automatically redirect to secure public_id URLs
β
Full-Screen Lightbox: Preview certificates with zoom, pan, and download controls
β
Keyboard Navigation: ESC to close, scroll to zoom
β
Touch Gestures: Pinch to zoom on mobile devices
β
IPFS Integration: Direct preview from decentralized storage
β
Modern 3-Card Stats Layout: Student dashboard now uses responsive grid (Total/Claimed/Pending)
β
Real Recent Activity: Activity feed pulls actual certificate data (issuances, claims, revocations)
β
Revoked Credentials Section: Moved to My Credentials page with expandable UI (shows 2, "Show All" if more)
β
Consistent Share Button: Same styling across Dashboard and My Credentials pages
β
Removed Fake Data: Eliminated placeholder charts and fake counters
β
Prominent QR Codes with Borders: All certificates now feature bordered QR codes with enhanced visibility
β
Auto-injected Credential IDs: Credential IDs automatically appear below QR codes (no template modification needed)
β
CredVerify Logo Styling: Purple gradient logo badges with white borders for brand consistency
β
Custom Template Support: Credential IDs inject dynamically for both standard and custom templates
β
Polygon Amoy Testnet Labels: All pages correctly display "Polygon Amoy Testnet"
β
Verified Contract Addresses: Updated to match actual deployment on Amoy
β
Polygonscan Integration: Direct links to Amoy explorer for all transactions
β
Field Name Alignment: Backend and frontend now use consistent field names (studentName, credentialTitle)
β
Database Migration: Existing templates auto-migrated to new field naming convention
β
Supabase Storage Integration: Templates stored in institution-assets bucket
β
Revoke Modal Styling: Fixed transparent dropdown and button color issues
β
Institution Dashboard: Removed unnecessary verifications counter, 3-card grid layout
β
Certificate Type Analytics: Institution dashboards show "Certificate Type" (not "Degree Type")
- Node.js v20+ and npm
- PostgreSQL (via Supabase account)
- Redis server (local or cloud)
- Metamask wallet (for super admin)
- Gmail account (for SMTP emails)
git clone https://github.com/yourusername/credverify.git
cd credverify# Backend
cd server && npm install
# Frontend
cd ../website && npm install# Database
DATABASE_URL=postgresql://...
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_KEY=your-service-role-key
# Blockchain (Polygon Amoy Testnet)
RPC_URL=https://rpc-amoy.polygon.technology
CONTRACT_ADDRESS=0x96a16c773b5EA4A9A3d0bD56D7e4C0cb989D3d39
MASTER_WALLET_PRIVATE_KEY=your-private-key
# IPFS (Storacha)
W3UP_EMAIL=your-email@example.com
# Email
SMTP_USER=your-gmail@gmail.com
SMTP_PASS=your-app-specific-password
# Encryption
MASTER_KEK_BASE64=<generate with scripts/generate-master-key.js>
# Queue
REDIS_HOST=localhost
REDIS_PORT=6379NEXT_PUBLIC_BACKEND_API_URL=http://localhost:3001
NEXT_PUBLIC_WEB3AUTH_CLIENT_ID=your-web3auth-client-id
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keycd server
# Run migrations (execute SQL files in migrations/ folder via Supabase dashboard)
# Or use Supabase CLI:
npx supabase db push# Via Supabase dashboard:
# 1. Go to Storage > Create bucket
# 2. Name: "institution-assets"
# 3. Make public: Yes
# 4. File size limit: 10MB
# 5. Allowed MIME types: image/jpeg, image/png, image/webpcd contracts
npx hardhat compile
npx hardhat run scripts/deploy.ts --network amoy# Terminal 1: Backend API
cd server && npm run dev
# Terminal 2: Worker (BullMQ)
cd server && npm run worker:watch
# Terminal 3: Frontend
cd website && npm run dev
# Terminal 4: Redis (if not running as service)
redis-server- Frontend: http://localhost:3000
- Backend API: http://localhost:3001
- Admin Dashboard: http://localhost:3000/admin
CredVerify/
βββ contracts/ # Solidity smart contracts
β βββ contracts/
β β βββ CredentialSBT.sol
β βββ scripts/deploy.ts
β βββ test/
βββ server/ # Backend Node.js API
β βββ src/
β β βββ routes/ # Express API routes
β β βββ services/ # Business logic
β β βββ workers/ # BullMQ job processors
β β βββ middleware/ # Auth, validation
β β βββ utils/ # Helpers
β βββ assets/
β β βββ templates/ # Certificate HTML templates
β βββ migrations/ # Database migrations
βββ website/ # Next.js frontend
β βββ app/ # App Router pages
β β βββ student/
β β βββ university/
β β βββ admin/
β β βββ verify/[id]/
β β βββ claim/[id]/
β βββ components/
β β βββ templates/ # Template editor
β β βββ dashboard/ # Dashboard widgets
β β βββ ui/ # shadcn components
β βββ context/
β βββ AuthContext.tsx
βββ README.md
- DEK/KEK Hierarchy: Each credential encrypted with unique Data Encryption Key (DEK), wrapped by master Key Encryption Key (KEK)
- AES-256-GCM: Authenticated encryption prevents tampering
- GDPR Compliance: Crypto-shredding support (delete DEK to make data unrecoverable)
- Web3Auth: Non-custodial wallet with social login
- JWT Verification: Backend validates Web3Auth tokens using JOSE
- Role-Based Access Control: Separate permissions for students, institutions, admins
- Email Hashing: SHA-256 with deterministic salt before blockchain storage
- Soulbound Tokens: Transfer-restricted ERC-721
- On-chain Revocation: Immutable revocation events
- Meta-transactions: Students claim without gas fees (Biconomy)
- Testnet-First: Polygon Amoy for risk-free development
GET /api/verify/:credentialId # Verify certificate
GET /api/certificate/:credentialId # Get certificate details
GET /api/student/certificates # List student's certificates
POST /api/student/claim/:claimToken # Claim certificate to wallet
GET /api/student/profile # Get student profile
POST /api/institution/issue # Issue single certificate
POST /api/institution/batch # Batch issue via CSV
GET /api/institution/stats # Dashboard analytics
POST /api/institution/revoke/:id # Revoke certificate
GET /api/institution/templates # List custom templates
POST /api/institution/templates # Create custom template
GET /api/admin/pending-institutions # Institutions awaiting approval
POST /api/admin/approve/:id # Approve institution
POST /api/admin/reject/:id # Reject institution
cd contracts
npx hardhat testcd server
npm testcd website
npx playwright testcd website
vercel --prodcd server
# Configure environment variables in Railway/Render dashboard
git push railway main # or deploy via Render dashboard- Already cloud-hosted, no separate deployment needed
- Configure RLS policies via Supabase dashboard
cd contracts
npx hardhat run scripts/deploy.ts --network amoy
# Note the deployed contract address for .env files- Register at
/university/registerusing Web3Auth - Fill institution details (name, country, accreditation)
- Wait for super admin approval
- Go to Dashboard > Templates > Create Template
- Upload background image (1920x1080px recommended)
- Drag fields to desired positions
- Double-click field labels to rename
- Save template
Single Issuance:
- Dashboard > Issue Certificate
- Enter student email, degree name, date
- Select template
- Preview and confirm
Batch Issuance:
- Download CSV template
- Fill with student data
- Upload CSV file
- Monitor batch progress
- Check email for certificate claim link
- Click "Claim Certificate" button
- Login with Gmail/Twitter (Web3Auth)
- Review certificate details
- Click "Claim to Wallet" (gasless!)
- Wait for blockchain confirmation
- Download PDF/PNG
- Share public URL
- Show QR code for instant verification
- Scan QR code with mobile camera
- View certificate details
- Check blockchain status (green = valid)
- Verify issuing institution
- Visit credverify.com/verify
- Paste certificate URL or credential ID
- View full details and blockchain proof
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use TypeScript for type safety
- Follow existing code style (ESLint + Prettier)
- Write tests for new features
- Update README for significant changes
This project is licensed under the MIT License - see the LICENSE file for details.
- Email: support@credverify.com
- Discord: Join our community
- Documentation: docs.credverify.com
- Issues: GitHub Issues
- Polygon for gasless transactions via Amoy testnet
- Web3Auth for seamless Web2-to-Web3 onboarding
- Supabase for robust PostgreSQL + Storage infrastructure
- Storacha (w3up) for decentralized IPFS storage
- shadcn/ui for beautiful, accessible components
Built with β€οΈ by the CredVerify Team