Aharam is a full-stack tuition center management platform for running day-to-day academic operations: student records, attendance, marks, timetables, notices, and reporting. It pairs a Next.js admin and student portal with a Spring Boot API secured with JWT (HttpOnly cookies) and PostgreSQL persistence.
Problem statement: Small and mid-sized tuition centers often rely on spreadsheets and ad hoc messaging. Aharam centralizes student lifecycle data, attendance, and performance in one place so staff can work faster and parents and students get clearer visibility.
- Authentication & roles — Login by email, username, or student ID; JWT sessions; password reset via OTP; SUPER_ADMIN, STAFF, and STUDENT roles.
- Student lifecycle — Registration, search, profile updates, archive/deactivate, and structured student detail views.
- Attendance — Manual marking, QR/session flows, batch and per-student history.
- Marks & grading — Exams, bulk mark entry, analytics, and configurable grade rules.
- Timetable — Staff CRUD for slots plus public read-only timetable endpoints by grade.
- Reporting & PDFs — Dashboard statistics, report summaries, top performers, and student progress PDFs.
- Notifications — Notice board and push token registration for outbound alerts (provider-dependent).
| Layer | Technologies |
|---|---|
| Frontend | Next.js (App Router), React, TypeScript, Tailwind CSS, Axios |
| Backend | Java 17, Spring Boot 3, Spring Security, Spring Data JPA |
| Database | PostgreSQL, Flyway migrations |
| Auth | JWT (HS512), HttpOnly Authorization cookie, role-based access |
aharam/
├── backend/ # Spring Boot API (port 8081 by default)
│ ├── src/main/java/ # Controllers, services, security, domain
│ └── src/main/resources/ # application-*.yml, db/migration (Flyway)
├── frontend/ # Next.js UI (port 3000)
│ ├── app/ # Routes (admin, student, public marketing pages)
│ ├── components/ # Layout, navbar, shared UI
│ ├── lib/ # API client, i18n, helpers
│ └── scripts/ # capture-readme-screenshots.mjs (optional)
└── assets/screenshots/ # README screenshots (login, dashboard, students)
The frontend calls the API via NEXT_PUBLIC_API_URL (defaults to http://127.0.0.1:8081/api). The backend issues the JWT as an HttpOnly cookie named Authorization (Bearer <token>).
| Home | Login | Student management |
|---|---|---|
![]() |
![]() |
![]() |
To regenerate images locally (requires Next.js dev on port 3000 and Microsoft Edge on Windows, or adjust the script to use bundled Chromium):
cd frontend
npm install
npm run dev
# other terminal:
npm run screenshots:readme- Java 17+, Maven 3.9+
- Node.js 18+
- PostgreSQL (create a database and user; default dev config expects a reachable instance)
cd backend
copy .env.example .env
# Set SPRING_DATASOURCE_* and APP_JWT_SECRET (64+ bytes in production)
mvn clean install
mvn spring-boot:runAPI base URL: http://127.0.0.1:8081/api (see server.port in application-dev.yml).
cd frontend
npm install
# Optional: frontend\.env.local → NEXT_PUBLIC_API_URL=http://127.0.0.1:8081/api
npm run devOpen http://localhost:3000.
Add your deployed URL here after hosting (e.g. Vercel + managed PostgreSQL + Spring on a VPS or container). Example: https://your-app.example.com.
Base path: /api (all routes below are prefixed with /api).
| Area | Methods | Path pattern |
|---|---|---|
| Auth | POST | /auth/login, /auth/signup, /auth/logout, /auth/change-password, /auth/forgot-password, /auth/verify-otp, /auth/reset-password |
| Admin | GET | /admin/ping |
| Dashboard | GET | /dashboard/stats |
| Students | GET, POST, PUT, DELETE | /students, /students/register, /students/query, /students/archived, /students/{id}, … |
| Attendance | GET, POST | /attendance/mark, /attendance/mark-manual, /attendance/scan, /attendance/end-session, /attendance/batch/{batch}, /attendance/student/{studentId} |
| Marks | GET, POST | /marks/exams/create, /marks/exams/batch/{batch}, /marks/bulk-save, /marks/student/{studentId}, /marks/analytics/{examId} |
| Reports | GET | /reports/summary, /reports/top-performers |
| Timetable (staff) | GET, POST, PUT, DELETE | /timetable, /timetable/grade/{grade}, /timetable/today/{grade}, /timetable/{id} |
| Timetable (public) | GET | /public/timetable, /public/timetable/grade/{grade}, /public/timetable/today/{grade} |
| Staff | GET, POST, DELETE | /staff, /admin/staff, /staff/send-verification-code, /staff/verify-email-code, /staff/register, /staff/{id} |
| Notifications | GET, POST | /notifications, /notifications/token, /notifications/send |
| Student portal | GET | /student-dashboard/profile, /student-dashboard/attendance, /student-dashboard/marks, /student-dashboard/progress-report/pdf |
Use your OpenAPI or controller package (com.aharam.tuition.controller) as the source of truth for the full contract.
- Security — HttpOnly JWT cookies reduce XSS token theft; pairing with strict CORS and SameSite policies matters for production.
- Schema evolution — Flyway migrations keep PostgreSQL changes repeatable across environments.
- Split UI — Clear separation between marketing pages, staff console, and student portal keeps navigation and RBAC maintainable.
- Hosted demo with CI deploy previews
- Optional SMS/WhatsApp providers behind interfaces already present in the codebase
- Deeper analytics (retention, batch comparisons)
Kiruthiyan — design, backend, frontend, and documentation.
For team projects, add co-authors and a short note per contributor (e.g. “API & DB”, “UI/UX”, “DevOps”).


