# Schoolaris: online tutoring for Moroccan pupils, from collège to the bac

> Schoolaris is an online tutoring platform for Moroccan pupils, from collège to the bac. Pupils learn through recorded video classes for their year and track, live sessions with teachers and an AI tutor, on the web or in the mobile apps. Parents follow each child from their own account and pay the way that suits them.

I build and maintain Schoolaris as full-stack developer at CCL.
Online at https://www.schoolaris.com/fr
Canonical: https://salaheddine-elfatimi.com/projects/schoolaris
Built with: JavaScript, Next.js, React, Tailwind CSS, DaisyUI, next-intl, Bun, Elysia, Auth.js, Prisma, MySQL, Redis, Vercel AI SDK, Claude, Gemini, LiveKit, Stripe, CMI, Resend, Vimeo

## The client

Schoolaris follows the official Moroccan programme and also covers the French school system, so a pupil in a mission school and a pupil in a public lycée each see their own programme. Its catalogue is organised by level and track, the way Moroccan schools are. The interface runs in French, Arabic and English, prices are in dirhams, and its contact address is in Marrakech.

## What they needed

A tutoring platform for Moroccan families has three kinds of users, and each needs something different. Pupils need everything for their year in one place, organised the way their school is. Parents want to see how their child is doing without logging into the child's account. Teachers and staff need to run live classes, confirm payments and follow sales.

Payments and language add their own constraints. Not every family pays by card, so the checkout has to take Moroccan cards, foreign cards and payments made at an agency. And Arabic means a right-to-left layout on every screen, on the website and in the mobile apps.

## What I built

- **Classes built around the school year**: A pupil picks their level and track, for example 2ème année bac sciences physiques, and gets every subject for that year in one class: video lessons to replay, PDFs, quizzes and corrected exercises.
- **Live classes on our own servers**: Live video runs on LiveKit (WebRTC), self-hosted rather than billed per minute. Teachers run sessions from the back office, the class state reaches every pupil instantly through server-sent events, and the recording is there to watch afterwards.
- **An AI tutor with a budget**: The AI tutor guides pupils through an exercise without giving them the answer, and can work from a photo of their notebook. Each pupil has a credit budget so costs stay predictable, and teachers can use AI to turn an outline into chapters, lessons and exercises.
- **A parent space**: A free parent account links to one or more children, through a request rather than silently, and shows their progress, subjects, live classes and payments. Parent and child each keep their own login.
- **Payments that fit Morocco**: One checkout takes Moroccan cards through CMI, foreign cards through Stripe, and payments at partner points, where the family uploads a proof and staff confirm it. Access is sold as subscriptions from one month to the whole school year, with invoices and receipts in the pupil's account.
- **One API for the website, back office and apps**: A Bun and Elysia API is the only piece that talks to MySQL, and it re-reads each user's role on every request, so removing a staff member's access works at once. Schoolaris started with its Next.js apps reading the database directly; moving everything behind the API later was a big migration, so next time I'd build the API first.

## What it lets them do

**Parents follow each child's progress and pay online (Stripe or CMI), teachers run live classes from the back office, and staff handle sales, accounting and revenue in one place.**

Today a pupil has one account for the classes of their year, live sessions with their recordings and the AI tutor, on the web or in the Google Play and App Store apps. Parents follow each child and pay by card or at a partner point. The team runs live classes, payment checks, sales follow-up and accounting from the back office, and the counters on the homepage come straight from the platform's own data instead of being typed in by hand.
