EduTrack is a full-stack Learning Management System built with the PERN stack (PostgreSQL, Express, React, Node.js). It provides a role-based platform for educational institutions to manage subjects, assignments, quizzes, and student performance analytics in one unified system.
The platform administrator with full oversight. Can view and manage all teacher and student accounts, approve or reject teacher registrations, monitor system-wide analytics, track assignment and quiz activity, and disable users when necessary.
An educator who manages academic content. Can create and manage subjects, publish assignments and quizzes, view and grade student submissions, and track individual and class-level performance through charts and reports.
A learner enrolled in the platform. Can view available subjects, submit assignments, attempt timed quizzes, check scores and feedback, view personal achievements, and track progress over time.
- Role-based authentication and protected routes
- Teacher account approval workflow managed by Super Admin
- Subject creation and assignment management
- Timed quiz system with multiple-choice questions
- Assignment submission with text and file URL support
- Manual grading by teachers with marks recorded per submission
- Leaderboard ranking students by combined quiz and assignment scores
- Weekly leaderboard showing top performers for the past seven days
- Analytics dashboards with Chart.js visualizations for each role
- Weekly achievements and progress tracking for students
- User profile management with avatar, bio, and password update
- Pagination and search across user lists (Admin)
- Global and subject-level performance insights
UUIDs are used as primary keys across all tables, generated via the PostgreSQL uuid-ossp extension:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| name | varchar | Full name |
| varchar | Unique | |
| password | varchar | Hashed |
| role | enum | super_admin, teacher, student |
| avatar_url | varchar | Profile image URL |
| bio | text | Short user bio |
| is_approved | boolean | Used for teacher accounts |
| created_at | timestamp | Auto-generated |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| name | varchar | Subject name |
| subject_code | varchar | Unique code |
| teacher_id | uuid | Foreign key to users |
| created_at | timestamp | Auto-generated |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| title | varchar | Assignment title |
| description | text | Instructions |
| subject_id | uuid | Foreign key to subjects |
| teacher_id | uuid | Foreign key to users |
| deadline | timestamp | Due date |
| total_marks | integer | Maximum marks |
| created_at | timestamp | Auto-generated |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| assignment_id | uuid | Foreign key to assignments |
| student_id | uuid | Foreign key to users |
| submission_text | text | Written response |
| file_url | varchar | Attached file link |
| marks | integer | Marks awarded by teacher |
| submitted_at | timestamp | Auto-generated |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| title | varchar | Quiz title |
| subject_id | uuid | Foreign key to subjects |
| teacher_id | uuid | Foreign key to users |
| time_limit | integer | Duration in minutes |
| total_marks | integer | Maximum score |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| quiz_id | uuid | Foreign key to quizzes |
| question | text | Question text |
| option_a | varchar | Choice A |
| option_b | varchar | Choice B |
| option_c | varchar | Choice C |
| option_d | varchar | Choice D |
| correct_answer | char | A, B, C, or D |
| Column | Type | Notes |
|---|---|---|
| id | uuid | Primary key, default uuid_generate_v4() |
| quiz_id | uuid | Foreign key to quizzes |
| student_id | uuid | Foreign key to users |
| score | integer | Score achieved |
| completed_at | timestamp | Auto-generated |
Students are ranked by total points calculated as follows:
total_points = SUM(quiz_attempts.score) + SUM(submissions.marks)
The leaderboard displays rank, student name, avatar, total points, quiz score, and assignment score. A weekly leaderboard filters attempts and submissions from the past seven days to highlight recent top performers.
Each role has a dedicated dashboard with relevant Chart.js visualizations.
Super Admin Dashboard shows total students, total teachers, quiz attempts per week, and assignment submission trends.
Teacher Dashboard shows assignment completion rates, average quiz scores per subject, and top-performing students.
Student Dashboard shows quiz score history over time, weekly achievements, and assignments completed vs pending.
- A teacher registers on the platform
- The Super Admin reviews and approves the teacher account
- The approved teacher creates one or more subjects
- The teacher publishes assignments and quizzes under those subjects
- Students view available subjects and complete assignments and quizzes
- The system updates scores, analytics, leaderboards, and achievements automatically
| Layer | Technology |
|---|---|
| Frontend | React, Chart.js, Tailwind CSS |
| Backend | Node.js, Express.js |
| Database | PostgreSQL |
| Authentication | JWT, bcrypt |
| Runtime | Bun |
# Clone the repository
git clone https://github.com/kaibad/edutrack.git
# Navigate into the project directory
cd edutrack
# Install server dependencies
cd server
bun install
# Install client dependencies
cd ../client
bun install
# Set up environment variables
# Create a .env file in the server directory and add your PostgreSQL connection string, JWT secret, and port
# Start the backend server
cd ../server
bun dev
# Start the frontend in a new terminal
cd ../client
bun devThe backend will run on http://localhost:5000 and the frontend on http://localhost:5173 by default.