This project is the backend (server side) of an online English learning and testing platform. It’s designed to handle everything behind the scenes: user accounts, test delivery, result tracking, and certificate generation.
I built it to:
- Test and explore modern backend architecture with NestJS and Fastify.
- Create a solid, production-ready base for a real platform.
- Show how to structure a clean, maintainable project for long-term growth.
-
Backend: ~90% complete.
- Fully functional authentication
- Exam question management
- Progress calculation and result storage
- Admin panel API for managing users and certificates
- Email service for OTP verification and notifications
-
Frontend: ~40% complete.
- Already has login, registration, and session handling
- Core structure in place but missing most of the UI for exams and admin features
If someone picks this up, they could connect the existing backend to a finished frontend without starting from scratch.
If you’re hiring, here’s what this project shows about my skills:
-
Planning and Architecture
- I didn’t just write code — I organized it into logical modules so features are easy to add or change later.
- Each feature (auth, exams, certificates) is isolated in its own folder.
-
Security Awareness
- Role-based access (admin, user)
- Token-based authentication (JWT)
- Email verification with OTP
-
Scalability
- Built on NestJS + Fastify for better performance under heavy load.
- Follows a modular structure so new features don’t break existing ones.
-
Real-World Features
- Email integration
- Result tracking & certificates
- Admin tools to manage platform content
Even without deep technical details, here’s the big picture:
- NestJS + Fastify — The main framework and web server
- MongoDB + Mongoose — Database to store users, exams, and results
- JWT Authentication — Secure login sessions
- Nodemailer — Sends OTPs and notifications by email
- Helmet & CORS — Basic security protections
The backend is organized like this:
api-server/
├── auth-guard/ # Security checks for routes
├── decorators/ # Helpers for cleaner code
├── libs/ # Core tools (email, DB connection, env configs)
├── modules/ # Main features
│ ├── authentication
│ ├── tests
│ ├── certificates
│ ├── user
│ └── admin-*
├── schemas/ # Database models
└── main.ts # App starting point
This makes it easy for another developer to find exactly where a feature lives.
For a developer picking this up:
# Install dependencies
npm install
# Start in development mode
npm run start:devThe server will start and connect to MongoDB.
API documentation is auto-generated by NestJS Swagger (available at /docs when running).
If you want to:
- Finish the frontend
- Expand backend features
- Deploy to production
You can fork the repo, make changes, and submit a pull request. I’ve kept the structure clean so onboarding is fast.