Multi-tenant school management SaaS. Every school gets its own subdomain (springfield.eduflow.app) and isolated data via schoolId on every row.
| Layer | Tech |
|---|---|
| API | NestJS 11 · Prisma 5 · Postgres · Socket.IO · Cloudinary · Nodemailer |
| Web | Next.js 16 · React 19 · Tailwind v4 (light theme) · Recharts · Leaflet |
| Mobile | Expo 52 · React Native · React Navigation v7 |
- Auth & onboarding — register school, email+password, OTP for parents
- Class & section management — bulk import, transfers, class-teacher assignment
- Attendance — chip-based roll call, leave applications, auto-fanout to parents
- Marks & report cards — exams, publish, printable PDF report cards
- Class wall — homework, notices, events, file attachments, reactions, pins
- Chat — Socket.IO real-time class groups + DMs
- Timetable — weekly grid + cross-section conflict detection + substitutions
- Homework/assignments — submit, grade, basic plagiarism flag
- Notifications — inbox + broadcasts + preferences
- Reports & analytics — attendance trend, marks averages, at-risk students
- Fees — structures auto-fanned out per student, partial payments, reminders
- Admin settings — users, subjects, audit log, school profile
pnpm install
pnpm docker:up
pnpm prisma:migrate
pnpm prisma:seed # creates Springfield + admin@springfield.eduflow.local / admin123
pnpm dev # api:4001 web:3001 mobile via Expo QR- Web: http://localhost:3001
- API: http://localhost:4001 (Swagger at
/docs)
See DEPLOY.md for the full GitHub → Render → Vercel walkthrough, including:
- Email provider setup (Resend / Gmail / SendGrid / Brevo)
- Cloudinary keys
- Wildcard subdomain DNS for true multi-tenancy
- Optional Expo build for mobile
pnpm --filter api test:e2eCI runs the same tests on every push — see .github/workflows/ci.yml.