Skip to content

Ronit-Raj9/param-new

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

186 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PARAM β€” Academic Credential Management System

PARAM

Blockchain-Based Academic Credential Verification for ABV-IIITM Gwalior

Next.js Express.js PostgreSQL TypeScript Ethereum License

Features β€’ Architecture β€’ Getting Started β€’ User Guides β€’ API Reference


πŸ“‹ Overview

PARAM (Portal for Academic Records and Management) is a comprehensive, blockchain-based academic credential management system designed for universities and educational institutions. Built for ABV-Indian Institute of Information Technology and Management Gwalior, PARAM enables tamper-proof issuance, verification, and sharing of academic credentials including semester results, transcripts, and degree certificates.

Why PARAM?

  • Tamper-Proof: Academic credentials are minted as NFTs on the blockchain, ensuring immutability
  • Instant Verification: Employers and institutions can verify credentials in seconds using a public link
  • Zero Student Friction: Students never need wallets or crypto knowledge β€” credentials are issued to institute-managed wallets
  • Audit Trail: Every action is logged with immutable audit records for compliance
  • Multi-Level Approvals: Configurable approval workflows ensure proper oversight before credential issuance

✨ Features

πŸŽ“ Academic Credential Management

Feature Description
Semester Results Upload, review, approve, and issue semester-wise academic transcripts
Degree Certificates Multi-approval workflow for degree issuance with eligibility validation
Curriculum Versioning Manage program curricula with version control (DRAFT β†’ ACTIVE β†’ ARCHIVED)
Grade Management Configurable grading scales with automatic SGPA/CGPA calculation

⛓️ Blockchain & NFT Credentials

Feature Description
ERC-721 Credentials Semester results and degrees minted as NFTs on Base Sepolia
Document Hash Anchoring SHA-256 hash of PDF stored on-chain for integrity verification
Credential Revocation Revoke credentials with reason; link to replacement credential
Wallet Auto-Provisioning Privy-managed wallets created automatically for students
Batch Minting Efficient bulk issuance with gas estimation

πŸ‘₯ User Roles & Access Control

Role Capabilities
ADMIN Full system access, credential issuance, system settings, user management
ACADEMIC Upload students/results, manage curriculum, propose degrees, first-level approvals
STUDENT View own results, download transcripts, share credentials, request corrections
VERIFIER Public credential verification (no login required)

πŸ”„ Workflow & Approvals

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    SEMESTER RESULT WORKFLOW                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   CSV Upload β†’ DRAFT β†’ REVIEWED β†’ APPROVED β†’ ISSUED (NFT)       β”‚
β”‚                   β”‚         β”‚          β”‚                         β”‚
β”‚                   └─ Fix ───┴── Reject ┴── (Withheld)           β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    DEGREE PROPOSAL WORKFLOW                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   Propose β†’ PENDING_ACADEMIC β†’ PENDING_ADMIN β†’ APPROVED β†’ ISSUEDβ”‚
β”‚                    β”‚                 β”‚              β”‚            β”‚
β”‚                    └── Reject ───────┴── Reject β”€β”€β”€β”€β”˜            β”‚
β”‚                                                                  β”‚
β”‚   Credit Validation: Total credits β‰₯ required, No backlogs      β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”— Public Verification

  • Shareable Links: Time-limited verification URLs (7/30/90 days or custom)
  • QR Code Support: Embed verification QR on PDF credentials
  • API Verification: Machine-readable JSON endpoint for automated verification
  • Trust Indicators: Shows blockchain transaction, IPFS CID, issuer information

πŸ“Š Additional Features

  • Bulk Operations: CSV upload for students and results with streaming validation
  • PDF Generation: Auto-generated transcripts with watermarks (DRAFT/APPROVED)
  • Audit Logs: Complete trail of all actions with filters and export
  • Correction Requests: Students can request grade corrections with approval workflow
  • Revaluation Support: Versioned course results for grade changes

πŸ—οΈ Architecture

System Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              PARAM ARCHITECTURE                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                        FRONTEND (Next.js 15)                         β”‚   β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚   β”‚
β”‚  β”‚  β”‚  Admin   β”‚ β”‚ Academic β”‚ β”‚ Student  β”‚ β”‚ Verify   β”‚ β”‚  Auth    β”‚  β”‚   β”‚
β”‚  β”‚  β”‚Dashboard β”‚ β”‚  Portal  β”‚ β”‚  Portal  β”‚ β”‚  (Public)β”‚ β”‚ (Privy)  β”‚  β”‚   β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                    β”‚                                         β”‚
β”‚                                    β”‚ REST API + Bearer Token                 β”‚
β”‚                                    β–Ό                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                       BACKEND (Express.js 5)                         β”‚   β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚   β”‚
β”‚  β”‚  β”‚                         API MODULES                              β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”‚ Auth β”‚ β”‚Users β”‚ β”‚Studentβ”‚ β”‚Results β”‚ β”‚Issuanceβ”‚ β”‚Verify β”‚  β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”‚Degreeβ”‚ β”‚Curricβ”‚ β”‚Approveβ”‚ β”‚Credent.β”‚ β”‚ Audit  β”‚ β”‚Settingβ”‚  β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚   β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   β”‚
β”‚  β”‚                                                                       β”‚   β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚   β”‚
β”‚  β”‚  β”‚                      BACKGROUND WORKERS (BullMQ)                β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”‚Blockchainβ”‚ β”‚   CSV    β”‚ β”‚   PDF    β”‚ β”‚  Wallet  β”‚          β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β”‚  Worker  β”‚ β”‚  Worker  β”‚ β”‚  Worker  β”‚ β”‚  Worker  β”‚          β”‚ β”‚   β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ β”‚   β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                      β”‚                    β”‚                                  β”‚
β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚                                  β”‚
β”‚          β–Ό                       β–Ό        β–Ό                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚  PostgreSQL   β”‚      β”‚    Redis      β”‚ β”‚    Privy       β”‚                β”‚
β”‚  β”‚  (Prisma ORM) β”‚      β”‚ (Queue/Cache) β”‚ β”‚ (Auth+Wallets) β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                  β”‚                           β”‚
β”‚                                                  β–Ό                           β”‚
β”‚                               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚                               β”‚    Ethereum (Base Sepolia)   β”‚              β”‚
β”‚                               β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚              β”‚
β”‚                               β”‚  β”‚Semester  β”‚ β”‚ Degree   β”‚   β”‚              β”‚
β”‚                               β”‚  β”‚NFT (721) β”‚ β”‚NFT (721) β”‚   β”‚              β”‚
β”‚                               β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚              β”‚
β”‚                               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

Layer Technology
Frontend Next.js 15, TypeScript, TailwindCSS, shadcn/ui, TanStack Query
Backend Express.js 5, TypeScript, Prisma ORM
Database PostgreSQL 15+
Queue Redis + BullMQ
Authentication Privy (embedded wallets + social login)
Blockchain Ethers.js 6, Base Sepolia (Chain ID: 84532)
PDF Puppeteer
Storage IPFS via Pinata

πŸ“ Project Structure

param/
β”œβ”€β”€ backend/                          # Express.js API Server
β”‚   β”œβ”€β”€ prisma/
β”‚   β”‚   β”œβ”€β”€ schema.prisma             # Database schema (30+ models)
β”‚   β”‚   └── migrations/               # Database migrations
β”‚   β”œβ”€β”€ scripts/
β”‚   β”‚   β”œβ”€β”€ seed.ts                   # Database seeding
β”‚   β”‚   └── verify-env.ts             # Environment validation
β”‚   └── src/
β”‚       β”œβ”€β”€ config/                   # Configuration
β”‚       β”‚   β”œβ”€β”€ env.ts                # Environment variables
β”‚       β”‚   β”œβ”€β”€ database.ts           # Prisma client
β”‚       β”‚   β”œβ”€β”€ redis.ts              # Redis connection
β”‚       β”‚   β”œβ”€β”€ privy.ts              # Privy client (auth + wallets)
β”‚       β”‚   └── blockchain.ts         # Ethers.js + contract config
β”‚       β”œβ”€β”€ middleware/
β”‚       β”‚   β”œβ”€β”€ error.handler.ts      # Global error handling
β”‚       β”‚   β”œβ”€β”€ request.context.ts    # Privy token verification
β”‚       β”‚   └── role.guard.ts         # Role-based access control
β”‚       β”œβ”€β”€ modules/                  # Feature modules
β”‚       β”‚   β”œβ”€β”€ auth/                 # Authentication (Privy)
β”‚       β”‚   β”œβ”€β”€ users/                # User management
β”‚       β”‚   β”œβ”€β”€ students/             # Student registry
β”‚       β”‚   β”œβ”€β”€ curriculum/           # Programs & courses
β”‚       β”‚   β”œβ”€β”€ results/              # Semester results
β”‚       β”‚   β”œβ”€β”€ approvals/            # Approval workflows
β”‚       β”‚   β”œβ”€β”€ degrees/              # Degree proposals
β”‚       β”‚   β”œβ”€β”€ credentials/          # Issued credentials
β”‚       β”‚   β”œβ”€β”€ issuance/             # Blockchain minting
β”‚       β”‚   β”œβ”€β”€ verification/         # Public verification
β”‚       β”‚   β”œβ”€β”€ audit/                # Audit logging
β”‚       β”‚   β”œβ”€β”€ dashboard/            # Dashboard aggregations
β”‚       β”‚   └── settings/             # System settings
β”‚       β”œβ”€β”€ jobs/                     # Background workers
β”‚       β”‚   β”œβ”€β”€ blockchain/           # NFT minting worker
β”‚       β”‚   β”œβ”€β”€ csv/                  # CSV parsing worker
β”‚       β”‚   β”œβ”€β”€ pdf/                  # PDF generation worker
β”‚       β”‚   └── wallet/               # Wallet creation worker
β”‚       β”œβ”€β”€ services/                 # Shared services
β”‚       └── types/                    # TypeScript types
β”‚
β”œβ”€β”€ frontend/                         # Next.js Application
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ (admin)/                  # Admin routes
β”‚   β”‚   β”‚   └── admin/
β”‚   β”‚   β”‚       β”œβ”€β”€ page.tsx          # Admin dashboard
β”‚   β”‚   β”‚       β”œβ”€β”€ students/         # Student management
β”‚   β”‚   β”‚       β”œβ”€β”€ results/          # Results upload & preview
β”‚   β”‚   β”‚       β”œβ”€β”€ approve/          # Approval queue
β”‚   β”‚   β”‚       β”œβ”€β”€ issuance/         # Credential issuance
β”‚   β”‚   β”‚       β”œβ”€β”€ curriculum/       # Curriculum management
β”‚   β”‚   β”‚       β”œβ”€β”€ logs/             # Audit logs
β”‚   β”‚   β”‚       └── settings/         # System settings
β”‚   β”‚   β”œβ”€β”€ (auth)/                   # Auth routes
β”‚   β”‚   β”‚   β”œβ”€β”€ login/                # Login page
β”‚   β”‚   β”‚   └── activate/             # Account activation
β”‚   β”‚   β”œβ”€β”€ (student)/                # Student routes
β”‚   β”‚   β”‚   └── student/
β”‚   β”‚   β”‚       β”œβ”€β”€ page.tsx          # Student dashboard
β”‚   β”‚   β”‚       β”œβ”€β”€ results/          # View results
β”‚   β”‚   β”‚       β”œβ”€β”€ degree/           # View degree
β”‚   β”‚   β”‚       └── share/            # Manage share links
β”‚   β”‚   β”œβ”€β”€ verify/[token]/           # Public verification
β”‚   β”‚   β”œβ”€β”€ docs/                     # Documentation
β”‚   β”‚   └── support/                  # Support page
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ admin/                    # Admin-specific components
β”‚   β”‚   β”œβ”€β”€ auth/                     # Authentication components
β”‚   β”‚   β”œβ”€β”€ credentials/              # Credential display
β”‚   β”‚   β”œβ”€β”€ dashboard/                # Dashboard widgets
β”‚   β”‚   β”œβ”€β”€ forms/                    # Form components
β”‚   β”‚   β”œβ”€β”€ landing/                  # Landing page sections
β”‚   β”‚   β”œβ”€β”€ layout/                   # Navigation & layout
β”‚   β”‚   β”œβ”€β”€ modals/                   # Modal dialogs
β”‚   β”‚   β”œβ”€β”€ results/                  # Results display
β”‚   β”‚   β”œβ”€β”€ shared/                   # Shared components
β”‚   β”‚   β”œβ”€β”€ upload/                   # File upload components
β”‚   β”‚   └── ui/                       # shadcn/ui primitives
β”‚   β”œβ”€β”€ hooks/                        # Custom React hooks
β”‚   β”œβ”€β”€ lib/                          # Utilities & API client
β”‚   β”œβ”€β”€ providers/                    # Context providers
β”‚   └── types/                        # TypeScript types
β”‚
└── README.md                         # This file

πŸ—„οΈ Database Schema

Entity Relationship Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           DATABASE SCHEMA                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚   User    β”‚ 1:1     β”‚  Student  β”‚ N:1     β”‚      Program      β”‚     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Άβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Άβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”‚
β”‚  β”‚ privyId   β”‚         β”‚ enrollmentβ”‚         β”‚ code              β”‚     β”‚
β”‚  β”‚ email     β”‚         β”‚ batch     β”‚         β”‚ name              β”‚     β”‚
β”‚  β”‚ role      β”‚         β”‚ cgpa      β”‚         β”‚ durationYears     β”‚     β”‚
β”‚  β”‚ status    β”‚         β”‚ wallet*   β”‚         β”‚ totalCredits      β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                              β”‚                         β”‚               β”‚
β”‚                              β”‚ N:1                     β”‚ 1:N           β”‚
β”‚                              β–Ό                         β–Ό               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  SemesterResult   β”‚ β”‚    Curriculum     β”‚ β”‚CurriculumSemester β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚ semester          β”‚ β”‚ version           β”‚ β”‚ semesterNumber    β”‚    β”‚
β”‚  β”‚ sgpa/cgpa         β”‚ β”‚ batch             β”‚ β”‚ minCredits        β”‚    β”‚
β”‚  β”‚ status            β”‚ β”‚ status            β”‚ β”‚ maxCredits        β”‚    β”‚
β”‚  β”‚ documentHash      β”‚ β”‚ documentHash      β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚ 1:N          β”‚
β”‚            β”‚ 1:N                                       β–Ό              β”‚
β”‚            β–Ό                                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”‚      Course       β”‚    β”‚
β”‚  β”‚   CourseResult    β”‚                       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                       β”‚ code              β”‚    β”‚
β”‚  β”‚ grade             β”‚                       β”‚ credits (L-T-P)   β”‚    β”‚
β”‚  β”‚ gradePoints       β”‚                       β”‚ type              β”‚    β”‚
β”‚  β”‚ earnedCredits     β”‚                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚  β”‚ version           β”‚                                                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β”‚
β”‚                                                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚
β”‚  β”‚    Credential     │◀────────│   DegreeProposal  β”‚                  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                  β”‚
β”‚  β”‚ type (SEM/DEGREE) β”‚         β”‚ status            β”‚                  β”‚
β”‚  β”‚ tokenId           β”‚         β”‚ totalCredits      β”‚                  β”‚
β”‚  β”‚ txHash            β”‚         β”‚ cgpa              β”‚                  β”‚
β”‚  β”‚ documentHash      β”‚         β”‚ hasBacklogs       β”‚                  β”‚
β”‚  β”‚ status            β”‚         β”‚ academicApproval  β”‚                  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚ adminApproval     β”‚                  β”‚
β”‚            β”‚ 1:N               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚
β”‚            β–Ό                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚
β”‚  β”‚    ShareLink      β”‚         β”‚     AuditLog      β”‚                  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                  β”‚
β”‚  β”‚ token             β”‚         β”‚ action            β”‚                  β”‚
β”‚  β”‚ expiresAt         β”‚         β”‚ entityType/Id     β”‚                  β”‚
β”‚  β”‚ viewCount         β”‚         β”‚ metadata (JSON)   β”‚                  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚ ipAddress         β”‚                  β”‚
β”‚                                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Core Models

Model Purpose Key Fields
User Authentication & access privyId, email, role, status
Student Academic records enrollmentNumber, batch, cgpa, walletAddress
Program Degree programs code, name, totalCredits, durationYears
Curriculum Program curriculum version, batch, status, documentHash
Course Individual courses code, credits, type, L-T-P hours
SemesterResult Semester grades semester, sgpa, cgpa, status
CourseResult Course grades grade, gradePoints, earnedCredits, version
Credential Blockchain credentials tokenId, txHash, documentHash, status
DegreeProposal Degree applications status, validationPassed, approval fields
ShareLink Verification links token, expiresAt, viewCount
AuditLog Audit trail action, entityType, metadata
Job Background jobs type, status, progress

Status Enums

// User lifecycle
UserStatus: PENDING_ACTIVATION β†’ ACTIVE β†’ SUSPENDED | DEACTIVATED

// Student lifecycle  
StudentStatus: PENDING_ACTIVATION β†’ ACTIVE β†’ GRADUATED | DROPPED_OUT | ...

// Result workflow
ResultStatus: DRAFT β†’ REVIEWED β†’ APPROVED β†’ ISSUED | WITHHELD

// Curriculum lifecycle
CurriculumStatus: DRAFT β†’ ACTIVE β†’ ARCHIVED

// Credential states
CredentialStatus: PENDING β†’ ISSUED β†’ REVOKED | REPLACED

// Degree proposal workflow
DegreeProposalStatus: DRAFT β†’ PENDING_ACADEMIC β†’ PENDING_ADMIN β†’ APPROVED β†’ ISSUED | REJECTED

πŸ“„ Pages & Routes

Public Routes

Route Page Description
/ Landing Hero section, features, verification demo
/docs Documentation How-to guides, CSV templates
/support Support Contact form, FAQ
/verify/[token] Verification Public credential verification

Authentication Routes

Route Page Description
/login Login Privy login (email OTP, Google)
/activate Activation First-time account setup
/reset-password Reset Password reset flow

Admin Routes (/admin/*)

Route Page Description
/admin Dashboard Stats, pending actions, quick links
/admin/users Users Staff user management
/admin/students Students Student registry & search
/admin/students/upload Upload Bulk CSV student import
/admin/results/upload Upload CSV results upload
/admin/results/preview Preview Review draft results
/admin/approve Approvals Approval queue
/admin/issuance Issuance Mint credentials to blockchain
/admin/curriculum Curriculum Programs & courses
/admin/logs Audit Audit log viewer
/admin/settings Settings College & system config

Student Routes (/student/*)

Route Page Description
/student Dashboard Profile, CGPA, latest result
/student/results Results All semester results
/student/degree Degree Degree certificate
/student/share Share Manage share links
/student/profile Profile Personal settings

πŸš€ Getting Started

Prerequisites

  • Node.js 20+
  • PostgreSQL 15+
  • Redis 7+
  • pnpm (recommended) or npm

Installation

1. Clone the repository

git clone https://github.com/iiitm-gwalior/param.git
cd param

2. Backend Setup

cd backend
cp .env.example .env
# Edit .env with your configuration

pnpm install
npx prisma generate
npx prisma migrate dev
pnpm run seed    # Optional: seed test data
pnpm run dev     # API server on port 4000

3. Frontend Setup

cd frontend
cp .env.example .env.local
# Edit .env.local

pnpm install
pnpm run dev     # Next.js on port 3000

Environment Variables

Backend (.env)

# Database
DATABASE_URL="postgresql://user:password@localhost:5432/param"
DIRECT_URL="postgresql://user:password@localhost:5432/param"

# Redis
REDIS_URL="redis://localhost:6379"

# Privy (https://dashboard.privy.io)
PRIVY_APP_ID="your-privy-app-id"
PRIVY_APP_SECRET="your-privy-app-secret"
PRIVY_VERIFICATION_KEY="your-privy-verification-key"

# Blockchain (Base Sepolia)
CHAIN_ID=84532
RPC_URL="https://sepolia.base.org"
MINTER_PRIVATE_KEY="0x..."  # Minting wallet private key
CONTRACT_SEMESTER_ADDRESS="0x..."
CONTRACT_DEGREE_ADDRESS="0x..."

# IPFS (Pinata)
PINATA_API_KEY="your-pinata-api-key"
PINATA_SECRET_KEY="your-pinata-secret-key"

# App
PORT=4000
NODE_ENV=development
FRONTEND_URL="http://localhost:3000"

Frontend (.env.local)

NEXT_PUBLIC_API_URL="http://localhost:4000/api/v1"
NEXT_PUBLIC_PRIVY_APP_ID="your-privy-app-id"
NEXT_PUBLIC_CHAIN_ID=84532

Docker Setup

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f api

# With dev tools (pgAdmin, Redis Commander)
docker-compose --profile tools up -d

πŸ“– User Guides

πŸ‘¨β€πŸ’Ό Admin Workflow

1. Initial Setup

  1. Login at /login with admin credentials
  2. Navigate to /admin/settings to configure:
    • College information (name, logo, contact)
    • Blockchain settings (chain ID, contract addresses)
    • Approval workflow settings

2. Manage Curriculum

  1. Go to /admin/curriculum
  2. Create a Program (e.g., B.Tech CSE)
  3. Create a Curriculum Version for the program
  4. Add Semesters with credit limits
  5. Add Courses to each semester (code, credits, L-T-P, type)
  6. Set curriculum status to ACTIVE

3. Upload Students

  1. Navigate to /admin/students/upload
  2. Download the CSV template
  3. Fill in student data (enrollment, name, email, program, batch)
  4. Upload and preview for validation errors
  5. Process to create student records

4. Upload Results

  1. Go to /admin/results/upload
  2. Select program, batch, semester, and academic year
  3. Download the semester-specific CSV template
  4. Fill in grades for each student and course
  5. Upload and validate
  6. Results are created in DRAFT status

5. Review & Approve Results

  1. Navigate to /admin/results/preview
  2. Review individual student results
  3. Make corrections if needed (creates new version)
  4. Submit for review (status β†’ REVIEWED)
  5. Go to /admin/approve
  6. Final approval (status β†’ APPROVED)

6. Issue Credentials

  1. Go to /admin/issuance
  2. Select credential type (Semester or Degree)
  3. Filter by program, batch, semester
  4. View gas estimation
  5. Issue selected credentials to blockchain
  6. Monitor job progress in real-time

7. Manage Degrees

  1. Navigate to /admin/degrees (via dashboard)
  2. System auto-validates eligible students:
    • Total credits β‰₯ program requirement
    • No backlogs (F grades)
    • All semesters issued
  3. Create degree proposals
  4. Academic staff approves first
  5. Admin gives final approval
  6. Issue degree NFT

πŸ‘©β€πŸŽ“ Student Workflow

  1. Activate Account: Receive activation email β†’ /activate
  2. View Dashboard: /student shows CGPA, credits, latest result
  3. View Results: /student/results β€” all semester grades with details
  4. View Degree: /student/degree β€” degree status or certificate
  5. Share Credentials: /student/share β€” create time-limited links
  6. Request Corrections: Submit grade correction requests if needed

πŸ” Public Verification

  1. Receive share link (e.g., https://param.iiitm.ac.in/verify/abc123)
  2. View verified credential with:
    • Student name & program
    • Semester/Degree details
    • SGPA/CGPA
    • Blockchain transaction proof
    • Issuer information
  3. API verification: GET /api/v1/verify?token=abc123

πŸ”Œ API Reference

Base URL

http://localhost:4000/api/v1

Authentication

All authenticated endpoints require:

Authorization: Bearer <privy-access-token>

Key Endpoints

Authentication

Method Endpoint Access Description
POST /auth/login Public Authenticate with Privy token
GET /auth/me Auth Get current user profile
POST /auth/logout Auth Logout

Students

Method Endpoint Access Description
GET /students Admin/Academic List students (paginated)
POST /students Admin/Academic Create single student
POST /students/bulk Admin/Academic Bulk import from CSV
GET /students/:id Admin/Academic Get student details
GET /students/me Student Get own profile

Curriculum

Method Endpoint Access Description
GET /curriculum/programs Auth List programs
POST /curriculum/programs Academic Create program
GET /curriculum Auth List curricula
POST /curriculum Academic Create curriculum
POST /curriculum/:id/courses Academic Add course

Results

Method Endpoint Access Description
GET /results Admin/Academic List all results
POST /results/bulk Admin/Academic Bulk upload results
GET /results/me Student Get own results
PATCH /results/:id/status Admin/Academic Update result status
POST /results/me/correction Student Request correction

Credentials

Method Endpoint Access Description
GET /credentials Admin/Academic List credentials
GET /credentials/me Student Get own credentials
POST /credentials/share Student Create share link
DELETE /credentials/shares/:id Student Revoke share link

Issuance

Method Endpoint Access Description
GET /issuance/eligible Admin/Academic Get eligible students
POST /issuance/single Admin Issue single credential
POST /issuance/bulk Admin Bulk issue credentials
GET /issuance/estimate Admin/Academic Estimate gas costs

Verification (Public)

Method Endpoint Access Description
GET /verify/:token Public Verify by share token
POST /verify/hash Public Verify by document hash
POST /verify/token Public Verify by NFT token ID

Degrees

Method Endpoint Access Description
GET /degrees Admin/Academic List proposals
POST /degrees Admin/Academic Create proposal
GET /degrees/eligibility/:studentId Admin/Academic Check eligibility
PATCH /degrees/:id/academic Academic Academic approval
PATCH /degrees/:id/admin Admin Final approval

Audit

Method Endpoint Access Description
GET /audit Admin Get audit logs
GET /audit/:entityType/:entityId Admin Get entity history

πŸ“Š Background Jobs

Queue Concurrency Purpose
blockchain 1 NFT minting & revocation
csv 2 Bulk data parsing
pdf 3 Transcript generation
wallet 5 Privy wallet creation

Job Types

CSV_PARSE_STUDENTS      // Import students from CSV
CSV_PARSE_RESULTS       // Import results from CSV
PDF_GENERATE_SEMESTER   // Generate semester transcript
PDF_GENERATE_DEGREE     // Generate degree certificate
BLOCKCHAIN_MINT_SEMESTER // Mint semester NFT
BLOCKCHAIN_MINT_DEGREE   // Mint degree NFT
BLOCKCHAIN_REVOKE       // Revoke credential
WALLET_CREATE           // Create student wallet

πŸ“„ CSV Templates

Students Template

enrollment_number,name,personal_email,program_code,batch,admission_year,expected_grad_year
2024001,John Doe,john@email.com,BTECH_CSE,2024-2028,2024,2028
2024002,Jane Smith,jane@email.com,BTECH_CSE,2024-2028,2024,2028

Results Template

enrollment_number,CS301,CS302,CS303,CS304,MA301
2024001,A+,A,B+,A,A+
2024002,A,B+,A+,B,A

πŸ” Security

Authentication & Authorization

  • Privy Integration: Secure authentication via email OTP or social login
  • JWT Tokens: Short-lived access tokens with automatic refresh
  • Role-Based Access: Enforced at both API and UI levels
  • Request Context: All requests carry user context for audit

Blockchain Security

  • Institute Wallet: Credentials minted from secure, institute-controlled wallet
  • Document Hashing: SHA-256 hash anchored on-chain
  • Immutability: Once minted, credentials cannot be altered (only revoked)
  • Revocation Trail: Revoked credentials link to replacements

Data Protection

  • Audit Logging: Every action logged with actor, timestamp, IP
  • Soft Deletes: Critical data archived, not deleted
  • Encrypted Connections: TLS for all API communications
  • Input Validation: Zod schemas for all API inputs

πŸ§ͺ Testing

# Backend tests
cd backend
pnpm run test           # Unit tests
pnpm run test:e2e       # Integration tests
pnpm run test:coverage  # Coverage report

# Frontend tests
cd frontend
pnpm run test           # Component tests
pnpm run test:e2e       # E2E tests with Playwright

🚒 Deployment

Production Checklist

  • Configure production database (managed PostgreSQL)
  • Set up Redis cluster
  • Configure Privy production app
  • Deploy smart contracts to mainnet/production chain
  • Set up IPFS pinning service (Pinata)
  • Configure monitoring & alerting
  • Enable SSL/TLS
  • Set up backup jobs
  • Configure CDN for frontend

Recommended Infrastructure

  • API: Docker container on Kubernetes/ECS
  • Database: AWS RDS / Supabase / Neon
  • Redis: AWS ElastiCache / Upstash
  • Frontend: Vercel / Cloudflare Pages
  • Monitoring: Datadog / Sentry

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit changes (git commit -m 'Add amazing feature')
  4. Push to branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ“ž Support


πŸ“ License

MIT License β€” see LICENSE for details.


Built with ❀️ at ABV-IIITM Gwalior

Securing Academic Credentials on the Blockchain

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages