Dafaa — Arabic-first multi-tenant tutoring SaaS
A platform that lets Egyptian private tutors run their own online course business: their own subdomain, their own students, their own pricing — Arabic-first, RTL throughout.

The problem
Egyptian private tutors run real businesses — hundreds of students, year-long curriculum trees, real money moving every month. The tools they had were the wrong shape: English-first LMSes built for one organization per workspace, or generic course platforms that don't understand the Egyptian education system.
Dafaa solves this with a multi-tenant SaaS where each teacher gets an isolated workspace on their own subdomain. They run their own pricing, manage their own student wallets, and sell whatever slice of content makes sense — from a whole course down to a single lesson.
What I optimized for
- Arabic-first, RTL only. Every visible string is translatable, every layout is logical-direction-aware. RTL isn't an afterthought.
- Tenant safety as a default. A teacher's data stays invisible to every other teacher even if my application code has bugs.
- Money done right. Real wallets, top-ups, refunds — numerics handled where they belong, not where they're convenient.
- Video without bandwidth costs. Couldn't self-host — would have killed margins. Built around external video the teacher owns, with access still gated by my system.
The shape of the work
The interesting parts were the unsexy parts. Designing a content tree where teachers can sell at different granularities without the data model exploding. Modeling the Egyptian education system honestly — two parallel school systems, multiple stages, tracks at certain stages, the whole grades/subjects matrix. Writing the kind of tests that fail fast when humans break invariants, because humans always break invariants.
The platform handles four distinct user roles, per-teacher wallets that scale, real-time content publishing, timed online assessments with grading queues, prerequisite locks across content, and a teacher subscription tier that gates premium features.
By the numbers
What surprised me
How much weight a database can carry when you let it. Pushing constraints down the stack made the application code dramatically simpler — handlers couldn't accidentally do the wrong thing, because the system below them refused to let them.
What I'd do differently
Smaller things. A few conventions I wish I'd locked in earlier. A couple of naming decisions that came back to bite me. The fundamentals I'd keep — they've held up under real use.
Want something built like this?
Book a 15-min call →