0%
Aymen
Back to Works
WebShipped2026

Vocadia

E-learning platform — course authoring, enrolment and progress tracking, built on a domain-driven backend with fine-grained permissions.

My Role
Full Stack Developer
Timeline
Oct 2025 — Aug 2026
Status
Shipped
Vocadia
Overview

Vocadia is an e-learning platform where teachers create and publish courses, students enrol and work through them, and both sides can meet in live classroom rooms. Enrolment state and per-student progress are tracked server-side, and every action is gated by fine-grained, role-aware permissions.

The codebase is a monorepo: a Fastify backend organised with domain-driven design and CQRS — commands and queries handled separately per bounded context — with Drizzle for typed database access and Casbin as the authorization engine. The web client is React on Vite. The whole stack ships to DigitalOcean through a full CI/CD pipeline.

The Challenge

The problem to solve

An e-learning platform mixes several kinds of state that age differently: course content that teachers author and revise, enrolment and progress records that must stay consistent per student, and live classroom sessions that exist only while people are in the room. On top of that, teachers and students need different rights over the same resources — hard-coded role checks in every route would have rotted quickly as the permission matrix grew.

The Solution

How it was built

The backend isolates each concern as a domain module behind a CQRS split: writes go through commands that enforce domain invariants, reads through query handlers shaped for the client. Authorization is not scattered through handlers — Casbin evaluates policies centrally, so adding or tightening a permission is a policy change, not a code hunt. Drizzle keeps the schema and queries typed end to end.

The React + Vite client consumes this API for authoring, enrolment and progress views, and hosts the live classroom rooms for teachers and students. Deployment is fully automated: the monorepo builds through CI/CD and lands on DigitalOcean.

Key Features

What it does

📚

Course authoring

Teachers create, structure and publish their courses directly on the platform.

🎓

Enrolment and progress

Students enrol in courses and their advancement is tracked server-side, per student and per course.

🎥

Live classroom rooms

Real-time rooms where teachers and students meet for live sessions, alongside the self-paced course material.

🛡️

Policy-based permissions

Casbin evaluates every action against central authorization policies, so each role gets exactly the rights it needs — no scattered role checks.

🚀

CI/CD to DigitalOcean

The monorepo is built and shipped to DigitalOcean through a complete CI/CD pipeline — no manual deployment steps.

Technologies Used

Built with

Frontend

React.js

React drives both sides of the client — the form-heavy authoring and progress views and the stateful live classroom rooms — from one component model, with Vite keeping the dev loop fast.

TypeScript

One language and one type system across the monorepo: domain models, Drizzle schemas and API contracts stay in sync between the Fastify server and the React client.

Backend

Fastify

Fastify's plugin encapsulation maps cleanly onto the DDD module boundaries — each bounded context registers its own routes, commands and queries — while keeping the API layer fast and thin.

Data

PostgreSQL

Courses, enrolments and progress records are relational by nature; PostgreSQL enforces that integrity with constraints and transactions, and Drizzle exposes it as a typed schema.

Infrastructure

Docker

Containers make the CI/CD pipeline reproducible: the same images that pass the build are what run on the DigitalOcean host, so deploys do not depend on server state.