Skip to content
RS-W01Websites2025 to presentLive

Al-Baqi Academy

I built a complete learning platform for an Islamic studies academy: courses, quizzes, live classes and payments in one system.

Overview

Al-Baqi Academy is an Islamic studies academy teaching students worldwide, and a brochure site was never going to be enough. Courses had to be sold and delivered, assessments graded, live classes run week after week, and every student's progress tracked through a structured curriculum. That is a learning management system, so that is what I built: a custom Flask application, live at albaqiacademy.com, that runs the whole operation. Enrolment and course payments now go through the platform instead of being handled by hand.

What a student sees

Everything hangs off a member account. Students sign up, sign in, and buy self-paced courses that run from beginner to advanced, priced individually (a typical course is £34.99), or work through the structured diploma track. Quizzes are auto-marked with feedback, and every result lands in that student's personal progress record, which lives on the account, so it follows them across sessions and devices. Weekly live classes run alongside the self-paced material, with replays afterwards, and lessons ship with self-study materials and downloadable resources.

The engineering underneath

The application is a custom Flask app with SQLAlchemy over Postgres. The database happens to be Supabase-hosted, but I deliberately treat it as plain managed Postgres, reached through a standard DATABASE_URL. Authentication is my own code rather than Supabase Auth, which keeps accounts, course access, quiz results and progress together in one relational schema that the application owns, so the rule for who can open which lesson is enforced in exactly one place.

Payments go through Stripe, and payment is what unlocks access: buying a course records the enrolment and opens the content, with no one at the academy processing it by hand. Course media meant large files, so the upload path is built to accept files up to 100MB, which has to be permitted at every layer a request crosses, the Nginx proxy at the front as well as the Flask application behind it.

Running it

In production the app runs as website:app under Gunicorn, with Nginx in front as the reverse proxy, and it was deployed to an IONOS VPS. Behind the public site sits a management backend where the academy manages its own courses, students and content, so the catalogue and the student base grow inside the platform rather than around it.

Al-Baqi Academy shares an architecture family with Noor Al Quloob, another client platform on this board. Both are full-auth, account-based systems with a custom management backend, the same pattern applied to two very different operations: one sells and delivers structured education, the other runs bookings and donations for a charity.

The hardest problem

The hard part was not any single feature, it was making the learning management core agree with itself. Accounts, payments, course access, quiz grading and progress tracking are each manageable alone, but they share state. A completed Stripe payment has to turn into course access instantly, with no manual step in between. A quiz submission has to be marked, given feedback and written into that student's record reliably. And the progress a student sees has to be the same on their phone as on their laptop, because it belongs to the account, not the session. Choosing custom auth over Supabase Auth meant all of that state sits in one Postgres schema under SQLAlchemy, so the rules about who can open which course are enforced in one place. Getting those pieces to agree, with real money moving through Stripe, was the work.

Start a project

Want something built like this?

Everything on this page was designed, built and hosted by one person. Tell me what you need and I reply with scope, cost and timeline, usually within two working days.

Al-Baqi Academy · Raafay Siddiqui Projects