Back to Portfolio
Solo Fullstack DeveloperLive · Maintaining · 11+ usersDec 2024 – Mar 2025 · Maintaining

Tutor Pro

“Built by a tutor, for tutors. A full-stack production system that automates every operational burden.”

Next.js 15Spring Boot 3.4 (Java 21)React 19TypeScript 5Tailwind CSS 4Shadcn/UITanStack Query v5ZustandFramer Motion@dnd-kitReact Hook FormZodSpring Boot 3.4Java 21JPA/HibernateMySQL 8Caffeine CacheSpring EventsJasperReportsBucket4jGroq AI (Llama 3.3 70B)VietQR/NAPAS-247WebRTCSTOMP WebSocketDocker ComposeRailwayVercelCloudinary

Overview

Most tutors juggle spreadsheets, messaging apps, and manual bank transfers to run their classes. Tutor Pro replaces all of that with a single cohesive platform: automated scheduling, real-time notifications, live WebRTC teaching rooms, AI-generated feedback, and financial-grade invoicing — deployed and running in production. This is not a tutorial project. It solves real problems I faced as a part-time tutor, built to a standard I'd be comfortable deploying for other tutors to use.

Engineering Highlights

High-Performance Bulk Calendar Engine

#1High-Performance Bulk Calendar Engine

Problem

Initializing an entire month of sessions for 30+ students one-by-one is unusable in practice.

Solution

Optimistic Batch Processing with In-Memory Deduplication (O(1) conflict detection), Single-Pass Database Query, and JDBC Batch Inserts for transactional integrity.

Result

300+ sessions generated across a full student roster in < 800ms.

Event-Driven Real-Time Notifications

#2Event-Driven Real-Time Notifications

Problem

Students need to know instantly when a session is rescheduled, a grade is posted, or an exam is assigned — without polling.

Solution

Server-Sent Events over Spring Application Events. SseEmittersManager maintains a thread-safe ConcurrentHashMap of emitters per user, with a heartbeat protocol to survive Docker/proxy connection drops and auto-reconnect on the client.

Result

End-to-end delivery in < 500ms. idx_recipient_read index keeps unread-count queries at < 10ms regardless of volume.

AI Feedback Engine (Groq + Llama 3.3 70B)

#3AI Feedback Engine (Groq + Llama 3.3 70B)

Problem

Writing individualized, contextually appropriate feedback in Vietnamese for every student after every class is time-consuming and repetitive.

Solution

Groq's inference API with prompt engineering that enforces Vietnamese tone, cultural context, and length constraints based on the student's performance data passed in at runtime.

Result

Context-aware, culturally appropriate Vietnamese feedback in < 300ms — replacing static templates with genuine intelligence.

Financial-Grade VietQR Invoicing

#4Financial-Grade VietQR Invoicing

Problem

Manual payment tracking creates reconciliation errors and time spent chasing parents for confirmation.

Solution

Dynamic VietQR generation embedded directly in PDF invoices, built to the NAPAS-247 standard. CRC-16 checksum validation ensures transaction data integrity end-to-end.

Result

100% automated reconciliation flow. Error rate reduced from ~15% to near zero.

Interactive Live Teaching Room (WebRTC + WebSocket)

#5Interactive Live Teaching Room (WebRTC + WebSocket)

Problem

Teaching online requires more than video — synchronized whiteboard, session recording, and graceful hardware fallback.

Solution

Full-Mesh WebRTC for P2P media (server never touches the video stream). STOMP over WebSocket for state sync. Whiteboard throttled at 50ms cuts congestion 80%. Media Access Guard catches NotReadableError and surfaces human-readable guidance. Composite Stream Recording merges screen, webcam, and audio into a single .webm — entirely in-browser.

Result

< 200ms interactive latency. One-click recording. No crash on hardware conflicts.

Drag-and-Drop Calendar with Prefetching

#6Drag-and-Drop Calendar with Prefetching

Problem

Calendar UIs feel slow when navigating months, and drag interactions drop frames on re-renders.

Solution

@dnd-kit with Optimistic Rollback. React.memo + useCallback eliminate 95% of unnecessary re-renders. Adjacent months prefetched automatically on load.

Result

Month navigation instant (~0ms). Drag interactions at 60fps.

Intelligent Assessment & Auto-Grading

#7Intelligent Assessment & Auto-Grading

Problem

Digitizing exam questions from Word/PDF is tedious. Exam data loss from browser crashes or accidental navigation is unacceptable.

Solution

ExerciseParserService uses a Hybrid Regex Parsing Engine to bulk-ingest MCQ and Essay questions from plain text. Exam Player implements debounced auto-save (~500ms), timer sync, and auto-submit on expiry — fault-tolerant by design.

Result

Question digitization time reduced by 90%. Zero data loss architecture.

Performance Benchmarks

Measured in production against real usage:

ModuleMetricBeforeAfter
CalendarInitial load~1.8s< 0.8s
CalendarMonth navigation~500ms~0ms
FinancePage load~2.5s< 0.8s
FinanceData consistencyDesync issues100% accurate
LearningLesson detail query3 queries (N+1)1 query
NotificationsDelivery latency—< 500ms
Bulk Calendar300+ session init—< 800ms

Architecture Decisions

Three choices that shaped every other decision in the codebase.

Modular Monolith over Microservices

✓ Chosen
Single deployable unit with clear module boundaries
✗ Rejected
Microservices from day 1

Why: Solo project — microservices would mean 10× the DevOps overhead with no team to justify it. Clear module boundaries make extraction straightforward if scale ever demands it.

SSE over WebSocket for notifications

✓ Chosen
Server-Sent Events (SSE)
✗ Rejected
WebSocket for all real-time

Why: Notifications flow in one direction. SSE is HTTP-native, proxy-transparent, and requires no handshake upgrade. WebSocket is reserved for the live room where true bidirectionality is actually needed.

React Query over Redux

✓ Chosen
TanStack Query v5
✗ Rejected
Redux Toolkit

Why: All async state is server state. React Query's stale-while-revalidate, optimistic updates, and cache invalidation handle this natively. Redux would be ceremonial overhead with no real benefit.

Security

Defense-in-depth across every layer:

Authentication

JWT + Refresh Token via HttpOnly cookies

Authorization

Dynamic RBAC — RoleEntity + Permission enum, @PreAuthorize per endpoint

Rate Limiting

Bucket4j on login and session creation endpoints

Input Validation

Zod (frontend) + Jakarta Validation (backend)

Roadmap

Q2 2026
  • Multi-tenancy — expand to support multiple tutors (SaaS model)
  • Bank API integration — auto-confirm payments when funds arrive
Q3 2026
  • Zalo/Telegram bot for automated debt reminders
  • Learning analytics dashboard with progress trend prediction