CertIntel is a full-stack web application that helps students upload, organize, and analyze their certificates and course credentials. It features AI-powered OCR to extract certificate data, role-based access for students and admins/teachers, a student–admin linking workflow, and automated email notifications — all in a polished, responsive UI.
![]() Login Screen |
![]() Student Home — Certificate Grid |
![]() PDF Upload Popup |
![]() AI Course Recommendations |
![]() AI Recommendations (continued) |
![]() Admin Dashboard |
- Multi-step registration with email OTP verification
- Role-based access: Student and Admin/Teacher
- Login, logout, and password reset flows
- Upload certificates as images or PDFs (PDFs auto-converted page-by-page)
- View all uploaded certificates in a grid layout
- Request to link with an admin using their unique shareable ID
- Receive email notifications on link request approval or rejection
- View and manage pending student link requests with real-time updates
- Accept or reject link requests
- Browse linked students' certificate collections
- Certificate OCR powered by the CertIntel Flask Server hosted on Hugging Face Spaces
- Course suggestions powered by AI analysis of certificate content
- Genkit AI flows for email OTP, registration, and image processing
- OTP emails during registration
- Registration confirmation
- Student notifications on admin link request outcomes
- Built with Tailwind CSS and ShadCN UI
- Custom theme: Gold, Light Beige, and Vivid Orange
- Fonts: Poppins (headlines) · Open Sans (body)
- Fully responsive across device sizes
| Layer | Technology |
|---|---|
| Frontend | Next.js 15, React 18, TypeScript, Tailwind CSS, ShadCN UI |
| Backend | Next.js API Routes, Firebase Admin SDK |
| AI / OCR | Python Flask (Hugging Face Space), Tesseract.js, Google Genkit, Cohere AI |
| Database | MongoDB (GridFS for file storage), Firebase Firestore |
| Auth | Firebase Authentication |
| Storage | Firebase Storage, MongoDB GridFS |
| Nodemailer (Gmail) | |
| Deployment | Vercel (Next.js), Firebase App Hosting, Hugging Face Spaces (Flask) |
- Node.js v18 or later
- npm, yarn, or pnpm
- A Firebase project with Auth, Firestore, and Storage enabled
- A MongoDB cluster (local or Atlas)
Flask AI Server: The OCR and AI suggestion backend is hosted on Hugging Face Spaces — no local Python setup required. Just point
NEXT_PUBLIC_FLASK_SERVER_URLat the Space URL. See the CertIntel Flask Server Space for details.
git clone https://github.com/gurupreetam9/CertIntel.git
cd CertIntelCopy the example env file and fill in your credentials:
cp .env .env.local
# or
cp .env.example .env.localOpen .env.local and fill in:
# Firebase (Client)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID= # Optional
# Firebase (Admin SDK)
GOOGLE_APPLICATION_CREDENTIALS= # Path to your service account JSON
# MongoDB
MONGODB_URI=
MONGODB_DB_NAME=certintel_db
# Flask AI Server (hosted on Hugging Face Spaces)
NEXT_PUBLIC_FLASK_SERVER_URL=https://gurupreetam-certintel-flask-server.hf.space
# Email (Gmail)
GMAIL_EMAIL_ADDRESS=
GMAIL_APP_PASSWORD=Tip on
GOOGLE_APPLICATION_CREDENTIALS: For local development, set this to the absolute path of your Firebase service account JSON file. In Firebase App Hosting or GCP environments, Application Default Credentials are used automatically.
npm install
# or
yarn install
# or
pnpm installNext.js frontend (runs on port 9005):
npm run devGenkit AI flows (optional, for AI flow development):
npm run genkit:dev
# or watch mode
npm run genkit:watchOpen http://localhost:9005 in your browser.
Flask AI Server: No local Python setup needed. The OCR and AI backend is hosted on Hugging Face Spaces — just make sure
NEXT_PUBLIC_FLASK_SERVER_URLis set correctly in your.env.local.
CertIntel/
├── src/
│ ├── app/ # Next.js App Router pages & API routes
│ │ ├── page.tsx # Home page (authenticated)
│ │ ├── login/ # Login page
│ │ ├── register/ # Multi-step registration
│ │ ├── forgot-password/ # Password reset
│ │ ├── profile-settings/ # User profile management
│ │ ├── admin/dashboard/ # Admin dashboard
│ │ ├── admin/student-certificates/[studentId]/
│ │ ├── ai-feature/ # AI certificate processing page
│ │ └── api/ # Backend API routes
│ ├── components/
│ │ ├── auth/ # AuthForm, ProtectedPage
│ │ ├── home/ # ImageGrid, UploadFAB, AiFAB, Modals
│ │ ├── layout/ # SiteHeader
│ │ ├── common/ # AppLogo and shared components
│ │ └── ui/ # ShadCN UI components
│ ├── lib/
│ │ ├── firebase/ # Firebase client & admin config
│ │ ├── mongodb.ts # MongoDB connection
│ │ ├── services/ # userService, emailUtils
│ │ └── models/ # TypeScript data models
│ ├── ai/
│ │ ├── flows/ # Genkit AI flows (OTP, registration, image)
│ │ ├── genkit.ts # Genkit global config
│ │ └── dev.ts # Genkit dev server entry point
│ ├── context/ # React Contexts (AuthContext)
│ ├── hooks/ # useAuth, useToast, useTheme, useMobile
│ └── types/ # TypeScript type definitions
├── app.py # Python Flask server (OCR & AI suggestions)
├── certificate_processor.py # Certificate processing module
├── firestore.rules # Firestore security rules
├── next.config.ts
├── tailwind.config.ts
└── tsconfig.json
| Command | Description |
|---|---|
npm run dev |
Start Next.js dev server on port 9005 |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
npm run typecheck |
TypeScript type check (no emit) |
npm run genkit:dev |
Start Genkit dev server |
npm run genkit:watch |
Start Genkit with file watching |
- Image Editor — Crop and resize functionality in upload modal
- Advanced MongoDB schemas — Refine
user_course_processing_resultsandmanual_course_names - Mobile camera upload — Improved camera vs. file manager UX on mobile
- Desktop folder upload — Batch upload support
- Robust error handling — Enhanced feedback for network and API failures
- Testing — Unit, integration, and end-to-end test coverage
- Production email service — Migrate from Gmail/Nodemailer to SendGrid or Mailgun
- Production Genkit deployment — Configure flows for production environments
- Persistent OTP storage — Replace in-memory OTP store with a database-backed solution
- Security hardening — Full Firestore rules audit and API endpoint hardening
Contributions are welcome! Please open an issue first to discuss what you'd like to change, then submit a pull request.
- Fork the repository
- Create your feature branch:
git checkout -b feature/your-feature - Commit your changes:
git commit -m 'Add some feature' - Push to the branch:
git push origin feature/your-feature - Open a pull request
This project is licensed under the PolyForm Noncommercial License 1.0.0. Commercial use is not permitted without explicit permission from the author.
See the LICENSE file for details.
Gurupreetam · @gurupreetam9





