LIVE WEBSITE · RELEASE GATES REMAIN

Ostazi

A bilingual tutoring platform built for Syria, with student, teacher, and admin flows. The public website is live; booking and payment availability are separate release gates.

Next.jsExpressPostgreSQLPrismaCapacitor
Ostazi's source is private. This case study describes the implementation and its limits; a live website does not establish that booking, payment, or lesson delivery is currently open to the public.

01Problem

Finding a suitable private tutor and coordinating lessons through scattered messages leaves students, families, and teachers without a clear shared record of requests and status.

02Why it matters

A structured flow can make tutor discovery and requests clearer, provided identity checks, delivery, local operations, and legal readiness are established before public booking is enabled.

03Solution

The platform includes bilingual interfaces, role-specific student and teacher flows, admin review, request and booking logic, and commission records. These implemented paths should not be read as a claim that public booking or payment is enabled today.

04Architecture

Next.js (Arabic RTL + English, next-intl)
  -> Express/Node API
       - phone + OTP auth (no passwords)
       - teacher verification (PENDING -> VERIFIED/REJECTED/SUSPENDED)
       - booking state machine (REQUESTED -> CONFIRMED -> COMPLETED,
         or CANCELLED/NO_SHOW with actor tracking both sides)
       - commission engine: versioned + snapshotted per booking,
         append-only ledger, teacher risk-tier escalation
       - review/rating system with a flag-and-moderate pipeline
  -> PostgreSQL (Prisma) on Neon; Supabase Storage for media
  -> Web deployed on Vercel; Capacitor mobile wrapper not distributed in app stores

05Technical decisions

Commission is versioned, never mutated. The rate is snapshotted per booking, so a later rate change never silently rewrites historical bookings — the ledger itself is append-only, not a mutable balance field.

Risk-tier escalation actually blocks bookings. A teacher's outstanding debt escalates them through NORMAL to WARNING to RESTRICTED to BLOCKED, and BLOCKED genuinely prevents new bookings — not just a dashboard label.

A real gap was found and fixed during development: originally only teachers could report a student no-show, leaving no way for a student to report that a teacher simply didn't show up. Fixed with a symmetric reporting path for both sides.

06Security

Phone/OTP authentication and role checks are implemented. Delivery of OTP messages to a handset requires separate confirmation; an HTTP success alone is insufficient. Admin enrollment is kept outside public registration. Legal and operational release requirements still need owner review.

07Limitations

08Future improvements