SimpliTutor is an operations platform for tutoring businesses. Session scheduling, student management, billing, and analytics—all in one place.
- Interactive calendar with double-booking prevention
- Session lifecycle tracking with tutor verification workflows
- Automated session reminders via scheduled emails
- Parent invoicing with Stripe payment links
- Monthly tutor payroll aggregation and tracking
- Real-time sync across all connected clients
- Role-based access (RBAC)
- At-risk student detection based on inactivity thresholds
- Session notes with parent email delivery
| Frontend | Backend | Infrastructure |
|---|---|---|
| React 19 + TypeScript | Node.js + Express | Supabase (PostgreSQL) |
| Redux Toolkit + Redux Persist | Socket.IO | Firebase Auth |
| Tailwind CSS 4 + shadcn/ui | Prisma ORM | Stripe |
| React Hook Form + Zod | Nodemailer + node-cron | Sentry (client + server) |
| Recharts + TanStack Table | Pino logging | Firebase Hosting + Heroku |
┌─────────────────────────────────────────────────────────┐
│ Client (React SPA on Firebase Hosting) │
│ │
│ Redux Store ◄── Socket.IO ◄──────────────────────┐ │
│ │ │ │
│ └── REST API (token + uid headers) ──────┐ │ │
└────────────────────────────────────────────────┼──┼─────┘
│ │
HTTP │ │ WebSocket
▼ │
┌────────────────────────────────────────────────────────┐
│ Server (Express on Heroku) │
│ │
│ Firebase Admin ──► authorize() middleware │
│ (JWT verify + role check) │ │
│ ▼ │
│ Route handlers ──► Prisma ORM ──► PostgreSQL │
│ (Supabase) │
│ │
│ Sentry ◄── Pino logger ◄── all errors/requests │
│ Nodemailer + node-cron ◄── email & reminders │
│ Stripe webhooks ◄── payment events │
└────────────────────────────────────────────────────────┘
Real-time sync: Socket.IO broadcasts domain events (students, sessions, users, subjects, settings) to all connected clients. Each event triggers a scoped data refresh via RefreshFactory, so the UI stays in sync without a full reload.
Authentication: Firebase Auth issues JWTs on the client. Every API request includes the token and Firebase UID in headers. The server's authorize() middleware verifies the JWT with Firebase Admin SDK, looks up the user's role in Supabase, and rejects requests that don't match the required role — before any handler logic runs.
Observability: Pino handles structured JSON request logging on the server. Sentry captures unhandled exceptions on both client (with session replay) and server (with full request traces).
private



